Skip to content
This repository was archived by the owner on May 5, 2021. It is now read-only.

Commit 12e08ea

Browse files
lgallgal
authored andcommitted
Merge remote-tracking branch 'origin/development' into 3411_person-salutation
# Conflicts: # sormas-api/src/main/resources/enum.properties # sormas-api/src/main/resources/enum_de-DE.properties # sormas-backend/src/main/resources/sql/sormas_schema.sql # sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonEditForm.java
2 parents 2231b11 + 35524a3 commit 12e08ea

273 files changed

Lines changed: 5397 additions & 613 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

sormas-api/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@
6767
<artifactId>simmetrics-core</artifactId>
6868
</dependency>
6969

70+
<dependency>
71+
<groupId>org.jsoup</groupId>
72+
<artifactId>jsoup</artifactId>
73+
</dependency>
74+
7075
</dependencies>
7176

7277
</project>

sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseExportDto.java

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import de.symeda.sormas.api.location.LocationDto;
4343
import de.symeda.sormas.api.person.ApproximateAgeType;
4444
import de.symeda.sormas.api.person.ApproximateAgeType.ApproximateAgeHelper;
45+
import de.symeda.sormas.api.person.ArmedForcesRelationType;
4546
import de.symeda.sormas.api.person.BurialConductor;
4647
import de.symeda.sormas.api.person.EducationType;
4748
import de.symeda.sormas.api.person.OccupationType;
@@ -189,6 +190,7 @@ public class CaseExportDto implements Serializable {
189190
@SensitiveData
190191
private String emailAddress;
191192
private String occupationType;
193+
private ArmedForcesRelationType armedForcesRelationType;
192194
private String educationType;
193195
private String travelHistory;
194196
private boolean traveled;
@@ -268,7 +270,7 @@ public CaseExportDto(long id, long personId, long personAddressId, long epiDataI
268270
String addressRegion, String addressDistrict, String addressCommunity, String city, String street, String houseNumber, String additionalInformation, String postalCode,
269271
String facility, String facilityUuid, String facilityDetails,
270272
String phone, String phoneOwner, String emailAddress, EducationType educationType, String educationDetails,
271-
OccupationType occupationType, String occupationDetails, YesNoUnknown contactWithSourceCaseKnown,
273+
OccupationType occupationType, String occupationDetails, ArmedForcesRelationType ArmedForcesRelationType, YesNoUnknown contactWithSourceCaseKnown,
272274
//Date onsetDate,
273275
Vaccination vaccination, String vaccinationDoses, Date vaccinationDate,
274276
VaccinationInfoSource vaccinationInfoSource, YesNoUnknown postpartum, Trimester trimester,
@@ -285,6 +287,7 @@ public CaseExportDto(long id, long personId, long personAddressId, long epiDataI
285287
this.healthConditionsId = healthConditionsId;
286288
this.uuid = uuid;
287289
this.epidNumber = epidNumber;
290+
this.armedForcesRelationType = ArmedForcesRelationType;
288291
this.diseaseFormatted = DiseaseHelper.toString(disease, diseaseDetails);
289292
this.disease = disease;
290293
this.firstName = firstName;
@@ -1015,8 +1018,8 @@ public String getPhone() {
10151018

10161019
@Order(75)
10171020
@ExportTarget(caseExportTypes = {
1018-
CaseExportType.CASE_SURVEILLANCE,
1019-
CaseExportType.CASE_MANAGEMENT })
1021+
CaseExportType.CASE_SURVEILLANCE,
1022+
CaseExportType.CASE_MANAGEMENT })
10201023
@ExportProperty(PersonDto.EMAIL_ADDRESS)
10211024
@ExportGroup(ExportGroupType.SENSITIVE)
10221025
public String getEmailAddress() {
@@ -1048,6 +1051,16 @@ public String getOccupationType() {
10481051
}
10491052

10501053
@Order(78)
1054+
@ExportTarget(caseExportTypes = {
1055+
CaseExportType.CASE_SURVEILLANCE,
1056+
CaseExportType.CASE_MANAGEMENT })
1057+
@ExportProperty(PersonDto.ARMED_FORCES_RELATION_TYPE)
1058+
@ExportGroup(ExportGroupType.PERSON)
1059+
public ArmedForcesRelationType getArmedForcesRelationType() {
1060+
return armedForcesRelationType;
1061+
}
1062+
1063+
@Order(79)
10511064
@ExportTarget(caseExportTypes = {
10521065
CaseExportType.CASE_SURVEILLANCE })
10531066
@ExportProperty(TRAVELED)
@@ -1060,7 +1073,7 @@ public void setTraveled(boolean traveled) {
10601073
this.traveled = traveled;
10611074
}
10621075

1063-
@Order(79)
1076+
@Order(80)
10641077
@ExportTarget(caseExportTypes = {
10651078
CaseExportType.CASE_SURVEILLANCE })
10661079
@ExportProperty(TRAVEL_HISTORY)
@@ -1069,7 +1082,7 @@ public String getTravelHistory() {
10691082
return travelHistory;
10701083
}
10711084

1072-
@Order(80)
1085+
@Order(81)
10731086
@ExportTarget(caseExportTypes = {
10741087
CaseExportType.CASE_SURVEILLANCE })
10751088
@ExportProperty(BURIAL_ATTENDED)
@@ -1082,7 +1095,7 @@ public void setBurialAttended(boolean burialAttended) {
10821095
this.burialAttended = burialAttended;
10831096
}
10841097

1085-
@Order(81)
1098+
@Order(82)
10861099
@ExportTarget(caseExportTypes = {
10871100
CaseExportType.CASE_SURVEILLANCE })
10881101
@ExportProperty(EpiDataDto.CONTACT_WITH_SOURCE_CASE_KNOWN)
@@ -1534,6 +1547,10 @@ public void setOccupationType(String occupationType) {
15341547
this.occupationType = occupationType;
15351548
}
15361549

1550+
public void setArmedForcesRelationType(ArmedForcesRelationType armedForcesRelationType) {
1551+
this.armedForcesRelationType = armedForcesRelationType;
1552+
}
1553+
15371554
public void setTravelHistory(String travelHistory) {
15381555
this.travelHistory = travelHistory;
15391556
}

sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import de.symeda.sormas.api.CaseMeasure;
2828
import de.symeda.sormas.api.Disease;
2929
import de.symeda.sormas.api.Language;
30+
import de.symeda.sormas.api.messaging.ManualMessageLogDto;
31+
import de.symeda.sormas.api.messaging.MessageType;
3032
import de.symeda.sormas.api.contact.ContactReferenceDto;
3133
import de.symeda.sormas.api.contact.DashboardQuarantineDataDto;
3234
import de.symeda.sormas.api.event.EventParticipantReferenceDto;
@@ -175,4 +177,10 @@ List<DashboardQuarantineDataDto> getQuarantineDataForDashBoard(
175177
Date to);
176178

177179
long countCasesConvertedFromContacts(CaseCriteria caseCriteria);
180+
181+
void sendMessage(List<String> caseUuids, String subject, String messageContent, MessageType... messageTypes);
182+
183+
long countCasesWithMissingContactInformation(List<String> caseUuids, MessageType messageType);
184+
185+
List<ManualMessageLogDto> getMessageLog(String caseUuid, MessageType messageType);
178186
}

sormas-api/src/main/java/de/symeda/sormas/api/caze/classification/ClassificationHtmlRenderer.java

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,11 @@
1717
*******************************************************************************/
1818
package de.symeda.sormas.api.caze.classification;
1919

20-
import static de.symeda.sormas.api.utils.HtmlHelper.escapeAndUnescapeBasicTags;
21-
import static de.symeda.sormas.api.utils.HtmlHelper.unescapeBasicTags;
22-
2320
import java.util.Date;
2421
import java.util.List;
2522

2623
import org.apache.commons.lang3.StringUtils;
27-
import org.apache.commons.text.StringEscapeUtils;
24+
import org.jsoup.safety.Whitelist;
2825

2926
import de.symeda.sormas.api.Disease;
3027
import de.symeda.sormas.api.FacadeProvider;
@@ -34,6 +31,7 @@
3431
import de.symeda.sormas.api.i18n.Strings;
3532
import de.symeda.sormas.api.utils.DataHelper;
3633
import de.symeda.sormas.api.utils.DateHelper;
34+
import de.symeda.sormas.api.utils.HtmlHelper;
3735
import de.symeda.sormas.api.utils.InfoProvider;
3836

3937
/**
@@ -176,7 +174,7 @@ public static String createHtmlForDownload(String sormasServerUrl, List<Disease>
176174
html.append("<h1 style=\"text-align: center; color: #005A9C;\">").append(I18nProperties.getString(Strings.classificationClassificationRules)).append("</h1>");
177175
html.append("<h4 style=\"text-align: center;\">")
178176
.append(I18nProperties.getString(Strings.classificationGeneratedFor))
179-
.append(" ").append(StringEscapeUtils.escapeHtml4(InfoProvider.get().getVersion()))
177+
.append(" ").append(HtmlHelper.cleanHtml(InfoProvider.get().getVersion()))
180178
.append(StringUtils.wrap(I18nProperties.getString(Strings.on), " "))
181179
.append(sormasServerUrl).append(StringUtils.wrap(I18nProperties.getString(Strings.at), " "))
182180
.append(DateHelper.formatLocalDateTime(new Date(), language)).append("</h4>");
@@ -241,7 +239,7 @@ private static String buildSubCriteriaDiv(
241239
for (ClassificationCriteriaDto subCriteria : ((ClassificationCollectiveCriteria) criteria).getSubCriteria()) {
242240
if (!(subCriteria instanceof ClassificationCollectiveCriteria) || subCriteria instanceof ClassificationCompactCriteria) {
243241
// For non-collective or compact collective criteria, add the description as a list item
244-
subCriteriaSb.append("- " + escapeAndUnescapeBasicTags(subCriteria.buildDescription() + "</br>"));
242+
subCriteriaSb.append("- " + HtmlHelper.cleanHtml(subCriteria.buildDescription(), Whitelist.basic()) + "</br>");
245243
} else if (subCriteria instanceof ClassificationCollectiveCriteria
246244
&& !(subCriteria instanceof ClassificationAllOfCriteriaDto)
247245
&& !(subCriteria.getClass() == ClassificationXOfCriteriaDto.class)) {
@@ -273,7 +271,7 @@ private static String createSurroundingDiv(ClassificationCriteriaType criteriaTy
273271
//@formatter:off
274272
return "<div class='classification-rules'>"
275273
+ "<div class='main-criteria main-criteria-"
276-
+ StringEscapeUtils.escapeHtml4(criteriaType.toString())
274+
+ HtmlHelper.cleanHtml(criteriaType.toString())
277275
+ "'>"
278276
+ content
279277
+ "</div></div>";
@@ -287,7 +285,7 @@ private static String createHeadlineDiv(String headline) {
287285

288286
//@formatter:off
289287
return "<div class='headline'>"
290-
+ StringEscapeUtils.escapeHtml4(headline)
288+
+ HtmlHelper.cleanHtml(headline, Whitelist.basic())
291289
+ "</div>";
292290
//@formatter:on
293291
}
@@ -296,13 +294,12 @@ private static String createHeadlineDiv(String headline) {
296294
* Creates a div containing an info text.
297295
*/
298296
private static String createInfoDiv() {
299-
return unescapeBasicTags(StringEscapeUtils.escapeHtml4(I18nProperties.getString(Strings.classificationInfoText)));
297+
return HtmlHelper.cleanI18nString(I18nProperties.getString(Strings.classificationInfoText));
300298
}
301299

302300
private static String createInfoDiv(int requirementsNumber) {
303-
return unescapeBasicTags(
304-
StringEscapeUtils.escapeHtml4(
305-
String.format(I18nProperties.getString(Strings.classificationInfoNumberText), DataHelper.parseNumberToString(requirementsNumber))));
301+
return HtmlHelper.cleanI18nString(
302+
String.format(I18nProperties.getString(Strings.classificationInfoNumberText), DataHelper.parseNumberToString(requirementsNumber)));
306303
}
307304

308305
/**
@@ -334,7 +331,7 @@ private static String createSubCriteriaSurroundingDiv(String content) {
334331
* Specific tags are allowed to be contained in i18n strings and are thus unescaped
335332
*/
336333
private static String createCriteriaItemDiv(String text) {
337-
return unescapeBasicTags(StringEscapeUtils.escapeHtml4(text) + "<br>");
334+
return (HtmlHelper.cleanHtml(text, Whitelist.basic()) + "<br>");
338335
}
339336

340337
private enum ClassificationCriteriaType {

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

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import de.symeda.sormas.api.facility.FacilityHelper;
2929
import de.symeda.sormas.api.person.ApproximateAgeType;
3030
import de.symeda.sormas.api.person.ApproximateAgeType.ApproximateAgeHelper;
31+
import de.symeda.sormas.api.person.ArmedForcesRelationType;
3132
import de.symeda.sormas.api.person.OccupationType;
3233
import de.symeda.sormas.api.person.PersonHelper;
3334
import de.symeda.sormas.api.person.PresentCondition;
@@ -108,6 +109,7 @@ public class ContactExportDto implements Serializable {
108109
@SensitiveData
109110
private String emailAddress;
110111
private String occupationType;
112+
private ArmedForcesRelationType armedForcesRelationType;
111113
private int numberOfVisits;
112114
private YesNoUnknown lastCooperativeVisitSymptomatic;
113115
private Date lastCooperativeVisitDate;
@@ -159,7 +161,7 @@ public ContactExportDto(long id, long personId, String uuid, String sourceCaseUu
159161
PresentCondition presentCondition, Date deathDate,
160162
String addressRegion, String addressDistrict, String addressCommunity, String city, String street, String houseNumber, String additionalInformation, String postalCode,
161163
String facility, String facilityUuid, String facilityDetails,
162-
String phone, String phoneOwner, String emailAddress, OccupationType occupationType, String occupationDetails,
164+
String phone, String phoneOwner, String emailAddress, OccupationType occupationType, String occupationDetails, ArmedForcesRelationType armedForcesRelationType,
163165
String region, String district, String community,
164166
long epiDataId, YesNoUnknown contactWithSourceCaseKnown, YesNoUnknown returningTraveler, String externalID,
165167
String reportingUserUuid, String regionUuid, String districtUuid, String communityUuid,
@@ -218,6 +220,7 @@ public ContactExportDto(long id, long personId, String uuid, String sourceCaseUu
218220
this.phone = PersonHelper.buildPhoneString(phone, phoneOwner);
219221
this.emailAddress = emailAddress;
220222
this.occupationType = PersonHelper.buildOccupationString(occupationType, occupationDetails);
223+
this.armedForcesRelationType = armedForcesRelationType;
221224
this.region = region;
222225
this.district = district;
223226
this.community = community;
@@ -538,26 +541,31 @@ public String getOccupationType() {
538541
}
539542

540543
@Order(61)
544+
public ArmedForcesRelationType getArmedForcesRelationType() {
545+
return armedForcesRelationType;
546+
}
547+
548+
@Order(62)
541549
public int getNumberOfVisits() {
542550
return numberOfVisits;
543551
}
544552

545-
@Order(62)
553+
@Order(63)
546554
public YesNoUnknown getLastCooperativeVisitSymptomatic() {
547555
return lastCooperativeVisitSymptomatic;
548556
}
549557

550-
@Order(63)
558+
@Order(64)
551559
public Date getLastCooperativeVisitDate() {
552560
return lastCooperativeVisitDate;
553561
}
554562

555-
@Order(64)
563+
@Order(65)
556564
public String getLastCooperativeVisitSymptoms() {
557565
return lastCooperativeVisitSymptoms;
558566
}
559567

560-
@Order(65)
568+
@Order(66)
561569
public boolean isTraveled() {
562570
return traveled;
563571
}
@@ -566,7 +574,7 @@ public void setTraveled(boolean traveled) {
566574
this.traveled = traveled;
567575
}
568576

569-
@Order(66)
577+
@Order(67)
570578
public String getTravelHistory() {
571579
return travelHistory;
572580
}
@@ -575,7 +583,7 @@ public void setTravelHistory(String travelHistory) {
575583
this.travelHistory = travelHistory;
576584
}
577585

578-
@Order(67)
586+
@Order(68)
579587
public boolean isBurialAttended() {
580588
return burialAttended;
581589
}
@@ -584,7 +592,7 @@ public void setBurialAttended(boolean burialAttended) {
584592
this.burialAttended = burialAttended;
585593
}
586594

587-
@Order(68)
595+
@Order(69)
588596
public YesNoUnknown getContactWithSourceCaseKnown() {
589597
return contactWithSourceCaseKnown;
590598
}
@@ -737,6 +745,10 @@ public void setOccupationType(String occupationType) {
737745
this.occupationType = occupationType;
738746
}
739747

748+
public void setArmedForcesRelationType(ArmedForcesRelationType armedForcesRelationType) {
749+
this.armedForcesRelationType = armedForcesRelationType;
750+
}
751+
740752
public void setLastCooperativeVisitSymptomatic(YesNoUnknown lastCooperativeVisitSymptomatic) {
741753
this.lastCooperativeVisitSymptomatic = lastCooperativeVisitSymptomatic;
742754
}

sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,11 @@ public enum FeatureType {
5050
true,
5151
new FeatureType[] {
5252
TASK_MANAGEMENT }),
53+
MANUAL_EXTERNAL_MESSAGES(true, true, null),
5354
OTHER_NOTIFICATIONS(true, true, null),
5455
DOCUMENTS(true, false, null),
55-
OUTBREAKS(true, true, null);
56+
OUTBREAKS(true, true, null),
57+
LAB_MESSAGES(true, false, null);
5658

5759
/**
5860
* Server feature means that the feature only needs to be configured once per server since they define the way the system

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public interface Captions {
6767
String actionSave = "actionSave";
6868
String actionSaveChanges = "actionSaveChanges";
6969
String actionSelectAll = "actionSelectAll";
70+
String actionSend = "actionSend";
7071
String actionSettings = "actionSettings";
7172
String actionShowLessFilters = "actionShowLessFilters";
7273
String actionShowMoreFilters = "actionShowMoreFilters";
@@ -999,6 +1000,32 @@ public interface Captions {
9991000
String importSkips = "importSkips";
10001001
String inaccessibleValue = "inaccessibleValue";
10011002
String info = "info";
1003+
String LabMessage = "LabMessage";
1004+
String LabMessage_labMessageDetails = "LabMessage.labMessageDetails";
1005+
String LabMessage_labSampleId = "LabMessage.labSampleId";
1006+
String LabMessage_personBirthDateDD = "LabMessage.personBirthDateDD";
1007+
String LabMessage_personBirthDateMM = "LabMessage.personBirthDateMM";
1008+
String LabMessage_personBirthDateYYYY = "LabMessage.personBirthDateYYYY";
1009+
String LabMessage_personCity = "LabMessage.personCity";
1010+
String LabMessage_personFirstName = "LabMessage.personFirstName";
1011+
String LabMessage_personHouseNumber = "LabMessage.personHouseNumber";
1012+
String LabMessage_personLastName = "LabMessage.personLastName";
1013+
String LabMessage_personPostalCode = "LabMessage.personPostalCode";
1014+
String LabMessage_personSex = "LabMessage.personSex";
1015+
String LabMessage_personStreet = "LabMessage.personStreet";
1016+
String LabMessage_processed = "LabMessage.processed";
1017+
String LabMessage_sampleDateTime = "LabMessage.sampleDateTime";
1018+
String LabMessage_sampleMaterial = "LabMessage.sampleMaterial";
1019+
String LabMessage_sampleReceivedDate = "LabMessage.sampleReceivedDate";
1020+
String LabMessage_specimenCondition = "LabMessage.specimenCondition";
1021+
String LabMessage_testDateTime = "LabMessage.testDateTime";
1022+
String LabMessage_testedDisease = "LabMessage.testedDisease";
1023+
String LabMessage_testLabCity = "LabMessage.testLabCity";
1024+
String LabMessage_testLabExternalId = "LabMessage.testLabExternalId";
1025+
String LabMessage_testLabName = "LabMessage.testLabName";
1026+
String LabMessage_testLabPostalCode = "LabMessage.testLabPostalCode";
1027+
String LabMessage_testResult = "LabMessage.testResult";
1028+
String LabMessage_testType = "LabMessage.testType";
10021029
String lastName = "lastName";
10031030
String lineListingAddLine = "lineListingAddLine";
10041031
String lineListingDisableAll = "lineListingDisableAll";
@@ -1076,6 +1103,16 @@ public interface Captions {
10761103
String MaternalHistory_swollenLymphsMonth = "MaternalHistory.swollenLymphsMonth";
10771104
String MaternalHistory_swollenLymphsOnset = "MaternalHistory.swollenLymphsOnset";
10781105
String menu = "menu";
1106+
String messagesCharacters = "messagesCharacters";
1107+
String messagesEmail = "messagesEmail";
1108+
String messagesNoPhoneNumberForCasePerson = "messagesNoPhoneNumberForCasePerson";
1109+
String messagesNoSmsSentForCase = "messagesNoSmsSentForCase";
1110+
String messagesNumberOfMessages = "messagesNumberOfMessages";
1111+
String messagesNumberOfMissingPhoneNumbers = "messagesNumberOfMissingPhoneNumbers";
1112+
String messagesSendingSms = "messagesSendingSms";
1113+
String messagesSendSMS = "messagesSendSMS";
1114+
String messagesSentBy = "messagesSentBy";
1115+
String messagesSms = "messagesSms";
10791116
String moreActions = "moreActions";
10801117
String name = "name";
10811118
String nationalHealthId = "nationalHealthId";

0 commit comments

Comments
 (0)