Skip to content

Commit 7ec2f6a

Browse files
committed
Enhance default value handling for customizable fields with disease context
1 parent 5c6ab40 commit 7ec2f6a

5 files changed

Lines changed: 51 additions & 6 deletions

File tree

sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1796,7 +1796,10 @@ private void ensureDefaultCustomizableFieldValues(Case caze, CaseDataDto existin
17961796
customizableFieldValueService.ensureDefaultValuesForEntity(caze.getUuid(), CustomizableFieldContext.CASE);
17971797
}
17981798

1799-
epiDataFacade.ensureDefaultCustomizableFieldValues(caze.getEpiData(), existingCaseDto != null ? existingCaseDto.getEpiData() : null);
1799+
epiDataFacade.ensureDefaultCustomizableFieldValues(
1800+
caze.getEpiData(),
1801+
existingCaseDto != null ? existingCaseDto.getEpiData() : null,
1802+
caze.getDisease());
18001803
}
18011804

18021805
private void updateCaseVisitAssociations(CaseDataDto existingCase, Case caze) {

sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,10 @@ public ContactDto save(ContactDto dto, boolean handleChanges, boolean handleCase
419419

420420
Contact entity = fillOrBuildEntity(dto, existingContact, checkChangeDate);
421421
service.ensurePersisted(entity);
422-
epiDataFacade.ensureDefaultCustomizableFieldValues(entity.getEpiData(), existingContactDto != null ? existingContactDto.getEpiData() : null);
422+
epiDataFacade.ensureDefaultCustomizableFieldValues(
423+
entity.getEpiData(),
424+
existingContactDto != null ? existingContactDto.getEpiData() : null,
425+
entity.getDisease());
423426

424427
if (existingContact == null && featureConfigurationFacade.isTaskGenerationFeatureEnabled(TaskType.CONTACT_INVESTIGATION)) {
425428
createInvestigationTask(entity);

sormas-backend/src/main/java/de/symeda/sormas/backend/customizablefield/CustomizableFieldMetadataFacadeEjb.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ protected CustomizableFieldMetadataDto toDto(CustomizableFieldMetadata source) {
287287
return target;
288288
}
289289

290-
private static CustomizableFieldVisibilityRestrictions parseVisibilityRestrictions(String json) {
290+
public static CustomizableFieldVisibilityRestrictions parseVisibilityRestrictions(String json) {
291291
if (StringUtils.isBlank(json)) {
292292
return null;
293293
}

sormas-backend/src/main/java/de/symeda/sormas/backend/customizablefield/CustomizableFieldValueService.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
import de.symeda.sormas.api.common.DeletionDetails;
3737
import de.symeda.sormas.api.customizablefield.CustomizableFieldContext;
3838
import de.symeda.sormas.api.customizablefield.CustomizableFieldValueDto;
39+
import de.symeda.sormas.api.customizablefield.CustomizableFieldVisibilityContext;
40+
import de.symeda.sormas.api.customizablefield.CustomizableFieldVisibilityRestrictions;
3941
import de.symeda.sormas.backend.common.AbstractCoreAdoService;
4042
import de.symeda.sormas.backend.common.AbstractDomainObject;
4143
import de.symeda.sormas.backend.common.DeletableAdo;
@@ -107,6 +109,28 @@ public void saveEntityValues(
107109
}
108110

109111
public void ensureDefaultValuesForEntity(String entityUuid, CustomizableFieldContext contextClass) {
112+
ensureDefaultValuesForEntity(entityUuid, contextClass, null);
113+
}
114+
115+
/**
116+
* Ensures default values for customizable fields for the given entity.
117+
* <p>
118+
* Only fields that are visible for the given visibility context will have their default values
119+
* persisted. Fields with disease-specific visibility restrictions that don't match the context
120+
* will be skipped.
121+
*
122+
* @param entityUuid
123+
* the UUID of the entity
124+
* @param contextClass
125+
* the context class for the customizable fields
126+
* @param visibilityContext
127+
* the visibility context to check against field restrictions; may be null to skip
128+
* visibility checks
129+
*/
130+
public void ensureDefaultValuesForEntity(
131+
String entityUuid,
132+
CustomizableFieldContext contextClass,
133+
CustomizableFieldVisibilityContext visibilityContext) {
110134
if (StringUtils.isBlank(entityUuid) || contextClass == null) {
111135
return;
112136
}
@@ -122,6 +146,15 @@ public void ensureDefaultValuesForEntity(String entityUuid, CustomizableFieldCon
122146
continue;
123147
}
124148

149+
// Skip fields that are not visible for the given context
150+
if (visibilityContext != null && metadata.getVisibilityRestrictions() != null) {
151+
CustomizableFieldVisibilityRestrictions metadataVisibilityRestrictions =
152+
CustomizableFieldMetadataFacadeEjb.parseVisibilityRestrictions(metadata.getVisibilityRestrictions());
153+
if (metadataVisibilityRestrictions.matches(visibilityContext)) {
154+
continue;
155+
}
156+
}
157+
125158
CustomizableFieldValue value = createNewValue(metadata, entityUuid, contextClass);
126159
value.setValue(metadata.getDefaultValue());
127160
ensurePersisted(value);

sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiDataFacadeEjb.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@
2828
import javax.ejb.LocalBean;
2929
import javax.ejb.Stateless;
3030

31+
import de.symeda.sormas.api.Disease;
3132
import de.symeda.sormas.api.activityascase.ActivityAsCaseDto;
3233
import de.symeda.sormas.api.common.DeletionDetails;
3334
import de.symeda.sormas.api.customizablefield.CustomizableFieldContext;
35+
import de.symeda.sormas.api.customizablefield.CustomizableFieldVisibilityContext;
3436
import de.symeda.sormas.api.epidata.EpiDataDto;
3537
import de.symeda.sormas.api.epidata.EpiDataFacade;
3638
import de.symeda.sormas.api.exposure.ExposureDto;
@@ -79,13 +81,16 @@ public void softDeleteCustomizableFieldValues(EpiData epiData, DeletionDetails d
7981
}
8082
}
8183

82-
public void ensureDefaultCustomizableFieldValues(EpiData epiData, EpiDataDto existingEpiData) {
84+
public void ensureDefaultCustomizableFieldValues(EpiData epiData, EpiDataDto existingEpiData, Disease disease) {
8385
if (epiData == null || epiData.getUuid() == null) {
8486
return;
8587
}
8688

89+
// Build visibility context from the provided disease
90+
CustomizableFieldVisibilityContext visibilityContext = disease != null ? new CustomizableFieldVisibilityContext().withDisease(disease) : null;
91+
8792
if (existingEpiData == null || existingEpiData.getUuid() == null) {
88-
customizableFieldValueService.ensureDefaultValuesForEntity(epiData.getUuid(), CustomizableFieldContext.EPIDATA);
93+
customizableFieldValueService.ensureDefaultValuesForEntity(epiData.getUuid(), CustomizableFieldContext.EPIDATA, visibilityContext);
8994
}
9095

9196
HashSet<String> existingExposureUuids = new HashSet<>();
@@ -99,7 +104,8 @@ public void ensureDefaultCustomizableFieldValues(EpiData epiData, EpiDataDto exi
99104

100105
for (Exposure exposure : epiData.getExposures()) {
101106
if (exposure.getUuid() != null && !existingExposureUuids.contains(exposure.getUuid())) {
102-
customizableFieldValueService.ensureDefaultValuesForEntity(exposure.getUuid(), CustomizableFieldContext.EXPOSURE);
107+
// Exposure inherits disease from parent EpiData's disease
108+
customizableFieldValueService.ensureDefaultValuesForEntity(exposure.getUuid(), CustomizableFieldContext.EXPOSURE, visibilityContext);
103109
}
104110
}
105111
}

0 commit comments

Comments
 (0)