Skip to content

Commit 21cd41e

Browse files
Review fixes for exposure dates
1 parent 72886de commit 21cd41e

File tree

9 files changed

+137
-102
lines changed

9 files changed

+137
-102
lines changed

sormas-api/src/main/java/de/symeda/sormas/api/epidata/EpiDataDto.java

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,6 @@ public class EpiDataDto extends PseudonymizableDto {
6969
public static final String INFECTION_SOURCE_TEXT = "infectionSourceText";
7070
public static final String IMPORTED_CASE = "importedCase";
7171
public static final String COUNTRY = "country";
72-
public static final String EXPOSURE_START_DATE = "exposureStartDate";
73-
public static final String EXPOSURE_END_DATE = "exposureEndDate";
7472
public static final String OTHER_DETAILS = "otherDetails";
7573

7674
private YesNoUnknown exposureDetailsKnown;
@@ -134,17 +132,6 @@ public class EpiDataDto extends PseudonymizableDto {
134132
Disease.CRYPTOSPORIDIOSIS })
135133
private String infectionSourceText;
136134

137-
// this values only for display the data from UI.
138-
139-
@Diseases({
140-
Disease.DENGUE,
141-
Disease.MALARIA })
142-
private Date exposureStartDate;
143-
@Diseases({
144-
Disease.DENGUE,
145-
Disease.MALARIA })
146-
private Date exposureEndDate;
147-
148135
@Diseases({
149136
Disease.GIARDIASIS })
150137
private CountryReferenceDto country;
@@ -302,22 +289,6 @@ public void setImportedCase(YesNoUnknown importedCase) {
302289
this.importedCase = importedCase;
303290
}
304291

305-
public Date getExposureStartDate() {
306-
return exposureStartDate;
307-
}
308-
309-
public void setExposureStartDate(Date exposureStartDate) {
310-
this.exposureStartDate = exposureStartDate;
311-
}
312-
313-
public Date getExposureEndDate() {
314-
return exposureEndDate;
315-
}
316-
317-
public void setExposureEndDate(Date exposureEndDate) {
318-
this.exposureEndDate = exposureEndDate;
319-
}
320-
321292
public CountryReferenceDto getCountry() {
322293
return country;
323294
}

sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenSpecie.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,27 @@
2727

