From 41b8e8b8213390fb9b25a65dc8d1aec913cb98e8 Mon Sep 17 00:00:00 2001 From: corinaolariu Date: Mon, 9 Dec 2024 14:55:10 +0200 Subject: [PATCH] RED-10553 - New report placeholder for section headline - add new placeholder: headline {{redaction.entity.closestHeadline}} to excel reports --- .../v1/server/model/ReportRedactionEntry.java | 2 +- .../service/EntityLogConverterService.java | 3 ++- .../service/ExcelReportGenerationService.java | 5 ++++- .../v1/server/service/PlaceholderService.java | 4 +++- .../RedactionReportIntegrationTest.java | 3 ++- .../Excel QC (incl. Skipped Redactions).xlsx | Bin 9486 -> 9447 bytes .../resources/templates/Excel Report.xlsx | Bin 6495 -> 9406 bytes 7 files changed, 12 insertions(+), 5 deletions(-) diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/ReportRedactionEntry.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/ReportRedactionEntry.java index 360e175..90452de 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/ReportRedactionEntry.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/model/ReportRedactionEntry.java @@ -19,5 +19,5 @@ public class ReportRedactionEntry { private String value; private String entityDisplayName; private boolean isSkipped; - + private String entityClosestHeadline; } diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/EntityLogConverterService.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/EntityLogConverterService.java index d7beb99..1c74bd3 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/EntityLogConverterService.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/EntityLogConverterService.java @@ -176,7 +176,8 @@ public class EntityLogConverterService { entry.getValue(), mapOfEntityDisplayName.get(entry.getType()) == null ? entry.getType() : mapOfEntityDisplayName.get(entry.getType()), - entry.getState() == EntryState.SKIPPED || entry.getState() == EntryState.IGNORED)); + entry.getState() == EntryState.SKIPPED || entry.getState() == EntryState.IGNORED, + entry.getClosestHeadline())); } } }); diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ExcelReportGenerationService.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ExcelReportGenerationService.java index ceaa1ed..f076e41 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ExcelReportGenerationService.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/ExcelReportGenerationService.java @@ -25,6 +25,7 @@ import static com.iqser.red.service.redaction.report.v1.server.service.Placehold import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.PARAGRAPH_INDEX_PLACEHOLDER; import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.PARAGRAPH_PLACEHOLDER; import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.REDACTION_ENTITY_DISPLAY_NAME_PLACEHOLDER; +import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.REDACTION_ENTITY_HEADLINE_PLACEHOLDER; import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.REDACTION_VALUE_PLACEHOLDER; import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.RSS_PLACEHOLDER_BASE; import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.SCM_FUNCTION_PLACEHOLDER; @@ -103,7 +104,8 @@ public class ExcelReportGenerationService { SKIPPED_PLACEHOLDER, FILE_ATTRIBUTES_PLACEHOLDER, INDEX_PLACEHOLDER, - COMPONENT_PLACEHOLDER); + COMPONENT_PLACEHOLDER, + REDACTION_ENTITY_HEADLINE_PLACEHOLDER); private final ScmReportService componentReportService; private final FileAttributesConfigClient fileAttributesConfigClient; @@ -538,6 +540,7 @@ public class ExcelReportGenerationService { .getEntityDisplayName(); case REDACTION_ENTITY_DISPLAY_NAME_PLACEHOLDER -> input -> input.getEntry().getEntityDisplayName(); case SKIPPED_PLACEHOLDER -> input -> input.getEntry().isSkipped() ? "true" : "false"; + case REDACTION_ENTITY_HEADLINE_PLACEHOLDER -> input -> input.getEntry().getEntityClosestHeadline(); default -> input -> ""; }; diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/PlaceholderService.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/PlaceholderService.java index 4db3f4f..706575a 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/PlaceholderService.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/main/java/com/iqser/red/service/redaction/report/v1/server/service/PlaceholderService.java @@ -58,6 +58,8 @@ public class PlaceholderService { public static final String FILE_ATTRIBUTES_PLACEHOLDER = "{{file.attributes}}"; public static final String INDEX_PLACEHOLDER = "{{index}}"; + public static final String REDACTION_ENTITY_HEADLINE_PLACEHOLDER = "{{redaction.entity.closestHeadline}}"; + public static final DateTimeFormatter FORMAT_DATE_ISO = DateTimeFormatter.ofPattern("yyyy-MM-dd"); public static final DateTimeFormatter FORMAT_DATE_GER = DateTimeFormatter.ofPattern("dd.MM.yyyy"); public static final DateTimeFormatter FORMAT_DATE_ENG = DateTimeFormatter.ofPattern("MM/dd/yyyy"); @@ -93,7 +95,7 @@ public class PlaceholderService { SEEDS_FUNCTION_REDACTION_GROUPED_BY_JUSTIFICATION_PAGES_PLACEHOLDER, SEEDS_FUNCTION_JUSTIFICATION_PLACEHOLDER, REDACTION_ENTITY_DISPLAY_NAME_PLACEHOLDER, - SKIPPED_PLACEHOLDER); + SKIPPED_PLACEHOLDER, REDACTION_ENTITY_HEADLINE_PLACEHOLDER); private final ReportTemplateClient reportTemplateClient; private final ReportStorageService reportStorageService; diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportIntegrationTest.java b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportIntegrationTest.java index 0e324cd..f3a0106 100644 --- a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportIntegrationTest.java +++ b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/java/com/iqser/red/service/redaction/report/v1/server/RedactionReportIntegrationTest.java @@ -7,6 +7,7 @@ import static com.iqser.red.service.redaction.report.v1.server.service.Placehold import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.FORMAT_DATE_ISO_PLACEHOLDER; import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.FORMAT_TIME_ISO_PLACEHOLDER; import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.IUCLID_FUNCTION_PLACEHOLDER; +import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.REDACTION_ENTITY_HEADLINE_PLACEHOLDER; import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.SEEDS_FUNCTION_JUSTIFICATION_PLACEHOLDER; import static com.iqser.red.service.redaction.report.v1.server.service.PlaceholderService.SEEDS_FUNCTION_REDACTION_GROUPED_BY_JUSTIFICATION_PAGES_PLACEHOLDER; import static com.iqser.red.service.redaction.report.v1.server.utils.OsUtils.getTemporaryDirectory; @@ -742,7 +743,7 @@ public class RedactionReportIntegrationTest { DOSSIER_NAME_PLACEHOLDER, IUCLID_FUNCTION_PLACEHOLDER, SEEDS_FUNCTION_REDACTION_GROUPED_BY_JUSTIFICATION_PAGES_PLACEHOLDER, - SEEDS_FUNCTION_JUSTIFICATION_PLACEHOLDER)); + SEEDS_FUNCTION_JUSTIFICATION_PLACEHOLDER, REDACTION_ENTITY_HEADLINE_PLACEHOLDER)); defaultPlaceHolder.addAll(dossierAttributes.keySet()); defaultPlaceHolder.addAll(fileAttributes.keySet()); return new PlaceholderModel(defaultPlaceHolder, imagePlaceholders, dossierAttributes, null, fileAttributes, new HashMap<>()); diff --git a/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/Excel QC (incl. Skipped Redactions).xlsx b/redaction-report-service-v1/redaction-report-service-server-v1/src/test/resources/templates/Excel QC (incl. Skipped Redactions).xlsx index 880779f5e445cfa89f40cb2013f49ff7c63f5a63..235a8632b82ef8cfd62f360d2abe487e81a1b29b 100644 GIT binary patch delta 3803 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 delta 3852 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 literal 6495 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 Wq;L-*A^-pu;^T*ys{!JFJ^c?YH~iNC