From f66c33410095ffbf4623069d87c264407fd61689 Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 29 Dec 2022 14:51:41 +0300 Subject: [PATCH] ROOT_(NEW/CLOS/ACTV/BLKD/SSPD) notification, prepared for test --- .../ROOT_ACTV_NotificationBuilder.java | 111 ++++++++++++++++ .../ROOT_BLKD_NotificationBuilder.java | 111 ++++++++++++++++ .../ROOT_CLOS_NotificationBuilder.java | 123 ++++++++++++++++++ .../ROOT_NEW_NotificationBuilder.java | 123 ++++++++++++++++++ .../ROOT_SSPD_NotificationBuilder.java | 111 ++++++++++++++++ .../templates/ROOT.ACTV_TEMPLATE.docx | Bin 0 -> 10469 bytes .../templates/ROOT.BLKD_TEMPLATE.docx | Bin 0 -> 10331 bytes .../templates/ROOT.CLOS_TEMPLATE.docx | Bin 0 -> 10390 bytes .../templates/ROOT.NEW_TEMPLATE.docx | Bin 0 -> 10401 bytes .../templates/ROOT.SSPD_TEMPLATE.docx | Bin 0 -> 10372 bytes 10 files changed, 579 insertions(+) create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_CLOS_NotificationBuilder.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_NEW_NotificationBuilder.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java create mode 100644 clearing-parent/reports-service/src/main/resources/templates/ROOT.ACTV_TEMPLATE.docx create mode 100644 clearing-parent/reports-service/src/main/resources/templates/ROOT.BLKD_TEMPLATE.docx create mode 100644 clearing-parent/reports-service/src/main/resources/templates/ROOT.CLOS_TEMPLATE.docx create mode 100644 clearing-parent/reports-service/src/main/resources/templates/ROOT.NEW_TEMPLATE.docx create mode 100644 clearing-parent/reports-service/src/main/resources/templates/ROOT.SSPD_TEMPLATE.docx diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java new file mode 100644 index 000000000..5dbf69886 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_ACTV_NotificationBuilder.java @@ -0,0 +1,111 @@ +package ru.spcex.clearing.reports.notifications; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import ru.clearing.classes.objects.BusinessObject; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.company.relation.Relation; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.io.File; +import java.time.Instant; +import java.time.LocalDate; +import java.util.*; + +@Component +public class ROOT_ACTV_NotificationBuilder extends NotificationBuilder { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Imdg companyImdg; + private final Imdg relationImdg; + private final Imdg companySymbolsImdg; + + public ROOT_ACTV_NotificationBuilder(ImdgProvider imdgProvider) { + super(null); + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); + companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + } + + @Override + public File buildNotification(Long consumerId) { + Company company = companyImdg.getSingleObjectByID(consumerId); + if (company == null) { + log.error("Company for companyId={} is null", consumerId); + return null; + } + String companyClearingCode = company.getClearingCode(); + if (StringUtils.isBlank(companyClearingCode)) { + log.error("Company.clearing_code for companyId={} is null", consumerId); + return null; + } + + String relationsSql = "consumerId = %d".formatted(consumerId); + Relation relation = null; + Collection relations = relationImdg.getCollectionObjectsBySQL(relationsSql); + if (relations.size() >= 1) { + Optional relationOptional = relations.stream().max(Comparator.comparing(BusinessObject::getUpdated)); + relation = relationOptional.get(); + } else { + log.warn("Relation with sql {} not found", relationsSql); + return null; + } + Long notificationId = relation.getId(); + Instant updatedAt = relation.getUpdated(); + if (updatedAt == null) { + log.error("updated_at is null for relation {}", relation); + return null; + } + + String companySymbolsSql = "companyId = %d AND companySymbol = INN"; + CompanySymbols companySymbols = null; + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); + if (companySymbolsCollection.size() >= 1) { + companySymbols = companySymbolsCollection.iterator().next(); + } else { + log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + return null; + } + + LocalDate notificationDate = LocalDate.now(); + int day = notificationDate.getDayOfMonth(); + int month = notificationDate.getMonthValue(); + int year = notificationDate.getYear(); + String dateStr = "%02d%02d%04d".formatted(day, month, year); + + Map valuesForTemplate = new HashMap<>(); + valuesForTemplate.put("${dateStr}", dateStr); + valuesForTemplate.put("${count}", String.valueOf(notificationId)); + valuesForTemplate.put("${currDay}", "%02d".formatted(day)); + valuesForTemplate.put("${currMonth}", "%02d".formatted(month)); + valuesForTemplate.put("${currYear}", "%04d".formatted(year % 100)); + + valuesForTemplate.put("${companyFullName}", company.getFullName()); + valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); + valuesForTemplate.put("${companyClearingCode}", companyClearingCode); + valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt)); + + String outputFilename = "ROOT.ACTV.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(notificationDate)); + outputFilename = normalizeFilenameForOS(outputFilename); + + File outputFile = new File(outputFilename); + try { + docxService.insertValues(outputFile, valuesForTemplate, true); + } catch (Exception e) { + log.error("Can't insert values into template.", e); + return null; + } + + return outputFile; + } + + @Override + protected String getTemplateResourceName() { + return "templates/ROOT.ACTV_TEMPLATE.docx"; + } + +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java new file mode 100644 index 000000000..7b619e177 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_BLKD_NotificationBuilder.java @@ -0,0 +1,111 @@ +package ru.spcex.clearing.reports.notifications; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import ru.clearing.classes.objects.BusinessObject; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.company.relation.Relation; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.io.File; +import java.time.Instant; +import java.time.LocalDate; +import java.util.*; + +@Component +public class ROOT_BLKD_NotificationBuilder extends NotificationBuilder { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Imdg companyImdg; + private final Imdg relationImdg; + private final Imdg companySymbolsImdg; + + public ROOT_BLKD_NotificationBuilder(ImdgProvider imdgProvider) { + super(null); + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); + companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + } + + @Override + public File buildNotification(Long consumerId) { + Company company = companyImdg.getSingleObjectByID(consumerId); + if (company == null) { + log.error("Company for companyId={} is null", consumerId); + return null; + } + String companyClearingCode = company.getClearingCode(); + if (StringUtils.isBlank(companyClearingCode)) { + log.error("Company.clearing_code for companyId={} is null", consumerId); + return null; + } + + String relationsSql = "consumerId = %d".formatted(consumerId); + Relation relation = null; + Collection relations = relationImdg.getCollectionObjectsBySQL(relationsSql); + if (relations.size() >= 1) { + Optional relationOptional = relations.stream().max(Comparator.comparing(BusinessObject::getUpdated)); + relation = relationOptional.get(); + } else { + log.warn("Relation with sql {} not found", relationsSql); + return null; + } + Long notificationId = relation.getId(); + Instant updatedAt = relation.getUpdated(); + if (updatedAt == null) { + log.error("updated_at is null for relation {}", relation); + return null; + } + + String companySymbolsSql = "companyId = %d AND companySymbol = INN"; + CompanySymbols companySymbols = null; + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); + if (companySymbolsCollection.size() >= 1) { + companySymbols = companySymbolsCollection.iterator().next(); + } else { + log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + return null; + } + + LocalDate notificationDate = LocalDate.now(); + int day = notificationDate.getDayOfMonth(); + int month = notificationDate.getMonthValue(); + int year = notificationDate.getYear(); + String dateStr = "%02d%02d%04d".formatted(day, month, year); + + Map valuesForTemplate = new HashMap<>(); + valuesForTemplate.put("${dateStr}", dateStr); + valuesForTemplate.put("${count}", String.valueOf(notificationId)); + valuesForTemplate.put("${currDay}", "%02d".formatted(day)); + valuesForTemplate.put("${currMonth}", "%02d".formatted(month)); + valuesForTemplate.put("${currYear}", "%04d".formatted(year % 100)); + + valuesForTemplate.put("${companyFullName}", company.getFullName()); + valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); + valuesForTemplate.put("${companyClearingCode}", companyClearingCode); + valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt)); + + String outputFilename = "ROOT.BLKD.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(notificationDate)); + outputFilename = normalizeFilenameForOS(outputFilename); + + File outputFile = new File(outputFilename); + try { + docxService.insertValues(outputFile, valuesForTemplate, true); + } catch (Exception e) { + log.error("Can't insert values into template.", e); + return null; + } + + return outputFile; + } + + @Override + protected String getTemplateResourceName() { + return "templates/ROOT.BLKD_TEMPLATE.docx"; + } + +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_CLOS_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_CLOS_NotificationBuilder.java new file mode 100644 index 000000000..e84ee9b06 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_CLOS_NotificationBuilder.java @@ -0,0 +1,123 @@ +package ru.spcex.clearing.reports.notifications; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.profile.ProfileDocument; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.io.File; +import java.time.LocalDate; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +@Component +public class ROOT_CLOS_NotificationBuilder extends NotificationBuilder { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Imdg profileDocumentImdg; + private final Imdg companyImdg; + private final Imdg companySymbolsImdg; + + public ROOT_CLOS_NotificationBuilder(ImdgProvider imdgProvider) { + super(null); + profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class); + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + } + + @Override + public File buildNotification(Long consumerId) { + String sql = "companyId = %d AND documentType = 'CNTR'".formatted(consumerId); + Collection profileDocuments = profileDocumentImdg.getCollectionObjectsBySQL(sql); + ProfileDocument currentProfileDocument = null; + if (profileDocuments.size() >= 1) { + Optional profileDocumentOptional = profileDocuments.stream().max((o1, o2) -> { + LocalDate o1ValidFromDate = o1.getValidFromDate(); + LocalDate o2ValidFromDate = o2.getValidFromDate(); + o1ValidFromDate = o1ValidFromDate == null ? LocalDate.MIN : o1ValidFromDate; + o2ValidFromDate = o2ValidFromDate == null ? LocalDate.MIN : o2ValidFromDate; + return o1ValidFromDate.compareTo(o2ValidFromDate); + }); + currentProfileDocument = profileDocumentOptional.get(); + } else { + log.warn("Profile_document with sql {} not found", sql); + return null; + } + + Long notificationId = currentProfileDocument.getId(); + LocalDate validFromDate = currentProfileDocument.getValidFromDate(); + if (validFromDate == null) { + log.error("validFromDate is null for profile_document {}", currentProfileDocument); + return null; + } + Long companyId = currentProfileDocument.getCompanyId(); + if (companyId == null) { + log.error("companyId is null for profile_document {}", currentProfileDocument); + return null; + } + Company company = companyImdg.getSingleObjectByID(companyId); + if (company == null) { + log.error("Company for companyId={} is null", companyId); + return null; + } + String companyClearingCode = company.getClearingCode(); + if (StringUtils.isBlank(companyClearingCode)) { + log.error("Company.clearing_code for companyId={} is null", companyId); + return null; + } + + String companySymbolsSql = "companyId = %d AND companySymbol = INN"; + CompanySymbols companySymbols = null; + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); + if (companySymbolsCollection.size() >= 1) { + companySymbols = companySymbolsCollection.iterator().next(); + } else { + log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + return null; + } + + LocalDate notificationDate = LocalDate.now(); + int day = notificationDate.getDayOfMonth(); + int month = notificationDate.getMonthValue(); + int year = notificationDate.getYear(); + String dateStr = "%02d%02d%04d".formatted(day, month, year); + + Map valuesForTemplate = new HashMap<>(); + valuesForTemplate.put("${dateStr}", dateStr); + valuesForTemplate.put("${count}", String.valueOf(notificationId)); + valuesForTemplate.put("${currDay}", "%02d".formatted(day)); + valuesForTemplate.put("${currMonth}", "%02d".formatted(month)); + valuesForTemplate.put("${currYear}", "%04d".formatted(year % 100)); + valuesForTemplate.put("${companyFullName}", company.getFullName()); + valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); + valuesForTemplate.put("${companyClearingCode}", companyClearingCode); + valuesForTemplate.put("${profileDocumentNumber}", currentProfileDocument.getNumber()); + valuesForTemplate.put("${validFromDate}", dateFormatter.format(validFromDate)); + + String outputFilename = "ROOT.CLOS.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(notificationDate)); + outputFilename = normalizeFilenameForOS(outputFilename); + + File outputFile = new File(outputFilename); + try { + docxService.insertValues(outputFile, valuesForTemplate, true); + } catch (Exception e) { + log.error("Can't insert values into template.", e); + return null; + } + + return outputFile; + } + + @Override + protected String getTemplateResourceName() { + return "templates/ROOT.CLOS_TEMPLATE.docx"; + } + +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_NEW_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_NEW_NotificationBuilder.java new file mode 100644 index 000000000..a698ce90c --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_NEW_NotificationBuilder.java @@ -0,0 +1,123 @@ +package ru.spcex.clearing.reports.notifications; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.profile.ProfileDocument; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.io.File; +import java.time.LocalDate; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +@Component +public class ROOT_NEW_NotificationBuilder extends NotificationBuilder { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Imdg profileDocumentImdg; + private final Imdg companyImdg; + private final Imdg companySymbolsImdg; + + public ROOT_NEW_NotificationBuilder(ImdgProvider imdgProvider) { + super(null); + profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class); + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + } + + @Override + public File buildNotification(Long consumerId) { + String sql = "companyId = %d AND documentType = 'CNTR'".formatted(consumerId); + Collection profileDocuments = profileDocumentImdg.getCollectionObjectsBySQL(sql); + ProfileDocument currentProfileDocument = null; + if (profileDocuments.size() >= 1) { + Optional profileDocumentOptional = profileDocuments.stream().max((o1, o2) -> { + LocalDate o1ValidFromDate = o1.getValidFromDate(); + LocalDate o2ValidFromDate = o2.getValidFromDate(); + o1ValidFromDate = o1ValidFromDate == null ? LocalDate.MIN : o1ValidFromDate; + o2ValidFromDate = o2ValidFromDate == null ? LocalDate.MIN : o2ValidFromDate; + return o1ValidFromDate.compareTo(o2ValidFromDate); + }); + currentProfileDocument = profileDocumentOptional.get(); + } else { + log.warn("Profile_document with sql {} not found", sql); + return null; + } + + Long notificationId = currentProfileDocument.getId(); + LocalDate validFromDate = currentProfileDocument.getValidFromDate(); + if (validFromDate == null) { + log.error("validFromDate is null for profile_document {}", currentProfileDocument); + return null; + } + Long companyId = currentProfileDocument.getCompanyId(); + if (companyId == null) { + log.error("companyId is null for profile_document {}", currentProfileDocument); + return null; + } + Company company = companyImdg.getSingleObjectByID(companyId); + if (company == null) { + log.error("Company for companyId={} is null", companyId); + return null; + } + String companyClearingCode = company.getClearingCode(); + if (StringUtils.isBlank(companyClearingCode)) { + log.error("Company.clearing_code for companyId={} is null", companyId); + return null; + } + + String companySymbolsSql = "companyId = %d AND companySymbol = INN"; + CompanySymbols companySymbols = null; + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); + if (companySymbolsCollection.size() >= 1) { + companySymbols = companySymbolsCollection.iterator().next(); + } else { + log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + return null; + } + + LocalDate notificationDate = LocalDate.now(); + int day = notificationDate.getDayOfMonth(); + int month = notificationDate.getMonthValue(); + int year = notificationDate.getYear(); + String dateStr = "%02d%02d%04d".formatted(day, month, year); + + Map valuesForTemplate = new HashMap<>(); + valuesForTemplate.put("${dateStr}", dateStr); + valuesForTemplate.put("${count}", String.valueOf(notificationId)); + valuesForTemplate.put("${currDay}", "%02d".formatted(day)); + valuesForTemplate.put("${currMonth}", "%02d".formatted(month)); + valuesForTemplate.put("${currYear}", "%04d".formatted(year % 100)); + valuesForTemplate.put("${companyFullName}", company.getFullName()); + valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); + valuesForTemplate.put("${companyClearingCode}", companyClearingCode); + valuesForTemplate.put("${profileDocumentNumber}", currentProfileDocument.getNumber()); + valuesForTemplate.put("${validFromDate}", dateFormatter.format(validFromDate)); + + String outputFilename = "ROOT.NEW.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(notificationDate)); + outputFilename = normalizeFilenameForOS(outputFilename); + + File outputFile = new File(outputFilename); + try { + docxService.insertValues(outputFile, valuesForTemplate, true); + } catch (Exception e) { + log.error("Can't insert values into template.", e); + return null; + } + + return outputFile; + } + + @Override + protected String getTemplateResourceName() { + return "templates/ROOT.NEW_TEMPLATE.docx"; + } + +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java new file mode 100644 index 000000000..9497e3631 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/ROOT_SSPD_NotificationBuilder.java @@ -0,0 +1,111 @@ +package ru.spcex.clearing.reports.notifications; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import ru.clearing.classes.objects.BusinessObject; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.company.relation.Relation; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.io.File; +import java.time.Instant; +import java.time.LocalDate; +import java.util.*; + +@Component +public class ROOT_SSPD_NotificationBuilder extends NotificationBuilder { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Imdg companyImdg; + private final Imdg relationImdg; + private final Imdg companySymbolsImdg; + + public ROOT_SSPD_NotificationBuilder(ImdgProvider imdgProvider) { + super(null); + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); + companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + } + + @Override + public File buildNotification(Long consumerId) { + Company company = companyImdg.getSingleObjectByID(consumerId); + if (company == null) { + log.error("Company for companyId={} is null", consumerId); + return null; + } + String companyClearingCode = company.getClearingCode(); + if (StringUtils.isBlank(companyClearingCode)) { + log.error("Company.clearing_code for companyId={} is null", consumerId); + return null; + } + + String relationsSql = "consumerId = %d".formatted(consumerId); + Relation relation = null; + Collection relations = relationImdg.getCollectionObjectsBySQL(relationsSql); + if (relations.size() >= 1) { + Optional relationOptional = relations.stream().max(Comparator.comparing(BusinessObject::getUpdated)); + relation = relationOptional.get(); + } else { + log.warn("Relation with sql {} not found", relationsSql); + return null; + } + Long notificationId = relation.getId(); + Instant updatedAt = relation.getUpdated(); + if (updatedAt == null) { + log.error("updated_at is null for relation {}", relation); + return null; + } + + String companySymbolsSql = "companyId = %d AND companySymbol = INN"; + CompanySymbols companySymbols = null; + Collection companySymbolsCollection = companySymbolsImdg.getCollectionObjectsBySQL(companySymbolsSql); + if (companySymbolsCollection.size() >= 1) { + companySymbols = companySymbolsCollection.iterator().next(); + } else { + log.warn("CompanySymbols with sql {} not found", companySymbolsSql); + return null; + } + + LocalDate notificationDate = LocalDate.now(); + int day = notificationDate.getDayOfMonth(); + int month = notificationDate.getMonthValue(); + int year = notificationDate.getYear(); + String dateStr = "%02d%02d%04d".formatted(day, month, year); + + Map valuesForTemplate = new HashMap<>(); + valuesForTemplate.put("${dateStr}", dateStr); + valuesForTemplate.put("${count}", String.valueOf(notificationId)); + valuesForTemplate.put("${currDay}", "%02d".formatted(day)); + valuesForTemplate.put("${currMonth}", "%02d".formatted(month)); + valuesForTemplate.put("${currYear}", "%04d".formatted(year % 100)); + + valuesForTemplate.put("${companyFullName}", company.getFullName()); + valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); + valuesForTemplate.put("${companyClearingCode}", companyClearingCode); + valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt)); + + String outputFilename = "ROOT.SSPD.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(notificationDate)); + outputFilename = normalizeFilenameForOS(outputFilename); + + File outputFile = new File(outputFilename); + try { + docxService.insertValues(outputFile, valuesForTemplate, true); + } catch (Exception e) { + log.error("Can't insert values into template.", e); + return null; + } + + return outputFile; + } + + @Override + protected String getTemplateResourceName() { + return "templates/ROOT.SSPD_TEMPLATE.docx"; + } + +} diff --git a/clearing-parent/reports-service/src/main/resources/templates/ROOT.ACTV_TEMPLATE.docx b/clearing-parent/reports-service/src/main/resources/templates/ROOT.ACTV_TEMPLATE.docx new file mode 100644 index 0000000000000000000000000000000000000000..135d87f99c099810c631a84a2ea357941569c361 GIT binary patch literal 10469 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 CVYmMP literal 0 HcmV?d00001 diff --git a/clearing-parent/reports-service/src/main/resources/templates/ROOT.BLKD_TEMPLATE.docx b/clearing-parent/reports-service/src/main/resources/templates/ROOT.BLKD_TEMPLATE.docx new file mode 100644 index 0000000000000000000000000000000000000000..b5463419d1bca976faf221c7a57f99d37e06c985 GIT binary patch literal 10331 zcmai41z29Wwnd7&Q>?|^-QC^Y-QAty?#12RDems>ZUu@v6nN0N_fBW-d-L}HCEtHe zvUZZa&&kB?e3j54!1|sh8~T z+@L66P}>$fnJVJx6Fqtgnkpeupti9t1KBL2)P+O;aBzU1w}$oH?p7F&4F*!$>>KK* zd)%G1>3CPy8YJ0hqHR){FL3!?uVPqg5K<`S-Y02HMC%|0KfrFr{!(q276!fEbq08= z+4Pj=`G=3yw5nyfUtK+UkyB>O%R)qkfI1}x46$0jLPH$OaK1*NuYj-Nl}7(Ve33Z) zrs3q{+2>Pt!8VKR7hJm%djGeWOJ+;2IogtNrrA2_; zm=q>0eEStL`3Cc?6(35OLCkU}l89m|c<-1?P;b?7y~V-VJm#5CuP-x?EIBUT1@wNz zkzM$nd~u_;QeqWauMr|2c|NX9 zM2eAQ!*8hJilxC$v8>jFa}sF0pAXO>NqE)1#7X&i+f#m@{vin-<2)+2nBdnoOSD+? zRj97FPj5=q0eJ2%b2F@V##(n)WzbC#ONMEYk*^8V2sf$~U@g%c?_ftHCMgmpz-W<>Di{z3cKkky~Q?lkke(SZwK>k*9&xC zvwWdoL5>x@BB18wNEQ4A(4|Aij_!(h_?qH{4K^ONBubk`f8uAV2Gk&TMQcA!S#tKO z?yDvrMxk(Sp0K-Tiqi&VHUfA8Rvb<6~H1Mrgp(NX4Y5r`I(dPag13z9TYF8;6Q#5By5>N3y2`&fdSc6~W^ZhyVPJ_Vt)KH*M7xGIb#VN%_CP6G zoE9|jL4t<>!zezRvlb$oTGRiK>f#b`!=UI zS{hn8ypQdVsaI~~ZGiBtPbj))Oy!}$3^#aw%Eh1HXHI}u2nb5QZ(u6a`2`2z7&Ecc zOE76_HYcV}J@lIZiXsE^mrG227whEO2uG_L7CMAg7u^b}#5`7AoYLZvH29k4uBcD! zX+UvALmF{R0P>y8DxYl_@_``oVD*Oa^V6ik3ZKskDn!*!vx`rb@`(}M^|FPqjGon- z85NX|StObP1e?COS-?MAo()8vrcH+TviqF<&~C_k9VTI;Nq!o31Q1`5cUugCBRjcc zuWo&j$oMEk`pQ!E1N7ZGP6j2Gvu|Vn`j1|JpJsnq=XblDsA)^D3c-7y6{@JZewOPR z$dut>#RI~NnEl+#Tgr910)Un7#|%Q4(!D=Lk1Co@@ZmsgAa$MDCx z-W8Z5=t;RDIuVZDsIYD3#IgW`mnc; zC?i)$mNQQg+$W2o9Y?xC<#I-D;TXMlT?mob5yv_sl5-CGu(Z0x#0lrH^ff~^^`?U- zf#Cw9lo2oNWb*WEo#Bh_Vo=|YM^7e|i*%waOvyVk8^pswwQ|O2Vd>SuYD;~IIrn)5 z!V)bnQc~^{Wz#v&jOU~>u_ZHmqx7LQs9NH;a$ukUk#SAanZV7nMaEKEuX3)ZPBZK=7+lAI^Y@`6**x?K@R&$16u#G(3+Xj!8u+|| zR8094mc=sikH)h~SUf>S{>WKhciRm{Xry0ggz6AsEgWCJ93@k}mCfqVhhCICRQ#@7 zlQcnGgdDF&^?ZqEka0iMPb(c!+zczvZnH|{#WyIpohiJ1B+5#^@Wo!8DUY_fmqMOt z#0CsSGDh@?NYjO&C$B7nVbe-rVb}EayWI|+4rHuVp8kM*UXT3OZ*4FF`gVXzF$E=t z(?>Lptho(%_c%-dr_-Mj#fg9*6tQed`r=#X=W>6_5>&y9{=m}M_8+><*bF-u64Is6 z7P}8L+^ZKI!R5lhS7hMD{voEBfV;4fu77_Piw{P88h$Y1gc-x*5##}NP_JvDE@*U; ze@QZ5%&J8=Dj9 zEbrGP(LPwbZQ5-lCdoS9YV`4dMz)u>2XImo0ldN~eqO$4(j}r#!?<$i63gI@D$#C85{z-u+Q zGoU9)fp63plRMPaHMuoI(bum6u_~Yzt%#1*k-cW&5zQ)4Xa0>cE}X6Sw4kIW<&Isk zCrMGjli=XFv_@s!K*t#F2iv||y3(lSaAV468Boji!5&F#M+{3(ZBXEa+a1x0qaDM&y zMbM`zt^s;5p~y3P5^_3(Oo2l~!&8pfd?ss!tNv`RscuWaamm^>Gt#kw1O5pXx0a^8BHa~3cpGg`xRk{Af% z!m0hNRn|DeO`y?xTG7FkS5g4mB`LM;%*e3m#&`D}ThU*jx`U<3pt zO1n`$K$)l>xkH*mtOLVfJNWUEv=%c}SL%hm2xZxuk6OwZ`!3*dYkZt7pyQbZZHTjpJPwpK(R4t&xg4Zw~_;u zB`zkP5Ueh>w`v-EaAtTX{L%n}(BkO=i)GZLSC2-$XjA^IdPuLAsTdb7BIo*=m~^Xi zUsR=^(yBAQ#XTWH2&9&;PVi*t=C0pFjH8&CIQ*tu|L)7{uT_P?7JOzEC;&hU^*;pz zaR2_?**mye7}~!F0dwhNb}NGj181&~$kIby1tPNXyK1iDu_uElL-Q%q&30Ho{I*J; z1G|C@PiPNTuK-+q%k$)lm&=FgO*Tlr0P?`jqJwjOS5$;uN8!DNqrW;kP3}Kn-tf{4 zSVzMl<`WYBGBuL!JAkhZir37Fp`qR8ZcB3>8!re5W!M`9ddKn6KIOi)P2E_q^Wyg5$s87iGtwSs53b)YjH?0ogLYb?o6GOS2vr-B|7 zq^Yd#a3X*@L@x@YCK2sNJI461fb%9H(yOV+7jqOPpM;HkTyoS6qhqwtMx)}SFqyo& zW?EqDy$&~Tq@koS{yFuzj4t!J1)fLidp|?nl-*A|Bj0|icul{$6X!BqoN86~qHUYl z4D-=O_3>D$;s}d+LK%y?rGYE0d?yzE!VB_Eu3VW?1!69#cD4Op(9D7hffr`pBBK@YB*l$ouN@%QE~xIyv4n+l#n`J{m(X4j^Aa`d2>uKvrw~>S z!j6!DoS>w1-4{{xv=|0eeR+CiOFk|lf$_NJKN84XM!9bZ%UwQ;2YBM zq~Kcd-eh>&+h7)Xym2ms1E1iTIr5V`J-hKJJ@BoKwf3^Gz}9?cbkXSoS|s3sVE2&dpq z3(I>|*@HhLfZ~_xedO8EOPT9nnoN4h_wB!~gk~u4*3~f)ViX{ZFv%0cnDR+r$gw5= z8E3ZocJb}kh3WIaiC7-4cPsQqM{Xx)jA4Jgt+8Io-dUimR|k0<`Wq_MQ7gR$Ew=|; zi^;zAC)Sv*HfKTFLQ4^aW49B$!jc8N;YT==2q6>=OdMGkOBVsahOHa8YN&dNaWoTS zhMQ4})WQhfl{T`ZY8rCXy64=8{AW%JOn@_iwCDg{`ozvJ+`A)7^f~$K4GGVf4Td*x zr30!Vb*_Z5Sqa(K)~3_vOV23-B@`_ul5WI3GV2#Uku2i+s`n`$FL!JYqP<(xs8#V0 zeZF(eb;Niz3@f(i9IsY-!eLrf>R7aFdL z1M&0OnClf-5;#f`0c#EE<~Hg3d30bpq@QTP=OLfqyu@TYL<0Mw{pXO43BoX7jAg^o zFmZl4DS@==Ikvn|$^^7Cg%?~E7}NDT3e*Q%+>)$jJl~H&FmVR@5XzGX7<*k>V~eE3A~#=J#mz@eSWlbXyvSL6Y|61 zvhKo(P_}mU*aYH^)pOadMXW;g)Va?8iQ~Ho1l4VNLthUj>IM^Aw^!<`g&9ZK)k$MU zQe`-%^UA&m<_Hnms`XWlT9L~@duAr3&yhpe#}?1V&FU5XoI$BB|G4yN)`}m&4FFHQ z9l?1Q=r>3Q9n8woKCRq`X{;S129Q$nQ7s#@H(HcwIsWbuX=|s%6=tgaT#@NB5!h3# zXNw5wNYU6+q)4h`vZO;&hiR!lg2zRNBYBL;S@1V&Q0fK@$xY5;%Rl!Ks^6%9yjA}S z?DT<61{Vmsh*JsD=>wUJZ z=?jVQohJa?A&afzq7n1akOTIUaT_<6KJOQ`g-V)VY!F&3%@V&Wr-N8H{WHio@ ze^Ge~CItHbwa53r^wZ`GC!I_-CzVWgn|Kyq=v(@25WzhE>a&b5ihawaWtt%V)x=yFewJ>_y1Q>G7!Y zJGRIf2YXM_&vi|?yo-%U%d3cHhMWx>stoMerEX4q${$ZY#Ahf$YpJk9mRDi#5ivs3 zm(8B~ni1>d2Yw(f2JF`~3${zd$XU$`3_&1gB+$usk{);Ri<<@5p<)zZ6^D_vlItmk z{#6qAp=_3u*ns>uOc;CFY_v}T24a;Q|6f60$UaiOt9u7UZxS$eetXk3F2}EsI{Qcx z>RxYG}d~wG;U9dG4vxgHcX~Bawj{DGBp{@?uz-H-UQ^ zhDsX!sAJ@-$XW=``kphw0Nw1$m9m^-!(KFDpJt?)`O9vawCYO=bz=Tw_WVQQTRE@HspC~)Ge^rw;&w$Dl{=7oFJTQk za|)4sqiHK>LINV(DLczLdJL}n>tlFCb&Jsrkl#sxx6 z{cB1t-+;^mB3tbmoVWM=;g&YstLMGo^HbsDo&8iDtGwhrI%A)BJhx=cs+P`OnXkjh z!{e8Wry~>#qkDx5+KgE|gVq^RjPbs-fj;~WBMPzbB9nWgV>-0C5r8)CTKe{o*d3Ls z$(BfeYT#4NQJ***29`r!W^HpMBRKF{&-n{^HwEf;ceYO_(&Y~((+tbcj|?E5(|3JL zj)nU|{VfkE4vj;zmDNvK)rEUcd>I%opp}*Dye<`iZ7vordKV8<=zCXAXefQ&(s2W@ z?4~x0qOTWhKFPbE;J8aQE;EBNy`GPIIzD+l+*mvC->JLsUtC5W*>0U2PAQDLtuBZJr&tyko9siLuS<)-MfMH-9nn$;ov?Xh;W+{iHaT z^(rH|nF^v(93OWgBuIQLrcbP&U2yM{c|-rYKIWnF>4oU5^hHeT74Cg!Z^wRJp#mBJ z;G^q5Ep-t8z0@(XwsKI=)wB3@f>JIw^2Y`{O5)k9DIB<9JJf48hXV5ZXo)uE_C zbHvNLZ>Hq9gSa_uOYF7uE&9|8+VjDvz;Vt2X%lp$lcpWS&Lq17r#COMkdd3WI;}l? zw}W@G1v#1xX0+J8l>}#YMaT{lZ0iLU3?M?HZtjOPed*eqoQjV^@BBF zhQ4VWBmSgx?Ij{RVGEh4nj9e?7~p3>HROBj95bXGnt)RS*JA`xF@N;7G;V_WRp8R# zuu>-R86_+5e^Q})&c^_K1YkgR^ek?K2N(MyERsI@l4Rws?nZx9|E+#OJ||o~qM{F* z_I2hcLJXRJQ7_E5qzgr2mEbz(irt!#Y3b)YF2|Q_x=9mgX6C1lz$`f8Th}Br&K>)T z1wYS^=~+Ix+`znBySTq*jp}XpocY5)S^GcxsP={q4yIPdzm}Hu@?BOdG|+8#Hd&TU!fcNrqBP2904Feu zebG9hRyN~v-Ko93r=PA&d*&q|Qqcp;4jFI;IQ9Vaqup|b8MB_BNrhBpT_F#f!^DgWs)tH`*_!a$ z5N3t*4xlo@f}cG?wW)L!2oCU=hfl$-FXPRy@yrC>mxQjE$1NeU8@WjUzT5o`0saF` z6L;Y2Og|%QlP(be~RP<7d(UHJ&tVTbVYiO+x}^;)bVR4V5<`- z&F;-%ZvS}tg!1p#!@i>g? z@TWqO}^N>7gL7rL~)^7+T7-48|kmI6VbH-66jN!2?arz+u4! zUsiQjM$g^r)!6HVM{ZA_xG=2}td1Ch=uwF+uQE!~hrFQJs*3gHGli0){1Z4TKT6at zbTX{;NlF=I{Qf}o6d~Ys=)=<{nsd$%eNHsTI=jP znJ%VdE;s16L^OHVo_Boll`O4n^S+l-+LGtEb5INBgNx zejga;DehwK+o*h=9@!C`4L}weNkEiwxI)-k+u1_yB5hq~QRzRyiy$wi2M-zL~F!E7H+w@P z#KhF?kJl5Qa6~sFkR1f?xk7OjE4ujih(aDd5CV5vJsP1tA@Jk~;zN*%@EGCqHmWM{ zX=4II6MQ407`Sj6-s1;t)Fi8fdaY-;Bm2^_poEGuSP zJ3N$`zCkB^CA$>AJWb1NwMX#0xY@CfyB-U3#TT4jtE1RDwi)R@iK`1*_gu5`m9+!D zEWgxh*ciEem2Fr!IT#DO;mc&axa4$3%6w33kD^)E*N1jCskn}pZd}-ka3yr6>qtNs zYGuK0_lJ^?{+bY96@?IXi$}BDgYf{4o8AmtOh*u(iE^a2@t{f{>MUAm!Wh1^M$Qai zF*QDsqRP<TJ`v7PeB?^wf$f7vmGh&dCm;TSW&U&evT#F4R5A+?PY7E6b=gz=u@R zeU}SVL;NXHlVyv@J!$@y;spM}atYIBo`yW^Lq;vuo2z@8mk*RfTG8Q}xKj>EI(6lgftg^gy=4=1 z#Z;jti+uJp`+n;8>XhgpU)56;01`u41s)!rQ8lH!oC->*OVRzf)9swEqbO;uw81;^ z6t_{r#g}rUKEfu`_a%#)%CBwS_pI(fijXskm+n4En8gXjNP-n(rulY){VB!4? zb0;&U@tGd(HQcN?XFOuuJgnIdo7x{+ppMyx1~G6rqFc{NQ5TEIhYCOa8Nazo-H(a!Mj9 zQ_Oa<`veCbai*n0dRdpNsRJ+3QW8N{6M~#Fh^rPy-hu%W_Fh;yNTyE3Er@EMjy1`R z2Sn(@sLCWdX@oq*W@%}W;m>qM9_oP|^5F>BEPjj}u;hJbnHojx*e4jAMveHm-G;HS zB0m~)^C8tvnh4qDQhS*v&hC2DjS}&eVLAmSRxi@>j{9UC#~YZ>ia#ha?#S0EuEkRT z%rb0Nr65K2M+1ZlXnfmyrA(amy&grn&ztDychs;9p1?YS(B_H-@ojj!bp`6Ua7>2f z?0BLQ_(VZ%CxLpaE!r=;isCNH$9&J>b_5!i(g6!z2NE%_mA{K>3Nu?If4Os^)&Xk? z){}#q-|A@q^?o5!+u-#G83b`J_r9oyQ>?1R$pG~CN$E)9JK#{^>paF-KG@x*!$^f? z9X7r4PV)LidC*FEp0{|50i@m>CL<0AgbeT}4eNLQ(K`+6uksry>+itdX)W*Z-k*Z| z*3^HImHrO@ordwwefd*>-y)U&!2iXB`8)b|vcvmB_NTpBWN=*Yx{Q%U|sf{ATX|ViWuw{`>Of{XFJRafbO9{Lj;wzk`2|#@|;se~RAQ zd-<#FzpQuuj{iM4{A=GQG5_88ZxQ_8;lED;?-Asm;*0$+_}}BnzpMED(fq3;7xDks ZxkE-AOyL)g>(4fKHgS!L|9wbO`cXxMpe~`WRZg%f``|5l> z-p*BItVm0GzgMGnhMBo0{8M?&%wmXk%9j8SUT1w1&0G^|T~t7~Y!I%PyZO^2t8Xwl&!P-u23*T!=8}he0#+0GsF~>kLRKh2DfR(|5^wvRsD9YbI}5CRv-L)n2$JIY z>`L;s4#q3~iv4_$WBK6*T#zTY~LX^-o9**lMr+t)hNhG>LdaL9s>BT5K zJg#wzn|5B)*tc>T$T?WXXsj6W&7#PmQWdJMfDGYY>28)>q;!=AN0=jd(nqc9+@Ie z2ZA_nSsLvQ3gBtX;s{4Ef+oYLXq#ZY=z^Q=mLKPmArd`IHSB=wJi#Y#C%Fq73NAj& zr^TEzQn_)Qwj6OXdFcUtY(4z#H_v)XS+}lyb(XT^H%xQ-w(n1RbcZ+^Ma-9#n1L2K zyuk2-=*cWz5I0+C3a*-=DZ`evNisRn#%N3D{tL0N z`JxI~#A%b?X+oF>$G8!pXKM#I%SGdD9YInRnGv}u%FDD2G@^4?wIRHC@1Wd)v^g7^ zBQ>=@D~Jm=G)Dt5Y3<%!SZS)pg`EUx0hXKbR@$0J zg1!19DOpNQ@x>o9|Mt8Mzs(}5;i0;3-SO7gculy!@tU8pFTlqR_ zsTS1Hwnrw^!=1$UC?fD3pX@mAqi_lGEQ)140}T}j9ReZ+o$X^Dr(|32iavo~<|Y(v zqtmoD31m<&Xece=2d)Bi%eFlP8;vVECR zK3bdD0AI)U$Hc4H|1v=2rh5#7WA@UJAl6G_U$w$_$m56L^Q5H3JIi>=)xJT21ZM2q zEYj>cIt>YFqqkk=ppxj|!llxqJ5sHD%VAjG`owk-wIo-A%klO#W=3@dWQ@P0x~mvb zco@^}F;a!^lS1xL+vL6PgS{n<*j~6~BfK9mo)_|-$AtOzV0rq^S}7s?XN^JuBAZ9W zN_rXHT_&ZDKk153PA2$6}{g`>*W>%-OFV-bZ2XF*2it@pv#h>Dw=BHH;G`f>J z{=({K>2w@1s%Oq`2T-rpaWXElo_HDimw)v7>m>WjI=|cHP)o~pLJZyWxcnO}fdFv@ z2S-d00<0vs1hVMtNRixR32)YF?k`MKtAOn=qRTYt-L4S zQ@tIA-K0~pl&BOT3HB9S-$mxfQ*$#@g@A$a14%vcHIA=^?&Fvm_W7NR+uI|JjxqEEwX+NW8 z#Hoi0rs^tEYd}TVTG9%hTlzDVtBo6GsjeAdxsVCrcdSGw)JPaJ+5kR`U($yg;xT=j zE>};_Fi)8&e1z$i-BY<9vy7J?&*^AwMvAaI_^R_p!={M5;5e&YNRE2-FwZ15+fq0d z4*@4EaUb`wPC4JS+83wdIu~=~%Q(j_jdE1rbWQxS%siwN7{llmw)<}B=N*?7m`GRT z(QFf~5_0Zl8|AX~#ge&$s>fZl8~d;&fXNqm$Z(>pPf~z)lO4KUyqZ0G(Iuu+i z*b-Btyg6>4gQk!<6}o&cMAlYAId|~_SW(q;fkLj}Y*;;<;Gl2-Ek?sea&%&|Kl}+p z4lay(AGJp8jC2zCOl^5)5B-{Txp+0Uy`$ST<^!=o80UPyQnB`|pwCqTlRgL0x_r5@ zLPj_$5oL$=*{o}#>ly`KC(mqt$$No=R(re~7{SO62C=m>$@faf0(T7v7Gd=A{pg*{ z3xcA;#$yeV7?{2CM8#x~-|3OCZ?>Ox_0)N|Vfz zAHBbaNmY@x_*uOZx8gtHfnCq!*WWN4EY_cvvt+_0jps3Lg+`&T*5<*529hAl8%gO} z??=(o8e%tcUQtjpNsGE_HFcF`3G1huW8MasY)&%uw>2||757ovN6`RP?sU99M69;R zL>R`15IUhO7Ky?~?OfBvslAD^#we^w>w8qExaW*0O!1|0+Mb5VDy7SUze%xRk0JQN zid!9~tHLo8x|mQ5x$D^PSBqjzb;05E){dB*6^A=02%0$`P5p4)aTVxNeA$wMgb|!C zvBBv^DFJPWS$8T}UwYiZhQ_3=50v7zA0+hY&u4d$0(9xJgH(ZjCy9A_CK#Y9Tm|t zsh<$}78cR;R`CX*{G6@1537COPG>z7RvYu@u{R_B(23e7x^}4mj2@j^mM2u?O7x-X zlLGGu9GE2k6DV!H!0}JPE%3+G4}24vh+ZI9mLlJ~_vP2+o*a}+V~KXxMNl)|ST(JN ze$rTlV`9g=Ek2QT0l<_8Izx2n!@5m2>G!G*1p362!#DZp=o@G8$62gFHc1hjWZdvP z`|}5kq49OUqdaku^BEf!z^D%5D`=hH<=S8w7CgYoP|00Tx;+URWTiuUd$@t%77jPaCl^6s_-6Ahv$9q#FfSYSpv<;@1{M01omVzY~*gHmT>0S~aGD)mpL{>}zOs@pVDF5s$$p;7Fmrx+6D$3m`< zn3f@5JJe)pR;?8je_Cwj-bDXAjncw{wQ|Sia@nhn8G~gjkg$3lJFz4A*xD5Y7626# zTp&y3J?6@k#Ru8C^f{Hb1`5@q8Gf+!paH6rt>Qg=ISuhRRI;*!0U{*gX zfdRl9Zig=(H}da$JRB0q`3Z*)+@pM|O%N5<;E4lLjP39@-Rpv#JF7PKNfsS?z`TO` z+r0<@IteYlB?5--crgbm&A3aeUj3wr3?TMmrgZ?rUXB(fg(31tcwq`Mzoph1L_q$r zoJnF2qdl{(fEQficNmijOI=jBEvT<2Zs)`%*BM>7*_dy#d@8N&A|F&*7$gYlC&z|} ziPqO>MSO^;`O@lQ%BOTT1bAAS1cpeAcq|=?8|roTJgKk2bCNZE#p&*>bVB(or^m+O z?nMfB)=b|WAubH1A9|hyOi7IE=yNYG~D5Adn{Q9Ykci%s3a1P??Q<|$-I9J-oV!llI8B_pq0vnolM@0p32}AG-iRJwG zD5-0kW7$*3e+i3#LP$*f^JssXPdAAk6mbI=uD0F}cYDT@m^e{TIFpV@sB0daPxp7u z%L_lG#_ppi(kmll)SSgXnSjjOu(e;^_m1s(1Wy9uW=Zvgtln zNS$e6VyJxXbpsQ)?PiOc7g}%Ppzx&DWP00&$!UQ*+Z$gKgXE2O>;2y!)IGbkF-BO`d=XWT?KMO*BS1eVdQ-_&MtXgQk5w*19 zLlH!nGS9w7Xu;W%k@ZyOzxnwyr_Dv%noEYj7ES}GWF12oy<-LOr`_52dy$re7EF8 z?vhR~74V$!rb^kvo^=KX9j|;@uS=*)>OQA!)u7(KOKnXW0yHx0ofrV+WVlFX8V0F$ zzQw)3qiA8JpH|W9_$acv-%s-7s(5(15SI4Ry2AmKZv)EUXjV_$19?s`8!P`~#^-bhsQaEARjyr*M!{o^p_L0P=JfE(Ma(LE!F9UsZF*XshaPwR# z+)?j%)@*y4hgi#nmy_?mPAnd~52bR6yqe%~KJq&`tVTMQ?zy7demILV6`v0e_)rWAw=&i|lJtYDqd6l?x5*3gJ>noX0*y|mXn~+3|O6vG^>oItF zm@E_=cg|!W6ds0N`m~veda|}Trk`%8ER)XD+c|cV`Xx3Kp$MO*-{YQrJmqYm^mA(i71YB&>EO(rLRD4-+ z>5BBVaBt&#GHz2#EVx1|bs)q=G_a*4fmYVstLFW8omO&5yZ0<^9IMR6e0qJ1D;0Ti zrI%+`gP%Z=(wz7;9O!Kl3OTfFBCb*rcZXsVRN8b|+}#3YjQH^D5_L`ljEjr1PWEPZ zZJdqlf)9Xa)u&Em3RMgH<}lY>9&-+jQe_%P&eeYRJUiwv^jB%Mo$Yv-%k1xedZs*E zS@MLQAJ(NOmWSav&u>ZK^^;>Q*q&!=es$??&d8wi-UEi>Ge8iV`?-gwE*?>oS!#6g zMWl^~RCk-um>7 z4Yf!nI0o^E4=l=#fIl=a^L^Q2>6WYyEY%;ULN6NI4nunc{I9;h6#AEn*YaoOYjdx< zg9IR{8J%JOqVnjC7}WpQp3wi&PrJ{&%<@^h^zvCh0GUD|FXgvE1PT1B&+*+30NepzF1)M%agPGh4LSM7PJpb_vx#s4 z5EN__+Y8};)dWD4Oz=_|)BJ`B>l zg_Tn#?kGdtYm5`uF%1HUY=qe1?R#e#fnO8gKXhC65^|~ns8IXE)_uOOBGq;3#3reQoCk?^c5G=uS5%2rY@DcKEd0p2jDzT-nV{YQHi|J7%Z@~>5S6NJTZT+rl?Z88AaBq6Jhz`X(Lrm<0+XTA@440 z>NepeAd<_dP2C>$U)!8dnjzk-uvGZ?*n{Nhk8n#&*Qisw_I&N3?^$Ly$;3{3+s=Rzj(4{Qkhl`bq;py!t_U5@0 z7DlI+Tx>TYw}st|w?=5Lboi+nnzS}QIwaVBeZJOPqI$2+uv+SE@PnychJ+h_-D$qWiYMxrnogZ7}P?YbB zungw82yYcs5blsBA(}P3wLH+ky$JEvasBB_B=+y@q`5uw5ZJM?z~&( zCOG?1zD93k&j-}A>+cpcL_I{=KW4eBSQ?EOruC+RFu`M;{ZogTsYWbXD4Z!bx{ofO z6ksD(uJoJQg|2!Wel%z~xo+whN6+DJ>k#c@r)X16v1zU(*^ZEvoV5u_Put0-A>EU^ zgbzqA;@0$3zA^Dh<>~jMVs0*ySPz}fz|`RhhG0b=htgJRclekt3#Kab;TgkFpQ1Jl=>^h@>~n5gHul+vDI%WFS>5dgp-nCu{#_6V}lL2(+*<`?a>LQEIc9 zXN3Q8O#{D(*9cyVA()o^B@-_JL46EKpSFRBFc?g9+OfqmtSYk;>Ok>=e3$p^Gv0O88WBAJ~{1?(?@$2dblFoV&w#)_|2Jy z&z8DVA9oS4vuHVum`lupGo9kQ-HcB)zPBsVvIg7pxWfA5!uHvC?oeHiPjt6+$XdnzJjt=%T4`WqT)PSB zr}Vew!U~mPRlyv}CoNzlqWKT)VpS>3Whg*oyxsdC*QcQd#5fMppJ!yQc>9gP3d=c( zAU^53hqbL@w%ct#;!el zP;L2@np|xKOLcg0nA<<*t}y=ndH~H$tW6kx9hqJ?1P(RkL*~V>U(%D%i`?%4SE#n% zOt>woQv43c$-Wr5(#r6RVGp`E%Ru`Ls@Q76TI`B~Tid!RNMR+9$>ZL^4zbXZR__V} zNpBe|yLaqhA5%r}|B=?H!1=TPTA#wv_zLhP_9V-{@ zDmKepnA$G&cdU9srjQK6Pp*X%Q_!Ss>IQ5v1hlyYpmCRjrLQE^@ZjR^@)ff+%9W z`jDmEWt+pM+<_M`&BXrGZyVQ>ly1QCV2Vq>$<1g?>%t$!RJS9X8G{F)`iBR8Ljtqe z1`lhXQgo8XKK18>fXQmo;JA#iIbA;Zu${*vqz?zy)?g01Bc;?Omn9eyP*UdE@uLWA zqjS8Vpj%Eh(u>#Q=H%k0V0Wh2NlgGX#Hqab`Qf-5DXzuyX=^fvVZ()bP4DTZw}1J` zCCyzm`*O3lpMrv+`R-!)9f9OZI66@DhA)IjrL0YOlRWqqf(*RX=FSxJ9z`Hqlmv!K zLco+nuuel+NDmJjp7c98ZTG2D-=;8B6HkK{aT8V^NdReUv4S?(5vp$rY5dTxC3^z4 zzXEFC8#!^}BXW>8l@*V9v~}Xb%}7xLdGFd#2k{aM-uf~6NcZ0LfCvT8;`>S2FNz9E zQSP#AA}S_>ND5a*Hb~n5Av<{(jBo_gj}@()Y-wbCO^&oqGQ&39!S#~>K>&j$cro}6 z#V*1wVuv^1B*YwSQ=#&_mAY8)g{0%0kQAw_>eC|tz;cJA=mHO{$aQ9B6LUi0BM>1G z<52hq=ni2jvp5mrE8+Jm0CY+Y=-3#-P5hWiR|0`b_Qg6BW82y~TYH=shNu#=xV~Bl z(#=QCE)S5{-Cg;yOKh@d>NCLEQEEn$BZ|lA<+@|+#bBr_iRjp3HSOxYUH{L+*y_L~ zk3}0F1qbl6(lg!K<^HQ@h1%)E?ZMDXp$xXuGhS!3j9bm-NX8{2BY0=?vWqymy6M$$ zS2AbjmUwKjCQkfjKRBhRFY$5TB2hxGh#5E9ac`lC(i#v8nMva^F!nT;Z#7s#oF&W6 z*}`TQX*fWvMu&!zHMsec)JON+Lg%aN@0&0cqrGFfdAVT>zA?i9gnm{HiTxbm=*%WJ zP+-&T7DB81d7T4RN%1a1hjDEmNq?sQOnGLwvhh^99M05rF5lRV&D|)8J{mbeE6ML0 zJjuxC{z1Hn7%&w=}1&oOP2ZI+Mso+ znzpE^+>ZFr17N30L?Y|Pu!m2r!y{!2MnKukQVDW}Y;taXB~MLzB#QoJ!?FPbAUBDr zg}!0{kxvmqxdq9?FuV(W-jhT>EEVhj4bO?)e($MqG{(G)OQ5NS+Q~DpskJYr${|-% zt$44TpKR$#0QsxR<^(NQ%}29tCm@&}r|fEH;;8fbQTY-7E9?@zehlf+iu-QjgDf=%8A%3InCh8{oj~R{Zp?dh z?~+s|LQhV>WRG4;av$a)rpT~XPAh41wEzl|&nA*))}tt@LAvVl|CByr7br}`X4V52vrVf z)30fkXfFWCAeQNN3$m~hTLb>$`HViz9kS+5Tb_3kKTqmerq(sz8sEQZ3B;N#6eY0} z{AnOk%|~F~r|2LM880LWWj_MeQDN15*7h~_v~??P=yQb(M_ zD(UmJ3xocf#vnsQq^Z^RS}3n4YRzTAPr*Hq?xkL*HApJostD3S{k)S~5{0&T)P-92 zap$%-Hkff!5V`s+&b<;nfAJ-BlOLz7USa^*7l+9MK*7*K{$z0dPF;FsaQ#(&<8%ET z_&X`)HQxJEh+dldFP_ui;lFb@UYRq$$xEd2ANap`G=E3`&Xjn4$o`b5m%#Kt=s#H> ze^>B3nc$UB@u!$W{xiMe@0xzkwfxl%0WaqMFDk;{;lD3mUK28ZN(I8d;D4rP{to^< z8h>5k{3&TK@8z$y|FYisJO20J@UMM`doju{{O=L`-{HSc0VRU+W7Kq?PRT?0*3341mG_ literal 0 HcmV?d00001 diff --git a/clearing-parent/reports-service/src/main/resources/templates/ROOT.NEW_TEMPLATE.docx b/clearing-parent/reports-service/src/main/resources/templates/ROOT.NEW_TEMPLATE.docx new file mode 100644 index 0000000000000000000000000000000000000000..1cd7ae7bd65913d8be96dfb74bdfb175484c75cc GIT binary patch literal 10401 zcmai41y~)+lE&SG1p)-OgKGi=cY?dSy9Rf6cM0wi+#$HTySuwDrPuQF*_tU{+Ry$6B zt~D4P(>@(~n2#%&m3UQEQ|8;JM?TMlrtzszVZoCscgxm9v-anx=6UjY>RqUI-^JvM zGOX&2-k*Ftb~f0J9BP+|5T*VM11@TxmaUWWZb?-}7eQ(E<(w~X@WbA9Qnu0h!bN*u zCP(;45`S=X`kX7Uq$niRmi0B??(6hNL4bfH|4#uSzdoUBp(AN+VQE97V_~gF{msnO zS6WoOgBEGYCaCveQXB>9^dyEe1&sdio@Ti8o`~nx!To_-uveX;K zwdl2SyjlV*QX)p7qt$G+Ld0mN4?$oGRl@L9Pn%@HnTF+f0pyLDylr&&2X#Qa z48~-oV7zl=nZCN+Si+yA>oIyU{XW1T32fw}to3TvSf%Xk5Puiz7E}n zw_?Yw?KYFJdlJ0WwYV7#$Fi0x2?7>j3l>1h^}y-{A&nRun2OxEz8=m9A5ZAC!iG9MH`d@ZKPqyqIkCr@eeh+gtZe(jx-qoI@Sv-~eo;DZ zGEP|l$0(zU<#06#=?*kJQh*t@7%0sIgBZr1<5{?|Bb&@|L$dSXM@is>qSq7yD(vA3 zai><(Crj*rOrK&`6&|WpO3J$JsoGpKjVi06(yQG=l!V0aN!DTJ#Z6j&lZz3^y!1ES zdew7Nqyhs0!Gr#jZjt`ft(K+bn`%>~xZhOUbP+_hKFK(oH8@z%*eoiz4Cf|s=y?RP?@y4a2+7L0fjchQ^}1oG}Gc zbQ?mgUV(kDU(J0$+(5=krqC67qc0q=0dKz=#Z}aHSbfw6X^6;oaucdgXo!=lJa7qaZ75iR$Nza&<3}86KtnxP3(aOE1Y+WD0MS=V6C7_;X^Uw032}t^Dn(d7EXDFZAfc%;(G~Tq4DzG0c z`Kpbt|M;c7`%@b_b~d&aX1^3NTmkcw7S(rcDGzFHK^8J{yegQLP4*^YxdzzAqW5dC zt23e3ahN~e7x4*>C*ESDIb`E{8cK2?DtH7^DvPHaR^j%(RZU!M4ueE6)kNDS7pS_mZ;~FrtF^Dm%sWrr< zj@@+|0t=&p@|K8=?TWO0SqZ@??-$rZP!V1WEWZ%LarzH

