diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/docgeneneration/DocumentWorkflow.java b/sormas-api/src/main/java/de/symeda/sormas/api/docgeneneration/DocumentWorkflow.java index 060afed1471..f1b02510734 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/docgeneneration/DocumentWorkflow.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/docgeneneration/DocumentWorkflow.java @@ -21,6 +21,7 @@ import static de.symeda.sormas.api.docgeneneration.RootEntityType.ROOT_EVENT_ACTIONS; import static de.symeda.sormas.api.docgeneneration.RootEntityType.ROOT_EVENT_PARTICIPANT; import static de.symeda.sormas.api.docgeneneration.RootEntityType.ROOT_EVENT_PARTICIPANTS; +import static de.symeda.sormas.api.docgeneneration.RootEntityType.ROOT_GENERAL; import static de.symeda.sormas.api.docgeneneration.RootEntityType.ROOT_PATHOGEN_TEST; import static de.symeda.sormas.api.docgeneneration.RootEntityType.ROOT_PERSON; import static de.symeda.sormas.api.docgeneneration.RootEntityType.ROOT_SAMPLE; @@ -54,7 +55,8 @@ public enum DocumentWorkflow { ROOT_USER, ROOT_SAMPLE, ROOT_PATHOGEN_TEST, - ROOT_VACCINATION), + ROOT_VACCINATION, + ROOT_GENERAL), QUARANTINE_ORDER_CONTACT(DocumentWorkflowType.DOCUMENT, "quarantineContact", DOCX, @@ -64,7 +66,8 @@ public enum DocumentWorkflow { ROOT_USER, ROOT_SAMPLE, ROOT_PATHOGEN_TEST, - ROOT_VACCINATION), + ROOT_VACCINATION, + ROOT_GENERAL), QUARANTINE_ORDER_EVENT_PARTICIPANT(DocumentWorkflowType.DOCUMENT, "quarantineEventParticipant", DOCX, @@ -74,14 +77,16 @@ public enum DocumentWorkflow { ROOT_USER, ROOT_SAMPLE, ROOT_PATHOGEN_TEST, - ROOT_VACCINATION), + ROOT_VACCINATION, + ROOT_GENERAL), QUARANTINE_ORDER_TRAVEL_ENTRY(DocumentWorkflowType.DOCUMENT, "quarantineTravelEntry", DOCX, UserRight.DOCUMENT_TEMPLATE_MANAGEMENT, ROOT_TRAVEL_ENTRY, ROOT_PERSON, - ROOT_USER), + ROOT_USER, + ROOT_GENERAL), EVENT_HANDOUT(DocumentWorkflowType.DOCUMENT, "eventHandout", HTML, @@ -127,22 +132,15 @@ public enum DocumentWorkflow { ROOT_TRAVEL_ENTRY, ROOT_PERSON, ROOT_USER), - SURVEY_DOCUMENT(DocumentWorkflowType.DOCUMENT, - "survey", - DOCX, - UserRight.SURVEY_EDIT, - ROOT_CASE, - ROOT_PERSON, - ROOT_USER, - ROOT_SAMPLE), + SURVEY_DOCUMENT(DocumentWorkflowType.DOCUMENT, "survey", DOCX, UserRight.SURVEY_EDIT, ROOT_CASE, ROOT_PERSON, ROOT_USER, ROOT_SAMPLE), SURVEY_EMAIL(DocumentWorkflowType.EMAIL, - Constants.EMAIL_TEMPLATES_FOLDER + "/surveys", - TXT, - UserRight.SURVEY_EDIT, - ROOT_CASE, - ROOT_PERSON, - ROOT_USER, - ROOT_SAMPLE),; + Constants.EMAIL_TEMPLATES_FOLDER + "/surveys", + TXT, + UserRight.SURVEY_EDIT, + ROOT_CASE, + ROOT_PERSON, + ROOT_USER, + ROOT_SAMPLE),; private final DocumentWorkflowType type; private final String templateDirectory; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/docgeneneration/RootEntityType.java b/sormas-api/src/main/java/de/symeda/sormas/api/docgeneneration/RootEntityType.java index 07b8a3f5ff0..dc5d241ef40 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/docgeneneration/RootEntityType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/docgeneneration/RootEntityType.java @@ -28,7 +28,8 @@ public enum RootEntityType { ROOT_EVENT_ACTIONS("eventActions"), ROOT_EVENT_PARTICIPANTS("eventParticipants"), ROOT_TRAVEL_ENTRY("travelEntry"), - ROOT_VACCINATION("vaccination"); + ROOT_VACCINATION("vaccination"), + ROOT_GENERAL("general"); private final String entityName; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/docgeneration/DocumentTemplateFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/docgeneration/DocumentTemplateFacadeEjb.java index 627307154e5..3b7e8d52a3f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/docgeneration/DocumentTemplateFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/docgeneration/DocumentTemplateFacadeEjb.java @@ -19,7 +19,11 @@ import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.FormatStyle; import java.util.List; +import java.util.Optional; import java.util.Properties; import java.util.Set; import java.util.regex.Matcher; @@ -229,6 +233,12 @@ private Properties prepareProperties( continue; } + // check if the entity is from a general. + // General entities are used for common and dynamic data that can be referenced across different entities. + if (rootEntityType == RootEntityType.ROOT_GENERAL) { + fillGeneralValues(documentVariables, properties, propertyKey); + } + Object entity = entities.getEntity(rootEntityType); if (entity instanceof HasUuid) { if (documentWorkflow.isDocx() || propertyKey.contains(propertySeparator)) { @@ -284,6 +294,49 @@ private Properties prepareProperties( return properties; } + /** + * Fills general values into the properties based on the provided document variables and properties. + * + * @param documentVariables + * The document variables to use for filling general values. + * @param properties + * The properties to fill with general values. + * @param propertyKey + * The property key to use for general value retrieval. + */ + private void fillGeneralValues(DocumentVariables documentVariables, Properties properties, String propertyKey) { + // finding the general property key. Based on the type, formatStyle is deciding. + // general properties are allowed only doc-formatted files. + Optional generalPropertyOpt = documentVariables.getVariables() + .stream() + .filter(e -> e.startsWith(RootEntityType.ROOT_GENERAL.getEntityName() + ".")) + .filter(e -> e.equals(propertyKey)) + .findAny(); + + if (generalPropertyOpt.isPresent()) { + String generalProperty = generalPropertyOpt.get(); + String dateType = generalProperty.substring(generalProperty.lastIndexOf('.') + 1); + FormatStyle formatStyle; + switch (dateType) { + case "long": + formatStyle = FormatStyle.LONG; + break; + case "full": + formatStyle = FormatStyle.FULL; + break; + case "medium": + formatStyle = FormatStyle.MEDIUM; + break; + case "short": + default: + formatStyle = FormatStyle.SHORT; + } + String propertyValue = + LocalDate.now().format(DateTimeFormatter.ofLocalizedDate(formatStyle).withLocale(I18nProperties.getUserLanguage().getLocale())); + properties.setProperty(generalProperty, propertyValue); + } + } + private byte[] generateDocumentDocx(File templateFile, Properties properties) throws DocumentTemplateException { return templateEngine.generateDocumentDocx(properties, templateFile); }