2828
public enum PathogenSpecie {
2929

30+
@Diseases({
31+
Disease.TUBERCULOSIS,
32+
Disease.LATENT_TUBERCULOSIS })
3033
@ApplicableToPathogenTests(value = {
3134
PathogenTestType.SPOLIGOTYPING })
3235
MYCOBATERIUM_AFRICANUM,
36+
@Diseases({
37+
Disease.TUBERCULOSIS,
38+
Disease.LATENT_TUBERCULOSIS })
3339
@ApplicableToPathogenTests(value = {
3440
PathogenTestType.SPOLIGOTYPING })
3541
MYCOBATERIUM_BOVIS,
42+
@Diseases({
43+
Disease.TUBERCULOSIS,
44+
Disease.LATENT_TUBERCULOSIS })
3645
@ApplicableToPathogenTests(value = {
3746
PathogenTestType.SPOLIGOTYPING })
3847
MYCOBATERIUM_TUBERCULOSIS,
48+
@Diseases({
49+
Disease.TUBERCULOSIS,
50+
Disease.LATENT_TUBERCULOSIS })
3951
@ApplicableToPathogenTests(value = {
4052
PathogenTestType.SPOLIGOTYPING })
4153
OTHER_MTBC_MEMBER,
@@ -130,19 +142,6 @@ public enum PathogenSpecie {
130142
PathogenTestType.OTHER_MOLECULAR_ASSAY,
131143
PathogenTestType.OTHER_SEROLOGICAL_TEST })
132144
CYNOMOLGI,
133-
@Diseases({
134-
Disease.MALARIA })
135-
@ApplicableToPathogenTests(value = {
136-
PathogenTestType.THIN_BLOOD_SMEAR,
137-
PathogenTestType.RAPID_TEST,
138-
PathogenTestType.OTHER_ANTIGEN_DETECTION_TEST,
139-
PathogenTestType.ENZYME_LINKED_IMMUNOSORBENT_ASSAY,
140-
PathogenTestType.PCR_RT_PCR,
141-
PathogenTestType.Q_PCR,
142-
PathogenTestType.LAMP,
143-
PathogenTestType.OTHER_MOLECULAR_ASSAY,
144-
PathogenTestType.OTHER_SEROLOGICAL_TEST })
145-
SPECIES,
146145
@Diseases({
147146
Disease.MALARIA })
148147
@ApplicableToPathogenTests(value = {

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

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,7 +1200,7 @@ PathogenTestType.NAAT = Nucleic acid amplification test (NAAT)
12001200
PathogenTestType.THICK_BLOOD_SMEAR = Thick blood smear
12011201
PathogenTestType.THIN_BLOOD_SMEAR = Thin blood smear
12021202
PathogenTestType.Q_PCR = qPCR
1203-
PathogenTestType.LAMP = Lamp
1203+
PathogenTestType.LAMP = LAMP
12041204
PathogenTestType.OTHER_ANTIGEN_DETECTION_TEST = Other antigen detection test
12051205
PathogenTestType.OTHER_MOLECULAR_ASSAY = Other molecular assay
12061206
PathogenTestType.OTHER_SEROLOGICAL_TEST = Other serological test
@@ -1209,22 +1209,21 @@ PCRTestSpecification.VARIANT_SPECIFIC = Variant specific
12091209
PCRTestSpecification.N501Y_MUTATION_DETECTION = N501Y mutation detection
12101210

12111211
# SpoligotypeSpecie
1212-
PathogenSpecie.MYCOBATERIUM_AFRICANUM = Mycobaterium Africanum
1213-
PathogenSpecie.MYCOBATERIUM_BOVIS = Mycobaterium bovis
1214-
PathogenSpecie.MYCOBATERIUM_TUBERCULOSIS = Mycobaterium tuberculosis
1212+
PathogenSpecie.MYCOBATERIUM_AFRICANUM = Mycobacterium Africanum
1213+
PathogenSpecie.MYCOBATERIUM_BOVIS = Mycobacterium bovis
1214+
PathogenSpecie.MYCOBATERIUM_TUBERCULOSIS = Mycobacterium tuberculosis
12151215
PathogenSpecie.OTHER_MTBC_MEMBER = Other member of the MTBC
12161216
PathogenSpecie.UNKNOWN = Unknown
12171217
PathogenSpecie.NOT_APPLICABLE = Not Applicable
1218-
PathogenSpecie.SPP = Spp
1219-
PathogenSpecie.FALCIPARUM = Falciparum
1220-
PathogenSpecie.VIVAX = Vivax
1221-
PathogenSpecie.MALARIAE = Malariae
1222-
PathogenSpecie.OVALE = Ovale
1223-
PathogenSpecie.KNOWLESI = Knowlesi
1224-
PathogenSpecie.CYNOMOLGI = Cynomolgi
1225-
PathogenSpecie.SPECIES = Species
1226-
PathogenSpecie.NOT_SPECIFIED = Not specified
1227-
PathogenSpecie.COINFECTION = Coinfection
1218+
PathogenSpecie.SPP = Plasmodium spp
1219+
PathogenSpecie.FALCIPARUM = Plasmodium falciparum
1220+
PathogenSpecie.VIVAX = Plasmodium vivax
1221+
PathogenSpecie.MALARIAE = Plasmodium malariae
1222+
PathogenSpecie.OVALE = Plasmodium ovale
1223+
PathogenSpecie.KNOWLESI = Plasmodium knowlesi
1224+
PathogenSpecie.CYNOMOLGI = Plasmodium cynomolgi
1225+
PathogenSpecie.NOT_SPECIFIED = Plasmodium species not specified
1226+
PathogenSpecie.COINFECTION = Plasmodium coinfection
12281227
PathogenSpecie.OTHER = Other
12291228

12301229
# PathogenTestScale

sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@
7878
import de.symeda.sormas.api.contact.ContactStatus;
7979
import de.symeda.sormas.api.contact.SimilarContactDto;
8080
import de.symeda.sormas.api.deletionconfiguration.DeletionInfoDto;
81-
import de.symeda.sormas.api.disease.DiseaseConfigurationDto;
8281
import de.symeda.sormas.api.docgeneneration.DocumentWorkflow;
8382
import de.symeda.sormas.api.docgeneneration.RootEntityType;
8483
import de.symeda.sormas.api.document.DocumentRelatedEntityType;
@@ -1398,14 +1397,14 @@ public CommitDiscardWrapperComponent<EpiDataForm> getEpiDataComponent(
13981397
// Exposure start date and end date should be calculated based on symptom onsetDate and incubation start periods
13991398
Date symptomOnsetDate = caze.getSymptoms().getOnsetDate();
14001399

1401-
includeExposureDates(symptomOnsetDate, epiDataDto, caze.getDisease());
14021400
EpiDataForm epiDataForm = new EpiDataForm(
14031401
caze.getDisease(),
14041402
CaseDataDto.class,
14051403
caze.isPseudonymized(),
14061404
caze.isInJurisdiction(),
14071405
sourceContactsToggleCallback,
1408-
isEditAllowed);
1406+
isEditAllowed,
1407+
symptomOnsetDate);
14091408
epiDataForm.setValue(epiDataDto);
14101409

14111410
final CommitDiscardWrapperComponent<EpiDataForm> editView =
@@ -1427,30 +1426,6 @@ public CommitDiscardWrapperComponent<EpiDataForm> getEpiDataComponent(
14271426
return editView;
14281427
}
14291428

1430-
// include the exposure dates.
1431-
private void includeExposureDates(Date symptomOnsetDate, EpiDataDto epiDataDto, Disease disease) {
1432-
// if symptomOnsetDate is null, return;
1433-
if (symptomOnsetDate == null) {
1434-
return;
1435-
}
1436-
DiseaseConfigurationDto diseaseConfigurationDto = FacadeProvider.getDiseaseConfigurationFacade().getDiseaseConfiguration(disease);
1437-
if (diseaseConfigurationDto == null) {
1438-
return;
1439-
}
1440-
if (!diseaseConfigurationDto.getIncubationPeriodEnabled()) {
1441-
return;
1442-
}
1443-
if (diseaseConfigurationDto.getMaxIncubationPeriod() == null || diseaseConfigurationDto.getMaxIncubationPeriod() == 0) {
1444-
return;
1445-
}
1446-
if (diseaseConfigurationDto.getMinIncubationPeriod() == null) {
1447-
return;
1448-
}
1449-
1450-
epiDataDto.setExposureStartDate(DateHelper.subtractDays(symptomOnsetDate, diseaseConfigurationDto.getMaxIncubationPeriod()));
1451-
epiDataDto.setExposureEndDate(DateHelper.subtractDays(symptomOnsetDate, diseaseConfigurationDto.getMinIncubationPeriod()));
1452-
}
1453-
14541429
public CommitDiscardWrapperComponent<TherapyForm> getTherapyEditComponent(final String caseUuid, boolean isEditAllowed) {
14551430

14561431
CaseDataDto caseDataDto = findCase(caseUuid);

sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1028,7 +1028,7 @@ public CommitDiscardWrapperComponent<EpiDataForm> getEpiDataComponent(final Stri
10281028
ContactDto contact = FacadeProvider.getContactFacade().getByUuid(contactUuid);
10291029
EpiDataDto epiData = contact.getEpiData();
10301030
EpiDataForm epiDataForm =
1031-
new EpiDataForm(contact.getDisease(), ContactDto.class, epiData.isPseudonymized(), epiData.isInJurisdiction(), null, isEditAllowed);
1031+
new EpiDataForm(contact.getDisease(), ContactDto.class, epiData.isPseudonymized(), epiData.isInJurisdiction(), null, isEditAllowed, null);
10321032
epiDataForm.setValue(epiData);
10331033

10341034
final CommitDiscardWrapperComponent<EpiDataForm> editView =

sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/EpiDataForm.java

Lines changed: 63 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import java.util.Arrays;
2929
import java.util.Collections;
30+
import java.util.Date;
3031
import java.util.List;
3132
import java.util.function.Consumer;
3233
import java.util.function.Supplier;
@@ -35,6 +36,8 @@
3536
import org.apache.commons.lang3.StringUtils;
3637

3738
import com.vaadin.shared.ui.ContentMode;
39+
import com.vaadin.ui.CustomLayout;
40+
import com.vaadin.ui.Label;
3841
import com.vaadin.v7.ui.ComboBox;
3942
import com.vaadin.v7.ui.DateField;
4043
import com.vaadin.v7.ui.Field;
@@ -47,20 +50,23 @@
4750
import de.symeda.sormas.api.caze.CaseDataDto;
4851
import de.symeda.sormas.api.contact.ContactDto;
4952
import de.symeda.sormas.api.contact.ContactReferenceDto;
53+
import de.symeda.sormas.api.disease.DiseaseConfigurationDto;
5054
import de.symeda.sormas.api.epidata.ClusterType;
5155
import de.symeda.sormas.api.epidata.EpiDataDto;
5256
import de.symeda.sormas.api.exposure.InfectionSource;
5357
import de.symeda.sormas.api.exposure.ModeOfTransmission;
5458
import de.symeda.sormas.api.i18n.I18nProperties;
5559
import de.symeda.sormas.api.i18n.Strings;
5660
import de.symeda.sormas.api.infrastructure.country.CountryReferenceDto;
61+
import de.symeda.sormas.api.utils.DateHelper;
5762
import de.symeda.sormas.api.utils.YesNoUnknown;
5863
import de.symeda.sormas.api.utils.fieldaccess.UiFieldAccessCheckers;
5964
import de.symeda.sormas.api.utils.fieldvisibility.FieldVisibilityCheckers;
6065
import de.symeda.sormas.api.utils.fieldvisibility.checkers.CountryFieldVisibilityChecker;
6166
import de.symeda.sormas.ui.ActivityAsCase.ActivityAsCaseField;
6267
import de.symeda.sormas.ui.exposure.ExposuresField;
6368
import de.symeda.sormas.ui.utils.AbstractEditForm;
69+
import de.symeda.sormas.ui.utils.CssStyles;
6470
import de.symeda.sormas.ui.utils.FieldAccessHelper;
6571
import de.symeda.sormas.ui.utils.FieldHelper;
6672
import de.symeda.sormas.ui.utils.NullableOptionGroup;
@@ -77,11 +83,13 @@ public class EpiDataForm extends AbstractEditForm<EpiDataDto> {
7783
private static final String LOC_SOURCE_CASE_CONTACTS_HEADING = "locSourceCaseContactsHeading";
7884
private static final String LOC_EPI_DATA_FIELDS_HINT = "locEpiDataFieldsHint";
7985
private static final String LOC_EXP_PERIOD_HEADING = "locExpPeriodHeading";
86+
private static final String EXPOSURE_DATES_LAYOUT =
87+
fluidRowLocs(3, "EXPOSURE_START_DATE_LABEL", 3, "EXPOSURE_START_DATE_VALUE", 3, "EXPOSURE_END_DATE_LABEL", 3, "EXPOSURE_END_DATE_VALUE");
8088

8189
//@formatter:off
8290
private static final String MAIN_HTML_LAYOUT =
8391
loc(LOC_EXPOSURE_INVESTIGATION_HEADING) +
84-
fluidRowLocs(6, EpiDataDto.EXPOSURE_START_DATE, 6, EpiDataDto.EXPOSURE_END_DATE)+
92+
fluidRowLocs("EXP_DATES_LAYOUT") +
8593
fluidRowLocs(6,EpiDataDto.CASE_IMPORTED_STATUS,6,"") +
8694
loc(LOC_EXP_PERIOD_HEADING) +
8795
loc(EpiDataDto.EXPOSURE_DETAILS_KNOWN) +
@@ -110,14 +118,16 @@ public class EpiDataForm extends AbstractEditForm<EpiDataDto> {
110118
private final Class<? extends EntityDto> parentClass;
111119
private final Consumer<Boolean> sourceContactsToggleCallback;
112120
private final boolean isPseudonymized;
121+
private final Date symptomOnsetDate;
113122

114123
public EpiDataForm(
115124
Disease disease,
116125
Class<? extends EntityDto> parentClass,
117126
boolean isPseudonymized,
118127
boolean inJurisdiction,
119128
Consumer<Boolean> sourceContactsToggleCallback,
120-
boolean isEditAllowed) {
129+
boolean isEditAllowed,
130+
Date date) {
121131
super(
122132
EpiDataDto.class,
123133
EpiDataDto.I18N_PREFIX,
@@ -129,6 +139,7 @@ public EpiDataForm(
129139
this.parentClass = parentClass;
130140
this.sourceContactsToggleCallback = sourceContactsToggleCallback;
131141
this.isPseudonymized = isPseudonymized;
142+
this.symptomOnsetDate = date;
132143
addFields();
133144
}
134145

@@ -178,17 +189,13 @@ protected void addFields() {
178189
addField(EpiDataDto.MODE_OF_TRANSMISSION_TYPE);
179190
addField(EpiDataDto.INFECTION_SOURCE);
180191
addField(EpiDataDto.INFECTION_SOURCE_TEXT);
181-
DateField exposureStartDate = addField(EpiDataDto.EXPOSURE_START_DATE);
182-
exposureStartDate.setCaption(I18nProperties.getString(Strings.exposureStartDate));
183-
exposureStartDate.setEnabled(false);
184-
DateField exposureEndDate = addField(EpiDataDto.EXPOSURE_END_DATE);
185-
exposureEndDate.setCaption(I18nProperties.getString(Strings.exposureEndDate));
186-
exposureEndDate.setEnabled(false);
187192
addField(EpiDataDto.IMPORTED_CASE, NullableOptionGroup.class);
188193
List<CountryReferenceDto> countries = FacadeProvider.getCountryFacade().getAllActiveAsReference();
189194
ComboBox country = addInfrastructureField(EpiDataDto.COUNTRY);
190195
country.addItems(countries);
191196

197+
includeExposureDates(symptomOnsetDate, disease);
198+
192199
TextField clusterTypeTF = addField(EpiDataDto.CLUSTER_TYPE_TEXT);
193200
FieldHelper
194201
.setVisibleWhen(getFieldGroup(), EpiDataDto.CLUSTER_TYPE, EpiDataDto.CLUSTER_RELATED, Collections.singletonList(Boolean.TRUE), true);
@@ -211,6 +218,54 @@ protected void addFields() {
211218
});
212219
}
213220

221+
/**
222+
* Include the exposire start and dates when symptomOnsetDate is present.
223+
* Disease incubation period is enabled with valid values.
224+
*
225+
* @param symptomOnsetDate
226+
* @param disease
227+
*/
228+
private void includeExposureDates(Date symptomOnsetDate, Disease disease) {
229+
// if symptomOnsetDate is null, return;
230+
if (symptomOnsetDate == null) {
231+
return;
232+
}
233+
DiseaseConfigurationDto diseaseConfigurationDto = FacadeProvider.getDiseaseConfigurationFacade().getDiseaseConfiguration(disease);
234+
if (diseaseConfigurationDto == null) {
235+
return;
236+
}
237+
if (!diseaseConfigurationDto.getIncubationPeriodEnabled()) {
238+
return;
239+
}
240+
if (diseaseConfigurationDto.getMaxIncubationPeriod() == null || diseaseConfigurationDto.getMaxIncubationPeriod() == 0) {
241+
return;
242+
}
243+
if (diseaseConfigurationDto.getMinIncubationPeriod() == null) {
244+
return;
245+
}
246+
247+
CustomLayout exposureDatesLayout = new CustomLayout();
248+
exposureDatesLayout.setTemplateContents(EXPOSURE_DATES_LAYOUT);
249+
Label exposureStartLabel = new Label(I18nProperties.getString(Strings.exposureStartDate));
250+
exposureStartLabel.addStyleNames(CssStyles.LABEL_BOLD, CssStyles.LABEL_UPPERCASE);
251+
exposureDatesLayout.addComponent(exposureStartLabel, "EXPOSURE_START_DATE_LABEL");
252+
253+
DateField exposureStartDateValue = new DateField();
254+
exposureStartDateValue.setValue(DateHelper.subtractDays(symptomOnsetDate, diseaseConfigurationDto.getMaxIncubationPeriod()));
255+
exposureStartDateValue.setReadOnly(true);
256+
exposureDatesLayout.addComponent(exposureStartDateValue, "EXPOSURE_START_DATE_VALUE");
257+
258+
Label exposureEndLabel = new Label(I18nProperties.getString(Strings.exposureEndDate));
259+
exposureEndLabel.addStyleNames(CssStyles.LABEL_BOLD, CssStyles.LABEL_UPPERCASE);
260+
exposureDatesLayout.addComponent(exposureEndLabel, "EXPOSURE_END_DATE_LABEL");
261+
DateField exposureEndDateValue = new DateField();
262+
exposureEndDateValue.setValue(DateHelper.subtractDays(symptomOnsetDate, diseaseConfigurationDto.getMinIncubationPeriod()));
263+
exposureEndDateValue.setReadOnly(true);
264+
exposureDatesLayout.addComponent(exposureEndDateValue, "EXPOSURE_END_DATE_VALUE");
265+
266+
getContent().addComponent(exposureDatesLayout, "EXP_DATES_LAYOUT");
267+
}
268+
214269
private void addActivityAsCaseFields() {
215270

216271
getContent().addComponent(

sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestForm.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,9 +1225,12 @@ protected void addFields() {
12251225

12261226
updateSpecieField.accept(disease, testType);
12271227
// Result details should be visible for Malaria and test-types with PathogenTestType.THIN_BLOOD_SMEAR, PathogenTestType.Q_PCR
1228-
resultDetailsField.setVisible(
1229-
Disease.MALARIA == disease && Arrays.asList(PathogenTestType.THIN_BLOOD_SMEAR, PathogenTestType.Q_PCR).contains(testType));
1230-
seroTypeMetCB.setVisible(testType == PathogenTestType.SEROGROUPING && Disease.INVASIVE_PNEUMOCOCCAL_INFECTION == disease);
1228+
setVisibleClear(
1229+
Disease.MALARIA == disease && Arrays.asList(PathogenTestType.THIN_BLOOD_SMEAR, PathogenTestType.Q_PCR).contains(testType),
1230+
PathogenTestDto.RESULT_DETAILS);
1231+
setVisibleClear(
1232+
testType == PathogenTestType.SEROGROUPING && Disease.INVASIVE_PNEUMOCOCCAL_INFECTION == disease,
1233+
PathogenTestDto.SEROTYPING_METHOD);
12311234
} else {
12321235
setVisibleClear(
12331236
testTypeField.getValue() != null,

0 commit comments

Comments
 (0)