stAMsRs=oJc_YInu*9vI)*V@824VXzza#azg6T3?4WE^Vtnoj zFANqk0ErcgP^-+qUf;mLtud|nO1+NNNTnYvH%&MtCCO|cAI9ERJ3*X0Zy6KY_(&ct z9KVMP-O5tDL|dYH_GZjiq>S5kr5izp%X{N0DrH|LZ)Rd(RzSVTY(M5(cCWIX_Dz)b z*rb)M3?X!q%s@zea}qjqH8KWU8zqV{Aw+mpwl9IVl!~%5$wZEnDL%xtlitLYw%I%9 zYECT`tLA=gFq_3E@dy2FTs=(P*JMNTa!oeCdfzab5`C?HYj- zs@TByW|{(<90lN)dJJ~==X#s#W@b4K6ZVNHE1}hM_uNh4RcR`d6!nK$ zV81&S&BYHQuJaB`>Ls$< zpa8^t=aCPFwVdfNd8~4~2%1&=n*&pIZbTj2;@AX+2|TV;3hL9wWm5sl{}7CCUQ*>T8H%rWpVK>qjVwv*$v~4 zvj}@k);_eF)`ls@U6zai*bBO2Eg$#soT&f}VZ7|2|JvlG&`0=8sIkgmwh zj*CYoc@LfMg+9K6_KmIC$7P#1pn26MD8`u@FYUB`J5@xQ4~H_-4LkrU18R^Rnbr|x zG-;=`?SeMJKd>Z%HytCZ`AGEhFk4aNx<^a6hu#mUWrnJdXUUGg|m zEt+75VQEk0q|@Ubj^3c+b{^)qgU2-1f~=iNF|dSdzN(AmV{;4Q7QA9Uc_zxrts?Ys zP!!4_nL#Is?-4=X=S`Jq+8<|^Jt8~<3P&InO+_6Y)sw)mgfN&`A0g7d6ak4~bo$(X z0D_G^N{<*T>q~j2p8cU-`w{h_QCHP;aOZudHr`A~tt5^id!CzBqAJh*x82mbV^S1L zt*=KNa5moQr>jHNUGe-NaBHmv0dg^lksbRY5Zdo}fJAKr{KZlgJU>$U?_E$S`j>#p z$4NZstCu*x)4=t0R>@Tr3CfLiAz(aQ0AB>O!t8evFdpBGN@ zVY$<{41dYtLa*(O_h6-rZe*%RQk_lo&Wjcd`p$sDW3k!*W72UloSPs-XC*L*819#trup54qN|R|E>H88xNB^@uqt^zFM@ca68yU(^6!C9{ z+Q~}iN=KO1q8%+9=*r4f+>M@g41pf3^b9=E!HrTEo^;;0@JXmnCQ)Dp=s1)QZ$4~h!}0DiD{)!Un@wfZxe!RT(65xIN!F+6u>6z zB?J%<7xO-vU`u3Do8T(@;K3iS+`-j}&CcW^gwsKqbv(26d}{4}UE z+69U*8re4ubcCdq8qKZHdV_H-`z6LByVd(eq)RL=UG$t^&%@93RNVladoRt=T1l)9 zWs2)CR*awZS`@prvuldOJF@G2D~UM7!AwkTqqD~HK~xK-i_pP%n6?46G;Wd8%;`{N zz$Q#%4}L2l7bK*dg?KJn&trz4OKMU`!fWpUO$9YwbHNfbLkOp*T~`DvRkA~$uqtl5 z)>&CT#1k^Ov8#`5NI3N|N~sa8V`H;1BpvKD^;{5Asn_O6VfVyT|_MHDa zW^j&a6(As{f-GF}&?Sz0P4FnfT7?I*=8TFQrA@Xghn{ccPsd9%B%hPnDJ!$*LWWs}meL zJplHc4H+ZbhJdcA%gr|Yba`e%vIkDD8$#g>!Jr?ap|=2sO1S+{D+zYJ~inN@R=v5tAp*bBKrr1Cyd?^vW+-z}e-kh5Qa}1d|%Qdkb z*fo0ah($e0fmM#gQ5mru#ePlEY7oOjN(|Q?W zf!|lMquf4>xZFV|LEshTL-jwNz>koFIctI-mV?1$24}Ppel9N=6Y%}(Uk2bvnb@0z?Kpe;a zM1M&qdUYn)Jc*+Y!(`bJ4-LO~O6(;s^A)lF1;w_;6MK0MBCN17?~5qPTGUm|x|Ch* zy3~!sw=;$FY?=+Z?Fo2Ia3bt>7$Ih#@ewcD?}ruJ$o7gC`46JI^htu2LgE+Cn6Tku zaPV2uJRSMEqqG$8j3KffYYMxQnjJI~1?_$sMKWyxaX?I%vFVZGFMI}$#s>l!`jWC<~4c-9nz|bVXpn=CfH1|FYc;34!xWSU<>_z78&d` zK83au|G1c&=w68B>##1%BVOEjG#WUfsMo4rnLs(d$jBqEn{`-5L$pwIS=fhqPUznV;UYvzySVETwmm* zj-Idq zSg*xd^!ZMjbObKNx%BzU#B>=2bBGvn9L(tnok+e0-}PF+ zaq^Ko5o80nASw7VK+y_9|SGGZIR+HEbH(v-~WI8!Tc}dY=^(@4XCxH+0pD}||(AL7p z3UU8?>uulspHF3ya+6&xAyEr z%lA|4^i~>(6Ce!KgcW-9?4*K{!aS@Lk_z5Sz-_C|HRvPw*HH@2z^y?!=xrzAe^@Pb zQDs=PIp2Jobt>Co9b%b@2jPiln}&MO=ZRP0DGBMhb`I7jxs)3b+ojA(^cbHAXoocs z_>RV$b(rm^Ey=c@&oBVU8b} zNdbPpxG`(2)~}Wbk65QwAJfj?7)vYvSS*xsXB1HwWn&W6Bre&wZX z9IzjyjK^P57H7O&$FDeq#DYHqXVq7)Zzx4IRZLZsgVp{+*-Lp&PSkGfurQ~=$$m;& zO`y>jde=ySsv5@R^+I8)K$V!&EhlOwy#QILRy|3=RH{rb5?U1Z`R#71^hP0Zzbmtkk`98;ssVy(s{2V^5?3@S9eObI zB93*dD5D>54{A~(dI0*#&RR|N0v+- z9aeS+wc;924RD!91;^_Sq3@PPO=`;o5B8;fCVaNDQz9vNJtW zscST+o~pt-pK+aau3kiw_wNi*Qv|)Fk%Z&ePp_9(u5H)>G4yfby2;mXaw2j*-Ou>D zb3UFQtnB(7*Pi;VSL053`_&!7BA)FnEet-uD=;4yj@4M=4`IMkDbk#vSgzTw``0wHWKjndl4yDfb+;8FO@C+}@!!C;- zo|#XIo<-DO5Z`T!>#!az?qt#k z5sLro+gZI+#ug~^ajsHdc&`b{`AwY>C4Mh{X7e0dB}1bQ&5Xu$06J*2gKx?RJ^83n zE2#t7X3z1}vlL9&>a}K52hVk{b#sG?z2laeZsa`9jvD>}X0j^zG?VgbqQxk2@p(Is z*o>uQD&hmlx6nc1C9LY+ACP*UDeMD2F8?gfnbbC6A-F09oBYf;7R12Ant(}QSDp{YLTEsyak0)2cHwn zomHF|_N(ivXJj%%R6#1@GzGcVXIn3(4tr}5dnztfKz z!m+SCya#2)6W#%Ey1!7Gj!=$MOT3s!e^p}MO@QYrFfPm1 z_CaHy)Jj$Ykmq`LjjvBn{m2c}GV^0-!_@(kG;FHi4g5BWeiB?fCtesg6#oef_d!@K zhvU1a==Dbv`PN@i%C$C-6zf-oIsIcK3++FjhpnNWnI6rrE8W|{z>(5I(1HMF%ZUus z65D6dYZQxeJvO7tWS>J4;&>fLz*qKh%%N`%U!i=4d zh8X}vReQX)M0d15diHY9crq&5(>iWmE{0x4T(Ua4LVVb+F*+V8X z%TLqL63v-DPMO96ZVSzAd!yM@?D-m<#?X5A%G1^$6KAv9qv5A5AS5uC?QWQ9qv<3n zgCI06eyR1wt!hA)55}Vk<*i?|tLQfq&sv4k)Ueio??4nmVMHWpdke%(m2Hib-y|%m zOv`*mxRC|=G{H;QO1DPz+59h|TL^q-J~VD5%G`qFKo^yiOUx?GsKXscRdv9h>w@~B z_=ftIBZ8RkfQB@XOWR9gp82wZL4R*jVz~-4KU+C8*~ww&(S!wQZ!m<}6_M$d_|6^V zS6u4W*<1*+*)@@u*CQbw?#|(QdwO}Bw>Mj4ufT;8WM9_u@_5pN7}M(Zygijgv-yo; zUE}$-Z(!y5TdK2s=G9i;04XU=%l+jD9@TIuM|o@q=X>BF$oalkBX-pK&>Ee3u44z4qiLT5OzY|2OnBbvA+9WAfCWE z93K&@C4O!ZvOR_^1nDFoVcs9%4PxfD;9cxAI`6sDPNYrkEhxWw=^d+_W`t}ygK8#< z28e1k!3n^1N_T(kCa{Jq7ZR|xNP)=lkm+W?;Sr0mN0g?htWOIQwJozwjLdVz2;ZQm z*E9UcdknWL=AzS_`Z9 zQ8W?71~L6LU_@I_tlh3a(R+K6<5!r(FBIpZ=f^4OO*Y7`XIC3G(U(KPj)eTJDJ=OyRrH7f(xFH$u#M>|8oS3K!VXXhLa@6zv-Tf%9Vb#&ky z3`;L#Bx+~YLLG@6=v!kk1)5lKT6|z-BI09X%EOU^uL)>3JFxDc@KYNQ3h0Sq($V&n zSMHP;f*gd)44FdamMB?(Ovi>tl9bpu6BWnyoq`vt>K~fWr6WC}**MsswaV$CMR|T! z4h#GoW$DT!(UM|P@8Nm(0BHIRMry1FUy68=$9ubN5EyuQJw%UJg9E&n6{lwK&O=0im z-_+J0RcW2AtWdOH#!0;V%!QOMw>1g)RBdO_13?4jv$n`&#W16PK_%h6C07JJljvx+ zWe2ghyhYjCMWZ2@Ft%>ghTLj!YJivqOWdnsuy5TNBNep2&#`1Q+p>3y*1TUuS)+Fl zTR2fp0pC**Qlqn5lIxfb>C0cShN|Om`vi|Gp)tF8L`h?|KBsr%>(PnTx6)-;Z}mLh zO)E-c7UaOx?>1dV5g@poW@2wFU$Q4}ET1J)p)zEgv)wo(GH}%_pSQ&}rM%Np_+eAC zQR}W|p;TVA;bdzvCKfs%EKq&Dt z)<4++Zy|XV-dBt3HD0YD>u9NGqxQC`G{^ojyZCROf_hbA>hwI3MCQT6iEX8(duO93 zkvMf5bDo^Lg=O(klj6{sBi9q1N7xBS)6Ha4i`yNIY`ID15{NSDk);*D9o5;hXLOly zwt`E*(=|)4!Ik_pEy%81po8uP6-P12LuCM~MMe2~kEwE8G(8)X{hXKdbV_m8`^KX-3$FZt!J3tQ2wC%0NLt~ zF;&1%XvzIki?8Ynu3^8lHCK2nk1&MQC`f08Y0G(ge)L(%kmo7l24C%5Dsb*gPaO88 z!mhBIAd6|D_susNO~}RoZE3{mwT>DH_h$;_6>gWnUU26U_p@q5x$;WfG+-Z(q}BwU z9d<>YwgasBoy|>ptYm~w{YDq=32q>7Mw@!l)3oWU4IuuiFiBBh5LBSw$y|SCF})>o z{gwVm?fN_L&lH(Ad+#^lzjpOMQl9<}|1+oKEsy3mJ-x>J{~P}AteU^0|ID0td&z!N z@T+0^-{{|2Ab)4@XL7+?g2ivr0srT8i@$UFGv@MFIe5N``+uY+{2l(M`|=i;`At>u z|Azk#)BGL$r#1fO;ryoj*YEOI-+%FU{*M3CIQ;9_(O-q~3;(AD|9AMGi@=)&`I~xh q{tf@TJ^6PQf4-W3RU|Ia|GIWaih{q26$l9S_1E_LrVJ3j)&2_tvZn$7 literal 0 HcmV?d00001 diff --git a/clearing-parent/reports-service/src/main/resources/templates/ROOT.SSPD_TEMPLATE.docx b/clearing-parent/reports-service/src/main/resources/templates/ROOT.SSPD_TEMPLATE.docx new file mode 100644 index 0000000000000000000000000000000000000000..65f964c52f74b589e51a27f249993e89d9499a99 GIT binary patch literal 10372 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 P;raLDnfFmn^^*G^q?v{~ literal 0 HcmV?d00001