Skip to content

Commit e85d966

Browse files
authored
Merge pull request #13778 from SORMAS-Foundation/bugfix-13711-type_of_contact_checkboxes
#13711 - Fixed type of contact checkboxes to allow multiple selections
2 parents 9b58aa3 + 1da6be1 commit e85d966

File tree

29 files changed

+700
-268
lines changed

29 files changed

+700
-268
lines changed

sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactDto.java

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_BIG;
2121

2222
import java.util.Date;
23+
import java.util.HashSet;
24+
import java.util.Set;
2325

2426
import javax.validation.Valid;
2527
import javax.validation.constraints.Max;
@@ -82,7 +84,7 @@ public class ContactDto extends SormasToSormasShareableDto implements IsContact
8284
public static final String CONTACT_IDENTIFICATION_SOURCE = "contactIdentificationSource";
8385
public static final String CONTACT_IDENTIFICATION_SOURCE_DETAILS = "contactIdentificationSourceDetails";
8486
public static final String CONTACT_OFFICER = "contactOfficer";
85-
public static final String CONTACT_PROXIMITY = "contactProximity";
87+
public static final String CONTACT_PROXIMITIES = "contactProximities";
8688
public static final String CONTACT_PROXIMITY_DETAILS = "contactProximityDetails";
8789
public static final String CONTACT_STATUS = "contactStatus";
8890
public static final String DESCRIPTION = "description";
@@ -208,7 +210,7 @@ public class ContactDto extends SormasToSormasShareableDto implements IsContact
208210
@SensitiveData
209211
@Size(max = FieldConstraints.CHARACTER_LIMIT_DEFAULT, message = Validations.textTooLong)
210212
private String tracingAppDetails;
211-
private ContactProximity contactProximity;
213+
private Set<ContactProximity> contactProximities;
212214
@HideForCountriesExcept
213215
@SensitiveData
214216
@Size(max = FieldConstraints.CHARACTER_LIMIT_DEFAULT, message = Validations.textTooLong)
@@ -219,15 +221,19 @@ public class ContactDto extends SormasToSormasShareableDto implements IsContact
219221
private ContactCategory contactCategory;
220222
private ContactClassification contactClassification;
221223
private ContactStatus contactStatus;
222-
@Diseases(value = {Disease.INVASIVE_MENINGOCOCCAL_INFECTION}, hide = true)
224+
@Diseases(value = {
225+
Disease.INVASIVE_MENINGOCOCCAL_INFECTION }, hide = true)
223226
private FollowUpStatus followUpStatus;
224227
@SensitiveData
225228
@Size(max = CHARACTER_LIMIT_BIG, message = Validations.textTooLong)
226-
@Diseases(value = {Disease.INVASIVE_MENINGOCOCCAL_INFECTION}, hide = true)
229+
@Diseases(value = {
230+
Disease.INVASIVE_MENINGOCOCCAL_INFECTION }, hide = true)
227231
private String followUpComment;
228-
@Diseases(value = {Disease.INVASIVE_MENINGOCOCCAL_INFECTION}, hide = true)
232+
@Diseases(value = {
233+
Disease.INVASIVE_MENINGOCOCCAL_INFECTION }, hide = true)
229234
private Date followUpUntil;
230-
@Diseases(value = {Disease.INVASIVE_MENINGOCOCCAL_INFECTION}, hide = true)
235+
@Diseases(value = {
236+
Disease.INVASIVE_MENINGOCOCCAL_INFECTION }, hide = true)
231237
private boolean overwriteFollowUpUntil;
232238
@SensitiveData
233239
@Size(max = CHARACTER_LIMIT_BIG, message = Validations.textTooLong)
@@ -370,11 +376,15 @@ public class ContactDto extends SormasToSormasShareableDto implements IsContact
370376
@Outbreaks
371377
private VaccinationStatus vaccinationStatus;
372378

373-
@Diseases(value = {Disease.MEASLES})
374-
@HideForCountriesExcept(countries = {COUNTRY_CODE_LUXEMBOURG})
379+
@Diseases(value = {
380+
Disease.MEASLES })
381+
@HideForCountriesExcept(countries = {
382+
COUNTRY_CODE_LUXEMBOURG })
375383
private Date vaccinationDoseOneDate;
376-
@Diseases(value = {Disease.MEASLES})
377-
@HideForCountriesExcept(countries = {COUNTRY_CODE_LUXEMBOURG})
384+
@Diseases(value = {
385+
Disease.MEASLES })
386+
@HideForCountriesExcept(countries = {
387+
COUNTRY_CODE_LUXEMBOURG })
378388
private Date vaccinationDoseTwoDate;
379389

380390
private Date previousQuarantineTo;
@@ -385,23 +395,30 @@ public class ContactDto extends SormasToSormasShareableDto implements IsContact
385395
private DeletionReason deletionReason;
386396
@Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong)
387397
private String otherDeletionReason;
388-
@HideForCountriesExcept(countries = {COUNTRY_CODE_LUXEMBOURG})
398+
@HideForCountriesExcept(countries = {
399+
COUNTRY_CODE_LUXEMBOURG })
389400
@SensitiveData
390401
@Diseases(Disease.INVASIVE_MENINGOCOCCAL_INFECTION)
391402
private Boolean prophylaxisPrescribed;
392-
@HideForCountriesExcept(countries = {COUNTRY_CODE_LUXEMBOURG})
403+
@HideForCountriesExcept(countries = {
404+
COUNTRY_CODE_LUXEMBOURG })
393405
@SensitiveData
394406
@Diseases(Disease.INVASIVE_MENINGOCOCCAL_INFECTION)
395407
private Drug prescribedDrug;
396-
@HideForCountriesExcept(countries = {COUNTRY_CODE_LUXEMBOURG})
408+
@HideForCountriesExcept(countries = {
409+
COUNTRY_CODE_LUXEMBOURG })
397410
@SensitiveData
398411
@Diseases(Disease.INVASIVE_MENINGOCOCCAL_INFECTION)
399412
private String prescribedDrugText;
400-
@Diseases(value = {Disease.MEASLES})
401-
@HideForCountriesExcept(countries = {COUNTRY_CODE_LUXEMBOURG})
413+
@Diseases(value = {
414+
Disease.MEASLES })
415+
@HideForCountriesExcept(countries = {
416+
COUNTRY_CODE_LUXEMBOURG })
402417
private boolean vaccinationProposed;
403-
@Diseases(value = {Disease.MEASLES})
404-
@HideForCountriesExcept(countries = {COUNTRY_CODE_LUXEMBOURG})
418+
@Diseases(value = {
419+
Disease.MEASLES })
420+
@HideForCountriesExcept(countries = {
421+
COUNTRY_CODE_LUXEMBOURG })
405422
private boolean immuneGlobulinProposed;
406423

407424
public static ContactDto build() {
@@ -543,12 +560,15 @@ public void setTracingAppDetails(String tracingAppDetails) {
543560
this.tracingAppDetails = tracingAppDetails;
544561
}
545562

546-
public ContactProximity getContactProximity() {
547-
return contactProximity;
563+
public Set<ContactProximity> getContactProximities() {
564+
if (contactProximities == null) {
565+
contactProximities = new HashSet<>();
566+
}
567+
return contactProximities;
548568
}
549569

550-
public void setContactProximity(ContactProximity contactProximity) {
551-
this.contactProximity = contactProximity;
570+
public void setContactProximities(Set<ContactProximity> contactProximities) {
571+
this.contactProximities = contactProximities;
552572
}
553573

554574
public String getDescription() {

sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactExportDto.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public class ContactExportDto extends AbstractUuidDto implements IsContact {
120120
private TracingApp tracingApp;
121121
@SensitiveData
122122
private String tracingAppDetails;
123-
private ContactProximity contactProximity;
123+
private Set<ContactProximity> contactProximities;
124124
private ContactStatus contactStatus;
125125
private Float completeness;
126126
private FollowUpStatus followUpStatus;
@@ -247,13 +247,17 @@ public class ContactExportDto extends AbstractUuidDto implements IsContact {
247247
private Boolean isInJurisdiction;
248248

249249
//@formatter:off
250+
/**
251+
* Constructor for JPA queries where contactProximities cannot be directly selected (ElementCollection limitation).
252+
* ContactProximities should be populated separately after query execution.
253+
*/
250254
public ContactExportDto(long id, long personId, String uuid, String sourceCaseUuid, CaseClassification caseClassification, Disease disease, String diseaseDetails,
251255
ContactClassification contactClassification, Boolean multiDayContact, Date firstContactDate, Date lastContactDate, Date creationDate,
252256
String personUuid, String firstName, String lastName, String nationalHealthId,
253257
Salutation salutation, String otherSalutation, Sex sex,
254258
Integer birthdateDD, Integer birthdateMM, Integer birthdateYYYY,
255259
Integer approximateAge, ApproximateAgeType approximateAgeType, Date reportDate, ContactIdentificationSource contactIdentificationSource,
256-
String contactIdentificationSourceDetails, TracingApp tracingApp, String tracingAppDetails, ContactProximity contactProximity,
260+
String contactIdentificationSourceDetails, TracingApp tracingApp, String tracingAppDetails, Long contactIdPlaceholder,
257261
ContactStatus contactStatus, Float completeness, FollowUpStatus followUpStatus, Date followUpUntil,
258262
QuarantineType quarantine, String quarantineTypeDetails, Date quarantineFrom, Date quarantineTo, String quarantineHelpNeeded,
259263
boolean quarantineOrderedVerbally, boolean quarantineOrderedOfficialDocument, Date quarantineOrderedVerballyDate, Date quarantineOrderedOfficialDocumentDate,
@@ -301,7 +305,7 @@ public ContactExportDto(long id, long personId, String uuid, String sourceCaseUu
301305
this.contactIdentificationSourceDetails = contactIdentificationSourceDetails;
302306
this.tracingApp = tracingApp;
303307
this.tracingAppDetails = tracingAppDetails;
304-
this.contactProximity = contactProximity;
308+
// contactProximities intentionally not set here - populated separately after query
305309
this.contactStatus = contactStatus;
306310
this.completeness = completeness;
307311
this.followUpStatus = followUpStatus;
@@ -603,10 +607,10 @@ public String getTracingAppDetails() {
603607
}
604608

605609
@Order(28)
606-
@ExportProperty(ContactDto.CONTACT_PROXIMITY)
610+
@ExportProperty(ContactDto.CONTACT_PROXIMITIES)
607611
@ExportGroup(ExportGroupType.CORE)
608-
public ContactProximity getContactProximity() {
609-
return contactProximity;
612+
public Set<ContactProximity> getContactProximities() {
613+
return contactProximities;
610614
}
611615

612616
@Order(29)
@@ -1368,8 +1372,8 @@ public void setTracingAppDetails(String tracingAppDetails) {
13681372
this.tracingAppDetails = tracingAppDetails;
13691373
}
13701374

1371-
public void setContactProximity(ContactProximity contactProximity) {
1372-
this.contactProximity = contactProximity;
1375+
public void setContactProximities(Set<ContactProximity> contactProximities) {
1376+
this.contactProximities = contactProximities;
13731377
}
13741378

13751379
public void setContactStatus(ContactStatus contactStatus) {

sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactIndexDetailedDto.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public ContactIndexDetailedDto(String uuid, String personUuid, String nationalHe
6565
String cazeUuid,
6666
Disease disease, String diseaseDetails, String caseFirstName, String caseLastName, String regionName,
6767
String districtName, Date lastContactDate, ContactCategory contactCategory,
68-
ContactProximity contactProximity, ContactClassification contactClassification, ContactStatus contactStatus, Float completeness,
68+
Long id, ContactClassification contactClassification, ContactStatus contactStatus, Float completeness,
6969
FollowUpStatus followUpStatus, Date followUpUntil, SymptomJournalStatus symptomJournalStatus, VaccinationStatus vaccinationStatus, String contactOfficerUuid, String reportingUserUuid, Date reportDateTime,
7070
CaseClassification caseClassification,
7171
String caseRegionName,
@@ -81,7 +81,7 @@ public ContactIndexDetailedDto(String uuid, String personUuid, String nationalHe
8181

8282
//@formatter:off
8383
super(uuid, personUuid, nationalHealthId, personFirstName, personLastName, cazeUuid, disease, diseaseDetails, caseFirstName, caseLastName,
84-
regionName, districtName, lastContactDate, contactCategory, contactProximity, contactClassification, contactStatus,
84+
regionName, districtName, lastContactDate, contactCategory, id, contactClassification, contactStatus,
8585
completeness, followUpStatus, followUpUntil, symptomJournalStatus, vaccinationStatus, contactOfficerUuid, reportingUserUuid, reportDateTime, caseClassification,
8686
caseRegionName, caseDistrictName, changeDate, externalID, externalToken, internalToken, caseReferenceNumber, deletionReason, otherDeleteReason,isInJurisdiction, isCaseInJurisdiction , visitCount,
8787
prophylaxisPrescribed, prescribedDrug, prescribedDrugText);

sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactIndexDto.java

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@
1717
*******************************************************************************/
1818
package de.symeda.sormas.api.contact;
1919

20-
import java.io.Serializable;
21-
import java.util.Date;
22-
2320
import de.symeda.sormas.api.Disease;
2421
import de.symeda.sormas.api.caze.CaseClassification;
2522
import de.symeda.sormas.api.caze.CaseReferenceDto;
@@ -31,6 +28,10 @@
3128
import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto;
3229
import de.symeda.sormas.api.uuid.HasUuid;
3330

31+
import java.io.Serializable;
32+
import java.util.Date;
33+
import java.util.Set;
34+
3435
public class ContactIndexDto extends PseudonymizableIndexDto implements IsContact, HasUuid, Serializable, Cloneable {
3536

3637
private static final long serialVersionUID = 7511900591141885152L;
@@ -46,7 +47,7 @@ public class ContactIndexDto extends PseudonymizableIndexDto implements IsContac
4647
public static final String CAZE = "caze";
4748
public static final String DISEASE = "disease";
4849
public static final String LAST_CONTACT_DATE = "lastContactDate";
49-
public static final String CONTACT_PROXIMITY = "contactProximity";
50+
public static final String CONTACT_PROXIMITIES = "contactProximities";
5051
public static final String CONTACT_CLASSIFICATION = "contactClassification";
5152
public static final String CONTACT_STATUS = "contactStatus";
5253
public static final String FOLLOW_UP_STATUS = "followUpStatus";
@@ -78,7 +79,7 @@ public class ContactIndexDto extends PseudonymizableIndexDto implements IsContac
7879
private Disease disease;
7980
private String diseaseDetails;
8081
private Date lastContactDate;
81-
private ContactProximity contactProximity;
82+
private Set<ContactProximity> contactProximities;
8283
private ContactClassification contactClassification;
8384
private ContactStatus contactStatus;
8485
private Float completeness;
@@ -109,12 +110,17 @@ public class ContactIndexDto extends PseudonymizableIndexDto implements IsContac
109110
private String prescribedDrugText;
110111

111112
private ContactJurisdictionFlagsDto contactJurisdictionFlagsDto;
113+
private Long id;
112114

113115
//@formatter:off
116+
/**
117+
* Constructor for JPA queries where contactProximities cannot be directly selected (ElementCollection limitation).
118+
* ContactProximities should be populated separately after query execution using the id field.
119+
*/
114120
public ContactIndexDto(String uuid, String personUuid, String nationalHealthId, String personFirstName, String personLastName, String cazeUuid,
115121
Disease disease, String diseaseDetails, String caseFirstName, String caseLastName, String regionName,
116122
String districtName, Date lastContactDate, ContactCategory contactCategory,
117-
ContactProximity contactProximity, ContactClassification contactClassification, ContactStatus contactStatus, Float completeness,
123+
Long id, ContactClassification contactClassification, ContactStatus contactStatus, Float completeness,
118124
FollowUpStatus followUpStatus, Date followUpUntil, SymptomJournalStatus symptomJournalStatus, VaccinationStatus vaccinationStatus, String contactOfficerUuid,
119125
String reportingUserUuid, Date reportDateTime,
120126
CaseClassification caseClassification, String caseRegionName, String caseDistrictName,
@@ -138,7 +144,7 @@ public ContactIndexDto(String uuid, String personUuid, String nationalHealthId,
138144
this.diseaseDetails = diseaseDetails;
139145
this.lastContactDate = lastContactDate;
140146
this.contactCategory = contactCategory;
141-
this.contactProximity = contactProximity;
147+
this.id = id;
142148
this.contactClassification = contactClassification;
143149
this.contactStatus = contactStatus;
144150
this.completeness = completeness;
@@ -232,12 +238,12 @@ public void setLastContactDate(Date lastContactDate) {
232238
this.lastContactDate = lastContactDate;
233239
}
234240

235-
public ContactProximity getContactProximity() {
236-
return contactProximity;
241+
public Set<ContactProximity> getContactProximities() {
242+
return contactProximities;
237243
}
238244

239-
public void setContactProximity(ContactProximity contactProximity) {
240-
this.contactProximity = contactProximity;
245+
public void setContactProximities(Set<ContactProximity> contactProximities) {
246+
this.contactProximities = contactProximities;
241247
}
242248

243249
public ContactClassification getContactClassification() {
@@ -464,6 +470,14 @@ public void setPrescribedDrugText(String prescribedDrugText) {
464470
this.prescribedDrugText = prescribedDrugText;
465471
}
466472

473+
public Long getId() {
474+
return id;
475+
}
476+
477+
public void setId(Long id) {
478+
this.id = id;
479+
}
480+
467481
@Override
468482
public Object clone() throws CloneNotSupportedException {
469483
return super.clone();

sormas-api/src/main/java/de/symeda/sormas/api/contact/SimilarContactDto.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.Serializable;
44
import java.util.Date;
5+
import java.util.Set;
56

67
import de.symeda.sormas.api.caze.CaseReferenceDto;
78
import de.symeda.sormas.api.utils.EmbeddedPersonalData;
@@ -20,7 +21,7 @@ public class SimilarContactDto extends PseudonymizableIndexDto implements IsCont
2021
public static final String CASE_ID_EXTERNAL_SYSTEM = "caseIdExternalSystem";
2122
public static final String CAZE = "caze";
2223
public static final String LAST_CONTACT_DATE = "lastContactDate";
23-
public static final String CONTACT_PROXIMITY = "contactProximity";
24+
public static final String CONTACT_PROXIMITIES = "contactProximities";
2425
public static final String CONTACT_CLASSIFICATION = "contactClassification";
2526
public static final String CONTACT_STATUS = "contactStatus";
2627
public static final String FOLLOW_UP_STATUS = "followUpStatus";
@@ -33,16 +34,17 @@ public class SimilarContactDto extends PseudonymizableIndexDto implements IsCont
3334
private CaseReferenceDto caze;
3435
private String caseIdExternalSystem;
3536
private Date lastContactDate;
36-
private ContactProximity contactProximity;
37+
private Set<ContactProximity> contactProximities;
3738
private ContactClassification contactClassification;
3839
private ContactStatus contactStatus;
3940
private FollowUpStatus followUpStatus;
4041
private ContactJurisdictionFlagsDto contactJurisdictionFlagsDto;
42+
private Long id;
4143

4244
//@formatter:off
4345
public SimilarContactDto(String firstName, String lastName, String uuid,
4446
String cazeUuid, String caseFirstName, String caseLastName, String caseIdExternalSystem,
45-
Date lastContactDate, ContactProximity contactProximity, ContactClassification contactClassification,
47+
Date lastContactDate, Long id, ContactClassification contactClassification,
4648
ContactStatus contactStatus, FollowUpStatus followUpStatus, boolean isInJurisdiction, boolean isCaseInJurisdiction) {
4749
//@formatter:on
4850
super(uuid);
@@ -54,7 +56,7 @@ public SimilarContactDto(String firstName, String lastName, String uuid,
5456
}
5557
this.caseIdExternalSystem = caseIdExternalSystem;
5658
this.lastContactDate = lastContactDate;
57-
this.contactProximity = contactProximity;
59+
this.id = id;
5860
this.contactClassification = contactClassification;
5961
this.contactStatus = contactStatus;
6062
this.followUpStatus = followUpStatus;
@@ -85,12 +87,12 @@ public void setLastContactDate(Date lastContactDate) {
8587
this.lastContactDate = lastContactDate;
8688
}
8789

88-
public ContactProximity getContactProximity() {
89-
return contactProximity;
90+
public Set<ContactProximity> getContactProximities() {
91+
return contactProximities;
9092
}
9193

92-
public void setContactProximity(ContactProximity contactProximity) {
93-
this.contactProximity = contactProximity;
94+
public void setContactProximities(Set<ContactProximity> contactProximities) {
95+
this.contactProximities = contactProximities;
9496
}
9597

9698
public String getFirstName() {
@@ -144,4 +146,12 @@ public Boolean getCaseInJurisdiction() {
144146
public ContactReferenceDto toReference() {
145147
return new ContactReferenceDto(getUuid(), getFirstName(), getLastName(), getCaze());
146148
}
149+
150+
public Long getId() {
151+
return id;
152+
}
153+
154+
public void setId(Long id) {
155+
this.id = id;
156+
}
147157
}

0 commit comments

Comments
 (0)