From ae3b24c8a1d074f45e84eec7525aae8d72688abd Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 26 Dec 2022 19:30:17 +0300 Subject: [PATCH 01/15] =?UTF-8?q?reports-service=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20kafka,=20=D0=BD?= =?UTF-8?q?=D0=B0=D1=87=D0=B0=D0=BB=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clearing-parent/reports-service/pom.xml | 4 ++ .../clearing/reports/config/KafkaConfig.java | 28 +++++++++++ .../element/ReportsServiceSettings.java | 22 ++++++--- .../reports/services/QCommandExecutor.java | 49 +++++++++++++++++++ .../src/main/resources/application.properties | 17 +++++++ 5 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml index 54846a228..457291ada 100644 --- a/clearing-parent/reports-service/pom.xml +++ b/clearing-parent/reports-service/pom.xml @@ -62,6 +62,10 @@ ru.spcex.platform platform-imdg-api-hazelcast-impl + + ru.spcex.platform + platform-messaging + org.junit.jupiter diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java new file mode 100644 index 000000000..cd3b73821 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java @@ -0,0 +1,28 @@ +package ru.spcex.clearing.reports.config; + +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory; +import ru.spcex.clearing.platform.messaging.config.KafkaProducerFactory; +import ru.spcex.clearing.reports.config.element.ReportsServiceSettings; + +@Configuration +public class KafkaConfig { + @Autowired + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + @Bean + public Consumer createConsumer(ReportsServiceSettings settings) { + return KafkaConsumerFactory.consumer(settings.getKafkaConsumer()); + } + +// @Autowired +// @Bean +// public Producer createProducer(ReportsServiceSettings settings) { +// return KafkaProducerFactory.producer(settings.getKafkaProducer()); +// } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java index a79eaa702..d3aa03d8a 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java @@ -3,6 +3,8 @@ package ru.spcex.clearing.reports.config.element; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; +import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings; +import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings; import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; /** @@ -15,7 +17,8 @@ import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; @ConfigurationProperties("reports-service") public class ReportsServiceSettings { private HazelcastClientParams hazelcast; - private String reportModuleOut; + private KafkaConsumerSettings kafkaConsumer; + private KafkaProducerSettings kafkaProducer; public HazelcastClientParams getHazelcast() { return hazelcast; @@ -25,12 +28,19 @@ public class ReportsServiceSettings { this.hazelcast = hazelcast; } - - public String getReportModuleOut() { - return reportModuleOut; + public KafkaConsumerSettings getKafkaConsumer() { + return kafkaConsumer; } - public void setReportModuleOut(String reportModuleOut) { - this.reportModuleOut = reportModuleOut; + public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) { + this.kafkaConsumer = kafkaConsumer; + } + + public KafkaProducerSettings getKafkaProducer() { + return kafkaProducer; + } + + public void setKafkaProducer(KafkaProducerSettings kafkaProducer) { + this.kafkaProducer = kafkaProducer; } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java new file mode 100644 index 000000000..a093f6eec --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java @@ -0,0 +1,49 @@ +package ru.spcex.clearing.reports.services; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; + +import org.apache.kafka.clients.consumer.Consumer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +//import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileRequest; todo use class? +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.platform.enumeration.Task; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgId; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.util.List; + +public class QCommandExecutor extends QueueConsumer implements InitializingBean { + private final Logger log = LoggerFactory.getLogger(getClass()); +// private final ImdgId idGenerator; +// private final KafkaSender kafkaReqProducer; + + + public QCommandExecutor(Consumer kafkaQueue, ImdgProvider imdgProvider, + List listOfCollectors) { + super(kafkaQueue); +// todo constructor + } + + @Override + public void afterPropertiesSet() { + log.debug("Init queue listener {}", getClass().getSimpleName()); +// callback(Object.class) +// .setConsumer(this::newReportDo) +// .forDestination(Task.getVerification!!!.topic(), callbacks::put); // todo здесь надо указать команду из ТЗ или согласовать с фронтэндом +// init(); + } + + private void newReportDo(BaseRequest userRequest) { + log.debug("newReportDo request received"); + // todo logic + log.debug("successfully processed"); + } +} diff --git a/clearing-parent/reports-service/src/main/resources/application.properties b/clearing-parent/reports-service/src/main/resources/application.properties index 52d18bea7..c7765a7fe 100644 --- a/clearing-parent/reports-service/src/main/resources/application.properties +++ b/clearing-parent/reports-service/src/main/resources/application.properties @@ -2,7 +2,24 @@ server.port=8080 server.servlet.context-path=/reports_service spring.main.web-application-type=servlet + +reports-service.kafka-consumer.bootstrap-servers=localhost:9092 +reports-service.kafka-consumer.group-id=dev-group-balance-service +reports-service.kafka-consumer.enable-auto-commit=false +reports-service.kafka-consumer.session-timeout-ms=30000 +reports-service.kafka-consumer.auto-offset-reset=latest +reports-service.kafka-consumer.linger-ms=1 +reports-service.kafka-consumer.buffer-memory=33554432 + +#reports-service.kafka-producer.bootstrap-servers=localhost:9092 +#reports-service.kafka-producer.acks=all +#reports-service.kafka-producer.retries=0 +#reports-service.kafka-producer.batch-size=16384 +#reports-service.kafka-producer.linger-ms=1 +#reports-service.kafka-producer.buffer-memory=33554432 + reports-service.hazelcast.cluster-members=127.0.0.1:5701,10.200.200.181:5701 reports-service.hazelcast.login=dev reports-service.hazelcast.password=dev-pass + reports-service.ReportModuleOut=./report_out From 41147002f71cb5d810268867c0c465134192f489 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 26 Dec 2022 19:36:34 +0300 Subject: [PATCH 02/15] reports-service refactoring --- .../reports/services/ReportDataCollector.java | 12 ---------- .../services/builders/FileReportBuilder.java | 4 ++++ .../services/builders/XMLReportBuilder.java | 4 +--- .../collector/Bt17_1_P1_collector.java | 7 ------ .../collector/Bt17_1_P2_collector.java | 6 ----- .../services/collector/Bt17_2_collector.java | 7 ------ .../collector/Bt17_5_P1_collector.java | 6 ----- .../services/ReportDataCollectorTest.java | 5 ---- .../services/impl/Bt17_1_collectorTest.java | 24 ------------------- 9 files changed, 5 insertions(+), 70 deletions(-) delete mode 100644 clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/impl/Bt17_1_collectorTest.java diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java index 739c83759..f7dc466ba 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java @@ -32,18 +32,6 @@ public abstract class ReportDataCollector { // */ // abstract public List collectReportWithClearingStatus(LocalDate startDate, LocalDate endDate, String clearingStatus); - /** - * todo убрать метод, он уже лишний - * @param startDate - * @param endDate - * @param dateTimeNow LocalDateTime.now() - * @return - */ - @Deprecated - public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) { - throw new IllegalArgumentException("deprecated"); - } - abstract public Class getReportClass(); protected String toString(Long val) { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java index ee7db9533..d22e38111 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java @@ -9,4 +9,8 @@ public abstract class FileReportBuilder { this.reportClass = reportClass; } + protected String makeFileName(String reportName, String extension) { + if (System.getProperty("os.name").toLowerCase().contains("windows")) reportName = reportName.replace(":", "_"); + return reportName + extension; + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java index ed8ac24bf..0d25b8cf6 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java @@ -31,10 +31,8 @@ public class XMLReportBuilder extends FileReportBuilde public File createReport(LocalDate startDate, LocalDate endDate) throws IOException { R report = collector.collectReportWithPeriod(startDate, endDate); String reportName = report.getReportName(LocalDateTime.now()); + String reportFileName = makeFileName(reportName, ".xml"); - if (System.getProperty("os.name").toLowerCase().contains("windows")) reportName = reportName.replace(":", "_"); - - String reportFileName = reportName + ".xml"; File reportFile = new File(reportFileName); if (reportFile.exists()) { if (reportFile.isFile()) { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java index 229eb2a8a..d11b7e256 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java @@ -129,13 +129,6 @@ public class Bt17_1_P1_collector extends ReportDataCollector getReportClass() { return ReportBR_0420315_P1.class; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java index 8bc56a177..3c18e6922 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java @@ -53,12 +53,6 @@ public class Bt17_1_P2_collector extends ReportDataCollector getReportClass() { return ReportBR_0420315_P2.class; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java index 6081329ea..4d9b8ddae 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java @@ -68,13 +68,6 @@ public class Bt17_2_collector extends ReportDataCollector { return reportBR_0420317; } - - @Override - public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) { - return String.format("REPBR.0420317.%s-%s.%s", DATE_FORMATTER.format(startDate), DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(dateTimeNow)); - } - @Override public Class getReportClass() { return ReportBR_0420317.class; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java index 463f6ba36..23e4b2d38 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java @@ -56,12 +56,6 @@ public class Bt17_5_P1_collector extends ReportDataCollector getReportClass() { return ReportBR_0420312_P1.class; diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java index 7341332e7..0e730578b 100644 --- a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java +++ b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java @@ -33,11 +33,6 @@ class ReportDataCollectorTest extends ReportDataCollector { throw new IllegalStateException("test"); } - @Override - public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) { - throw new IllegalStateException("test"); - } - @Override public Class getReportClass() { return AbstractReport.class; diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/impl/Bt17_1_collectorTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/impl/Bt17_1_collectorTest.java deleted file mode 100644 index cef49c50c..000000000 --- a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/impl/Bt17_1_collectorTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package ru.spcex.clearing.reports.services.impl; - -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; -import ru.spcex.clearing.reports.services.collector.Bt17_1_P1_collector; - -import java.time.LocalDate; -import java.time.LocalDateTime; - -import static org.junit.jupiter.api.Assertions.*; - -class Bt17_1_collectorTest { - - @Test - void getFileName() { - Bt17_1_P1_collector collector = Mockito.mock(Bt17_1_P1_collector.class); - Mockito.when(collector.getFileName(Mockito.any(),Mockito.any(),Mockito.any())).thenCallRealMethod(); - - String str = collector.getFileName(LocalDate.of(2020,1,1), - LocalDate.of(2020,1,31), - LocalDateTime.of(2021,4,20,12,20,44)); - assertEquals("REPBR.0420315.P1.01.01.2020-31.01.2020.20.04.2021T12:20:44", str); - } -} \ No newline at end of file From c5c56f5d79338f0f904cc7b8c4316402975c8808 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 26 Dec 2022 20:28:31 +0300 Subject: [PATCH 03/15] =?UTF-8?q?reports-service=20http://jira.mfd.msk:808?= =?UTF-8?q?8/browse/CLS-29=20=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D0=BE,=20?= =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3=20=D0=BE=D0=BF=D1=8F=D1=82=D1=8C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reports/bt_17_5/ReportBR_0420312_P1.java | 35 +++++++--- .../reports/services/ReportDataCollector.java | 6 ++ .../collector/Bt17_1_P1_collector.java | 4 +- .../collector/Bt17_1_P2_collector.java | 4 +- .../services/collector/Bt17_2_collector.java | 4 +- .../collector/Bt17_5_P1_collector.java | 65 +++++++++++++------ 6 files changed, 79 insertions(+), 39 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java index af4884919..dce10d12a 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java @@ -6,6 +6,8 @@ import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; @XStreamAlias("clearingCoverage1") public class ReportBR_0420312_P1 extends ReportWithPeriod { @@ -13,9 +15,27 @@ public class ReportBR_0420312_P1 extends ReportWithPeriod { @XStreamAlias("destination") private String destination; - @XStreamAlias("part_1") - private final Info_0420312_P1 part_1; + @XStreamAlias("rows") + private final List rows = new ArrayList<>(); + + public ReportBR_0420312_P1(LocalDate startDate, + LocalDate endDate, + String destination) { + super("0.0.1", + "0420312", + "Сведения о клиринговом обеспечении, часть 1", + startDate, + endDate); + this.destination = destination; + } + + + public List getRows() { + return rows; + } + + @Deprecated public ReportBR_0420312_P1(LocalDate startDate, LocalDate endDate, String companyClearingCode, @@ -26,19 +46,14 @@ public class ReportBR_0420312_P1 extends ReportWithPeriod { String companySymbolValue, String companyInfoCountryCode, String clearingMemberCategoryClearingMemberCategory) { - super("0.0.1", - "0420312", - "Сведения о клиринговом обеспечении, часть 1", - startDate, - endDate); - this.destination = destination; - part_1 = new Info_0420312_P1(companyClearingCode, + this(startDate, endDate, destination); + getRows().add(new Info_0420312_P1(companyClearingCode, liabilitiesClaimsAssetsCompanyId, liabilitiesClaimsAssetsFullName, companySymbolCode, companySymbolValue, companyInfoCountryCode, - clearingMemberCategoryClearingMemberCategory); + clearingMemberCategoryClearingMemberCategory)); } public static class Info_0420312_P1 { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java index f7dc466ba..82a8d0001 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java @@ -34,6 +34,12 @@ public abstract class ReportDataCollector { abstract public Class getReportClass(); + protected void validateDateRange(LocalDate startDate, LocalDate endDate) throws IllegalArgumentException { + if (startDate.isAfter(endDate)) { + throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")"); + } + } + protected String toString(Long val) { if (val == null) return null; return val.toString(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java index d11b7e256..824306394 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java @@ -56,9 +56,7 @@ public class Bt17_1_P1_collector extends ReportDataCollector endDate(" + endDate + ")"); - } + validateDateRange(startDate, endDate); ReportBR_0420315_P1 reportBR_0420315_p1 = new ReportBR_0420315_P1(startDate, endDate, "BR", "I,V", // cmc.getClearingMemberCategory() diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java index 3c18e6922..bed4787d1 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java @@ -25,9 +25,7 @@ public class Bt17_1_P2_collector extends ReportDataCollector endDate(" + endDate + ")"); - } + validateDateRange(startDate, endDate); String ql = String.format("'%s' <= refundDate and refundDate <= '%s'", startDate, endDate); Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java index 4d9b8ddae..b85eed586 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java @@ -32,9 +32,7 @@ public class Bt17_2_collector extends ReportDataCollector { @Override public ReportBR_0420317 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - if (startDate.isAfter(endDate)) { - throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")"); - } + validateDateRange(startDate, endDate); String ql = String.format("'%s' <= updated and updated <= '%s' and service='MKR'", startDate, endDate); // todo обговорить про updatedAt updated, todo enum MKR diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java index 23e4b2d38..11ccb81d6 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java @@ -5,52 +5,77 @@ 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.company.relation.Relation; +import ru.clearing.classes.statics.data.generated.ClearingMemberCategory; +import ru.clearing.classes.transaction.data.execution.LiabilitiesClaimsAssets; +import ru.clearing.platform.dictionary.CountryCodeDictionary; import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt_17_2.ReportBR_0420317; import ru.spcex.clearing.reports.reports.bt_17_5.ReportBR_0420312_P1; import ru.spcex.clearing.reports.services.ReportDataCollector; +import ru.spcex.platform.enumeration.DocumentTypes; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.Collection; +import java.util.List; import java.util.Map; @Component public class Bt17_5_P1_collector extends ReportDataCollector { private Imdg companyImdg; - private Imdg relationImdg; + // private Imdg relationImdg; private Imdg companySymbolsImdg; + private Imdg countryCodeDictionaryImdg; + private Imdg clearingMemberCategoryImdg; + private Imdg liabilitiesClaimsAssetsImdg; @Autowired public Bt17_5_P1_collector(ImdgProvider imdgProvider) { companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); + liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); +// relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); + countryCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CountryCodeDictionary, CountryCodeDictionary.class); + } + + protected CompanySymbols findSymbol(DocumentTypes docType, Long companyId) { + CompanySymbols companySymbol = companySymbolsImdg.getSingleObjectByFieldValues(Map.of( + "companySymbol", docType.getKey(), + "companyId", companyId + )); + return companySymbol; } @Override public ReportBR_0420312_P1 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - if (startDate.isAfter(endDate)) { - throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")"); - } + validateDateRange(startDate, endDate); - // TODO ВСЁ по CLS-29... - String ql = String.format("'%s' <= updated and updated <= '%s' and service='MKR'", startDate, endDate); + ReportBR_0420312_P1 reportBR_0420312P1 = new ReportBR_0420312_P1(startDate, endDate, "BR"); // todo обговорить про updatedAt updated, todo enum MKR - Collection relations = relationImdg.getCollectionObjectsBySQL(ql); - ReportBR_0420312_P1 reportBR_0420312P1 = new ReportBR_0420312_P1(LocalDate.now(), - LocalDate.now(), - "companyClearingCode", - "BR", - "liabilitesClaimsAssetsCompanyId", - "liabilitesClaimsAssetsFullName", - "companySymbolCode", - "companySymbolValue", - "companyInfoCountryCode", - "clearingMemberCategory"); + String ql = String.format("'%s' <= refundDate and refundDate <= '%s'", + startDate, endDate); + Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); + Map> indexByCompany = MapUtil.indexList(liabilities, LiabilitiesClaimsAssets::getCompanyId); + for (Map.Entry> companyEntry : indexByCompany.entrySet()) { + final Long companyId = companyEntry.getKey(); + Company company = companyImdg.getSingleObjectByID(companyId); + CompanySymbols companySymbolINN = findSymbol(DocumentTypes.inn, company.getId()); + CompanySymbols companySymbolOGRN = findSymbol(DocumentTypes.ogrn, company.getId()); + ClearingMemberCategory cmc = clearingMemberCategoryImdg.getSingleObjectByFieldValues(Map.of("companyId", companyId)); + String clearingMemberCategory = cmc == null ? null : cmc.getClearingMemberCategory(); + ReportBR_0420312_P1.Info_0420312_P1 info_0420312_p1 = new ReportBR_0420312_P1.Info_0420312_P1( + company.getClearingCode(), + toString(companyId), + company.getFullName(), + companySymbolINN == null ? null : companySymbolINN.getCompanySymbolValue(), + companySymbolOGRN == null ? null : companySymbolOGRN.getCompanySymbolValue(), + company.getProfile().getCountryCode(), + clearingMemberCategory + ); + reportBR_0420312P1.getRows().add(info_0420312_p1); + } return reportBR_0420312P1; } From 5ce07b54046f428c1fb7c53ea4001dfbbf04cdb7 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 26 Dec 2022 20:31:40 +0300 Subject: [PATCH 04/15] =?UTF-8?q?reports-service=20=D0=B7=D0=B0=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D1=8B=20=D1=81=D1=80=D0=B0=D0=B7=D1=83=20(=D0=B4?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0=D1=82=D1=8C=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0,=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B8=D0=B7=20=D0=BA=D0=BE=D0=BD=D1=81=D0=BE?= =?UTF-8?q?=D0=BB=D0=B8=20=D0=B2=D1=8B=D0=BA=D0=BB=D1=8E=D1=87=D0=B8=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D1=81=D1=80=D0=B0=D0=B7=D1=83)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/spcex/clearing/reports/ReportsServiceApplication.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java index 113de634c..c12ab17d1 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java @@ -36,6 +36,8 @@ public class ReportsServiceApplication { LocalDate date1 = LocalDate.of(date2.getYear(), date2.getMonth(), 1);//date2.minusMonths(1); xmlReportBuilder.createReport(date1, date2); } + log.info("Shutdown application after work"); + context.close(); // todo если будет запущен как сервис, сделать выход опционально, по другому. } catch (Throwable e) { LoggerFactory.getLogger(ReportsServiceApplication.class).error("Report-service start failed: {} -> {}", e.getClass().getSimpleName(), ExceptionUtils.getStackTrace(e)); System.exit(-1); From 59a93ee43f101f11dea2bcefa4f0803382482125 Mon Sep 17 00:00:00 2001 From: akulikov Date: Tue, 27 Dec 2022 11:27:50 +0300 Subject: [PATCH 05/15] kafka reports --- .../reports/ReportsServiceApplication.java | 6 +- .../reports/reports/AbstractReport.java | 8 ++- .../clearing/reports/reports/ReportId.java | 24 ++++++++ .../reports/ReportWithClearingStatus.java | 6 +- .../{ => reports}/ReportWithPeriod.java | 8 +-- .../reports/bt_12_2/ReportPA_BT2_B.java | 8 +-- .../reports/bt_12_2/ReportPA_BT2_IV.java | 8 +-- .../reports/reports/bt_13/Report_BT13_11.java | 4 +- .../reports/reports/bt_13/Report_BT13_12.java | 38 +----------- .../reports/bt_16_5/Report_BT16_5.java | 6 +- .../reports/bt_17_1/ReportBR_0420315_P1.java | 4 +- .../reports/bt_17_1/ReportBR_0420315_P2.java | 6 +- .../reports/bt_17_2/ReportBR_0420317.java | 6 +- .../reports/bt_17_3/ReportBR_0420318.java | 4 +- .../reports/bt_17_4/ReportBR_0420314_P1.java | 4 +- .../reports/bt_17_4/ReportBR_0420314_P2.java | 6 +- .../reports/bt_17_5/ReportBR_0420312_P1.java | 6 +- .../reports/bt_17_5/ReportBR_0420312_P10.java | 6 +- .../reports/bt_17_5/ReportBR_0420312_P2.java | 6 +- .../reports/bt_17_5/ReportBR_0420312_P3.java | 6 +- .../reports/bt_17_5/ReportBR_0420312_P4.java | 6 +- .../reports/bt_17_5/ReportBR_0420312_P5.java | 6 +- .../reports/bt_17_5/ReportBR_0420312_P6.java | 6 +- .../reports/bt_17_5/ReportBR_0420312_P7.java | 6 +- .../reports/bt_17_5/ReportBR_0420312_P8.java | 6 +- .../reports/bt_17_5/ReportBR_0420312_P9.java | 6 +- .../reports/services/QCommandExecutor.java | 61 +++++++++++++------ .../services/builders/DOCXReportBuilder.java | 10 ++- .../services/builders/FileReportBuilder.java | 11 +++- .../services/builders/XMLReportBuilder.java | 14 ++--- .../ru/spcex/platform/enumeration/Task.java | 3 +- .../domain/cud/reports/ReportRequest.java | 23 +++++++ .../cud/reports/ReportWithPeriodRequest.java | 40 ++++++++++++ 33 files changed, 248 insertions(+), 120 deletions(-) create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportId.java rename clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/{ => reports}/ReportWithPeriod.java (85%) create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequest.java create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportWithPeriodRequest.java diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java index c12ab17d1..9d5ddc570 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java @@ -6,6 +6,7 @@ import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.ConfigurableApplicationContext; +import ru.spcex.clearing.reports.reports.AbstractReport; import ru.spcex.clearing.reports.services.ReportDataCollector; import ru.spcex.clearing.reports.services.ReportsService; import ru.spcex.clearing.reports.services.builders.XMLReportBuilder; @@ -31,10 +32,11 @@ public class ReportsServiceApplication { log.info("Report types: {}", allReports); for (ReportDataCollector collector:allReports.values()) { log.info("Make report {}", collector); - XMLReportBuilder xmlReportBuilder = new XMLReportBuilder(collector.getReportClass(), collector); + XMLReportBuilder xmlReportBuilder = new XMLReportBuilder<>(collector.getReportClass()); LocalDate date2 = LocalDate.now(); LocalDate date1 = LocalDate.of(date2.getYear(), date2.getMonth(), 1);//date2.minusMonths(1); - xmlReportBuilder.createReport(date1, date2); + AbstractReport report = collector.collectReportWithPeriod(date1, date2); + xmlReportBuilder.createReport(report); } log.info("Shutdown application after work"); context.close(); // todo если будет запущен как сервис, сделать выход опционально, по другому. diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java index 7f82058a3..8a1293fb1 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java @@ -2,6 +2,7 @@ package ru.spcex.clearing.reports.reports; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import com.thoughtworks.xstream.annotations.XStreamOmitField; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -13,6 +14,9 @@ public abstract class AbstractReport { protected static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy"); protected static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss"); + @XStreamOmitField + protected ReportId reportId; + @XStreamAsAttribute @XStreamAlias("version") protected String version; @@ -25,9 +29,11 @@ public abstract class AbstractReport { @XStreamAlias("name") protected String name; - public AbstractReport(String version, + public AbstractReport(ReportId reportId, + String version, String code, String name) { + this.reportId = reportId; this.version = version; this.code = code; this.name = name; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportId.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportId.java new file mode 100644 index 000000000..e00830a7f --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportId.java @@ -0,0 +1,24 @@ +package ru.spcex.clearing.reports.reports; + +/** + * Идентификаторы отчётов + */ +public enum ReportId { + PA_BT2_B, PA_BT2_IV, + + BT13_11, BT13_12, + + BT16_5, + + BR_0420315_P1, BR_0420315_P2, + + BR_0420317, + + BR_0420318, + + BR_0420314_P1, BR_0420314_P2, + + BR_0420312_P1, BR_0420312_P2, BR_0420312_P3, BR_0420312_P4, + BR_0420312_P5, BR_0420312_P6, BR_0420312_P7, BR_0420312_P8, + BR_0420312_P9, BR_0420312_P10, +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithClearingStatus.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithClearingStatus.java index e211edeea..e86e5007c 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithClearingStatus.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithClearingStatus.java @@ -2,7 +2,6 @@ package ru.spcex.clearing.reports.reports; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; @@ -11,13 +10,14 @@ public abstract class ReportWithClearingStatus extends ReportWithPeriod { @XStreamAlias("clearingStatus") protected String clearingStatus; - public ReportWithClearingStatus(String version, + public ReportWithClearingStatus(ReportId reportId, + String version, String code, String name, LocalDate startDate, LocalDate endDate, String clearingStatus) { - super(version, code, name, startDate, endDate); + super(reportId, version, code, name, startDate, endDate); this.clearingStatus = clearingStatus; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportWithPeriod.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithPeriod.java similarity index 85% rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportWithPeriod.java rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithPeriod.java index 77a00ec6e..2895b8b4b 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportWithPeriod.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithPeriod.java @@ -1,9 +1,8 @@ -package ru.spcex.clearing.reports; +package ru.spcex.clearing.reports.reports; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import com.thoughtworks.xstream.annotations.XStreamConverter; -import ru.spcex.clearing.reports.reports.AbstractReport; import ru.spcex.clearing.reports.xml_test.FormattedLocalDateConverter; import java.time.LocalDate; @@ -24,12 +23,13 @@ public abstract class ReportWithPeriod extends AbstractReport { protected LocalDate endDate; - public ReportWithPeriod(String version, + public ReportWithPeriod(ReportId reportId, + String version, String code, String name, LocalDate startDate, LocalDate endDate) { - super(version, code, name); + super(reportId, version, code, name); this.startDate = startDate; this.endDate = endDate; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_B.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_B.java index ac062d5fb..ff587a3b4 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_B.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_B.java @@ -2,19 +2,18 @@ package ru.spcex.clearing.reports.reports.bt_12_2; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; @XStreamAlias("netPositionBank") public class ReportPA_BT2_B extends ReportWithPeriod { - @XStreamAsAttribute @XStreamAlias("clearingMemberCategory") private String clearingMemberCategory; - @XStreamAlias("liabilitiesClaimsAssets_fullName") private String liabilitiesClaimsAssetsFullName; @@ -73,7 +72,8 @@ public class ReportPA_BT2_B extends ReportWithPeriod { String claimsAmount, String liabilitiesAmount, String paymentAmount) { - super("0.0.1", + super(ReportId.PA_BT2_B, + "0.0.1", "BT2", "Отчет по нетто-позиции участника клиринга в секции МКР (Уполномоченный банк)", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_IV.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_IV.java index e10ac91bb..dfae151ed 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_IV.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_IV.java @@ -2,19 +2,18 @@ package ru.spcex.clearing.reports.reports.bt_12_2; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; @XStreamAlias("netPositionInitiator") public class ReportPA_BT2_IV extends ReportWithPeriod { - @XStreamAsAttribute @XStreamAlias("clearingMemberCategory") private String clearingMemberCategory; - @XStreamAlias("liabilitiesClaimsAssets_fullName") private String liabilitiesClaimsAssetsFullName; @@ -73,7 +72,8 @@ public class ReportPA_BT2_IV extends ReportWithPeriod { String claimsAmount, String liabilitiesAmount, String paymentAmount) { - super("0.0.1", + super(ReportId.PA_BT2_IV, + "0.0.1", "BT2", "Отчет по нетто-позиции участника клиринга в секции МКР (Вкладчик)", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_11.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_11.java index 893c204ab..c2e631be7 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_11.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_11.java @@ -3,6 +3,7 @@ package ru.spcex.clearing.reports.reports.bt_13; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.reports.AbstractReport; +import ru.spcex.clearing.reports.reports.ReportId; import java.time.LocalDate; import java.time.LocalDateTime; @@ -18,7 +19,6 @@ public class Report_BT13_11 extends AbstractReport { @XStreamAlias("time") private LocalTime time; - @XStreamAlias("inDocumentJournal_registrationDate") private String inDocumentJournalRegistrationDate; @@ -74,7 +74,7 @@ public class Report_BT13_11 extends AbstractReport { String inDocumentJournalDossierNumber, String inDocumentJournalComment, String inDocumentJournalReceiptDate) { - super("0.0.1", "BT 13.11", "Журнал Входящих документов"); + super(ReportId.BT13_11, "0.0.1", "BT 13.11", "Журнал Входящих документов"); this.date = date; this.time = time; this.inDocumentJournalRegistrationDate = inDocumentJournalRegistrationDate; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_12.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_12.java index de765fe63..34a98c0ac 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_12.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_12.java @@ -3,6 +3,7 @@ package ru.spcex.clearing.reports.reports.bt_13; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.reports.AbstractReport; +import ru.spcex.clearing.reports.reports.ReportId; import java.time.LocalDate; import java.time.LocalDateTime; @@ -18,7 +19,6 @@ public class Report_BT13_12 extends AbstractReport { @XStreamAlias("time") private LocalTime time; - @XStreamAlias("outDocumentJournal_registrationDate") private String outDocumentJournalRegistrationDate; @@ -70,41 +70,7 @@ public class Report_BT13_12 extends AbstractReport { String outDocumentJournalAmount, String outDocumentJournalDossierNumber, String outDocumentJournalPostDate) { - super("0.0.1", "BT 13.12", "Журнал Исходящих документов"); - this.date = date; - this.time = time; - this.outDocumentJournalRegistrationDate = outDocumentJournalRegistrationDate; - this.outDocumentJournalRegistrationTime = outDocumentJournalRegistrationTime; - this.outDocumentJournalRegistrationNumber = outDocumentJournalRegistrationNumber; - this.outDocumentJournalDocumentName = outDocumentJournalDocumentName; - this.outDocumentJournalAddress = outDocumentJournalAddress; - this.outDocumentJournalQuantity = outDocumentJournalQuantity; - this.outDocumentJournalClearingCode = outDocumentJournalClearingCode; - this.outDocumentJournalCourierType = outDocumentJournalCourierType; - this.outDocumentJournal_emailDate = outDocumentJournal_emailDate; - this.outDocumentJournalAmount = outDocumentJournalAmount; - this.outDocumentJournalDossierNumber = outDocumentJournalDossierNumber; - this.outDocumentJournalPostDate = outDocumentJournalPostDate; - } - - public Report_BT13_12(String version, - String code, - String name, - LocalDate date, - LocalTime time, - String outDocumentJournalRegistrationDate, - String outDocumentJournalRegistrationTime, - String outDocumentJournalRegistrationNumber, - String outDocumentJournalDocumentName, - String outDocumentJournalAddress, - String outDocumentJournalQuantity, - String outDocumentJournalClearingCode, - String outDocumentJournalCourierType, - String outDocumentJournal_emailDate, - String outDocumentJournalAmount, - String outDocumentJournalDossierNumber, - String outDocumentJournalPostDate) { - super(version, code, name); + super(ReportId.BT13_12, "0.0.1", "BT 13.12", "Журнал Исходящих документов"); this.date = date; this.time = time; this.outDocumentJournalRegistrationDate = outDocumentJournalRegistrationDate; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_16_5/Report_BT16_5.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_16_5/Report_BT16_5.java index 3dc1d5737..79424f6ed 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_16_5/Report_BT16_5.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_16_5/Report_BT16_5.java @@ -3,6 +3,7 @@ package ru.spcex.clearing.reports.reports.bt_16_5; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.reports.AbstractReport; +import ru.spcex.clearing.reports.reports.ReportId; import java.time.LocalDate; import java.time.LocalDateTime; @@ -57,7 +58,10 @@ public class Report_BT16_5 extends AbstractReport { String accountBalanceDebitAmount, String accountBalanceCreditAmount, String accountBalanceCloseAmount) { - super("0.0.1", "BT 16.5", "Отчет о денежных средствах на счете внутреннего учета (клиринговом регистре) Участника клиринга"); + super(ReportId.BT16_5, + "0.0.1", + "BT 16.5", + "Отчет о денежных средствах на счете внутреннего учета (клиринговом регистре) Участника клиринга"); this.date = date; this.time = time; this.clearingHouse = clearingHouse; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P1.java index 47600c673..4e39e10ff 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P1.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P1.java @@ -2,6 +2,7 @@ package ru.spcex.clearing.reports.reports.bt_17_1; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import ru.spcex.clearing.reports.reports.ReportId; import ru.spcex.clearing.reports.reports.ReportWithClearingStatus; import java.time.LocalDate; @@ -28,7 +29,8 @@ public class ReportBR_0420315_P1 extends ReportWithClearingStatus { String destination, String clearingMemberCategory, String clearingStatus) { - super("0.0.1", + super(ReportId.BR_0420315_P1, + "0.0.1", "0420315", "Сведения об исполненных обязательствах, допущенных к клирингу, за отчетный период, часть 1", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P2.java index a7c87f98d..8fe84ff00 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P2.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P2.java @@ -2,7 +2,8 @@ package ru.spcex.clearing.reports.reports.bt_17_1; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; @@ -21,7 +22,8 @@ public class ReportBR_0420315_P2 extends ReportWithPeriod { String destination, String contractQty, String liabilitiesAmount) { - super("0.0.1", + super(ReportId.BR_0420315_P2, + "0.0.1", "0420315", "Сведения об исполненных обязательствах, допущенных к клирингу, за отчетный период, часть 2", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_2/ReportBR_0420317.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_2/ReportBR_0420317.java index 2357530a0..71ef299a7 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_2/ReportBR_0420317.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_2/ReportBR_0420317.java @@ -2,7 +2,8 @@ package ru.spcex.clearing.reports.reports.bt_17_2; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; @@ -19,7 +20,8 @@ public class ReportBR_0420317 extends ReportWithPeriod { private final List rows = new ArrayList<>(); public ReportBR_0420317(LocalDate startDate, LocalDate endDate, String destination) { - super("0.0.1", + super(ReportId.BR_0420317, + "0.0.1", "0420317", "Сведения о предоставлении, прекращении, приостановке," + " возобновлении допуска к клиринговому обслуживанию", diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_3/ReportBR_0420318.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_3/ReportBR_0420318.java index 73dc19c81..507b07940 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_3/ReportBR_0420318.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_3/ReportBR_0420318.java @@ -2,6 +2,7 @@ package ru.spcex.clearing.reports.reports.bt_17_3; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import ru.spcex.clearing.reports.reports.ReportId; import ru.spcex.clearing.reports.reports.ReportWithClearingStatus; import java.time.LocalDate; @@ -19,7 +20,8 @@ public class ReportBR_0420318 extends ReportWithClearingStatus { private final List rows = new ArrayList<>(); public ReportBR_0420318(LocalDate startDate, LocalDate endDate, String clearingStatus, String destination) { - super("0.0.1", + super(ReportId.BR_0420318, + "0.0.1", "0420318", "Сведения о неисполненных обязательствах", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P1.java index 0940041db..e59e2757c 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P1.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P1.java @@ -2,6 +2,7 @@ package ru.spcex.clearing.reports.reports.bt_17_4; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import ru.spcex.clearing.reports.reports.ReportId; import ru.spcex.clearing.reports.reports.ReportWithClearingStatus; import java.time.LocalDate; @@ -19,7 +20,8 @@ public class ReportBR_0420314_P1 extends ReportWithClearingStatus { private final List rows = new ArrayList<>(); public ReportBR_0420314_P1(LocalDate startDate, LocalDate endDate, String clearingStatus, String destination) { - super("0.0.1", + super(ReportId.BR_0420314_P1, + "0.0.1", "0420314", "Сведения об УК и операциях, проведенных по торговым счетам, часть 1", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java index 478698b15..10bfcfb72 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java @@ -2,7 +2,8 @@ package ru.spcex.clearing.reports.reports.bt_17_4; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; @@ -23,7 +24,8 @@ public class ReportBR_0420314_P2 extends ReportWithPeriod { private final List rows = new ArrayList<>(); public ReportBR_0420314_P2(LocalDate startDate, LocalDate endDate, String transactionStatus, String destination) { - super("0.0.1", + super(ReportId.BR_0420314_P2, + "0.0.1", "0420314", "Сведения об УК и операциях, проведенных по торговым счетам, часть 2", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java index dce10d12a..13f432afb 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java @@ -2,7 +2,8 @@ package ru.spcex.clearing.reports.reports.bt_17_5; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; @@ -22,7 +23,8 @@ public class ReportBR_0420312_P1 extends ReportWithPeriod { public ReportBR_0420312_P1(LocalDate startDate, LocalDate endDate, String destination) { - super("0.0.1", + super(ReportId.BR_0420312_P1, + "0.0.1", "0420312", "Сведения о клиринговом обеспечении, часть 1", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P10.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P10.java index 0f79fe269..04dc1bc7f 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P10.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P10.java @@ -2,7 +2,8 @@ package ru.spcex.clearing.reports.reports.bt_17_5; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; @@ -20,7 +21,8 @@ public class ReportBR_0420312_P10 extends ReportWithPeriod { LocalDate endDate, String destination, String liabilitiesAmount) { - super("0.0.5", + super(ReportId.BR_0420312_P10, + "0.0.5", "0420312", "Сведения о клиринговом обеспечении, часть 10", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P2.java index 84dbf562d..4623ebdcf 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P2.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P2.java @@ -2,7 +2,8 @@ package ru.spcex.clearing.reports.reports.bt_17_5; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; @@ -21,7 +22,8 @@ public class ReportBR_0420312_P2 extends ReportWithPeriod { String destination, String liabilitiesClaimsAssetsCompanyId, String liabilitiesClaimsAssetsLiabilities) { - super("0.0.1", + super(ReportId.BR_0420312_P2, + "0.0.1", "0420312", "Сведения о клиринговом обеспечении, часть 2", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P3.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P3.java index 97442b1a9..466573a88 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P3.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P3.java @@ -2,7 +2,8 @@ package ru.spcex.clearing.reports.reports.bt_17_5; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; @@ -21,7 +22,8 @@ public class ReportBR_0420312_P3 extends ReportWithPeriod { String destination, String liabilitiesClaimsAssetsCompanyId, String liabilitiesClaimsAssetsLiabilities) { - super("0.0.5", + super(ReportId.BR_0420312_P3, + "0.0.5", "0420312", "Сведения о клиринговом обеспечении, часть 3", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P4.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P4.java index d4725b978..89aeb0761 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P4.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P4.java @@ -2,7 +2,8 @@ package ru.spcex.clearing.reports.reports.bt_17_5; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; @@ -20,7 +21,8 @@ public class ReportBR_0420312_P4 extends ReportWithPeriod { LocalDate endDate, String destination, String liabilitiesAmount) { - super("0.0.5", + super(ReportId.BR_0420312_P4, + "0.0.5", "0420312", "Сведения о клиринговом обеспечении, часть 4", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P5.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P5.java index 1af1850eb..e3117b3b9 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P5.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P5.java @@ -2,7 +2,8 @@ package ru.spcex.clearing.reports.reports.bt_17_5; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; @@ -20,7 +21,8 @@ public class ReportBR_0420312_P5 extends ReportWithPeriod { LocalDate endDate, String destination, String liabilitiesAmount) { - super("0.0.5", + super(ReportId.BR_0420312_P5, + "0.0.5", "0420312", "Сведения о клиринговом обеспечении, часть 5", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P6.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P6.java index 6b5126f7e..997a7243b 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P6.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P6.java @@ -2,7 +2,8 @@ package ru.spcex.clearing.reports.reports.bt_17_5; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; @@ -20,7 +21,8 @@ public class ReportBR_0420312_P6 extends ReportWithPeriod { LocalDate endDate, String destination, String liabilitiesAmount) { - super("0.0.5", + super(ReportId.BR_0420312_P6, + "0.0.5", "0420312", "Сведения о клиринговом обеспечении, часть 6", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P7.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P7.java index 81b539868..5c7e6523b 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P7.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P7.java @@ -2,7 +2,8 @@ package ru.spcex.clearing.reports.reports.bt_17_5; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; @@ -20,7 +21,8 @@ public class ReportBR_0420312_P7 extends ReportWithPeriod { LocalDate endDate, String destination, String liabilitiesAmount) { - super("0.0.5", + super(ReportId.BR_0420312_P7, + "0.0.5", "0420312", "Сведения о клиринговом обеспечении, часть 7", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P8.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P8.java index 563ffc599..686540b2f 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P8.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P8.java @@ -2,7 +2,8 @@ package ru.spcex.clearing.reports.reports.bt_17_5; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; @@ -26,7 +27,8 @@ public class ReportBR_0420312_P8 extends ReportWithPeriod { String companySymbolValue, String companyInfoCountryCode, String clearingMemberCategoryClearingMemberCategory) { - super("0.0.5", + super(ReportId.BR_0420312_P8, + "0.0.5", "0420312", "Сведения о клиринговом обеспечении, часть 8", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P9.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P9.java index 3438b9d05..5973b8bbc 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P9.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P9.java @@ -2,7 +2,8 @@ package ru.spcex.clearing.reports.reports.bt_17_5; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.ReportWithPeriod; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; @@ -23,7 +24,8 @@ public class ReportBR_0420312_P9 extends ReportWithPeriod { String liabilitiesClaimsAssetsCompanyId, String liabilitiesClaimsMoneyCurrencyCode, String liabilitiesClaimsAssetsLiabilities) { - super("0.0.5", + super(ReportId.BR_0420312_P9, + "0.0.5", "0420312", "Сведения о клиринговом обеспечении, часть 9", startDate, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java index a093f6eec..90b95ed39 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java @@ -1,27 +1,28 @@ package ru.spcex.clearing.reports.services; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; - import org.apache.kafka.clients.consumer.Consumer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -//import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileRequest; todo use class? +import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportWithPeriodRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.clearing.reports.reports.AbstractReport; +import ru.spcex.clearing.reports.reports.ReportId; +import ru.spcex.clearing.reports.services.builders.XMLReportBuilder; import ru.spcex.platform.enumeration.Task; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; +import java.io.File; +import java.io.IOException; +import java.time.LocalDate; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class QCommandExecutor extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); + private final Map collectorForReport = new HashMap<>(); // private final ImdgId idGenerator; // private final KafkaSender kafkaReqProducer; @@ -29,21 +30,45 @@ public class QCommandExecutor extends QueueConsumer implements InitializingBean public QCommandExecutor(Consumer kafkaQueue, ImdgProvider imdgProvider, List listOfCollectors) { super(kafkaQueue); -// todo constructor } @Override public void afterPropertiesSet() { log.debug("Init queue listener {}", getClass().getSimpleName()); -// callback(Object.class) -// .setConsumer(this::newReportDo) -// .forDestination(Task.getVerification!!!.topic(), callbacks::put); // todo здесь надо указать команду из ТЗ или согласовать с фронтэндом -// init(); + callback(ReportWithPeriodRequest.class) + .setConsumer(this::newReportWithPeriod) + .forDestination(Task.createReport.topic(), callbacks::put); } - private void newReportDo(BaseRequest userRequest) { - log.debug("newReportDo request received"); - // todo logic + private void newReportWithPeriod(BaseRequest reportRequest) { + log.debug("newReportWithPeriod request received"); + + ReportWithPeriodRequest request = reportRequest.getRequestPayload(); + + if (request.getReportId() == null || request.getReportId().isBlank()) + throw new IllegalStateException("ReportID is empty"); + ReportId reportId = ReportId.valueOf(request.getReportId()); + ReportDataCollector reportDataCollector = collectorForReport.get(reportId); + if (reportDataCollector == null) + throw new IllegalStateException("Collector for ReportID " + reportId + " not implemented yet"); + + if (request.getStartDate() == null || request.getEndDate() == null) + throw new IllegalStateException("StartDate or EndDate is null"); + LocalDate startDate = request.getStartDate(); + LocalDate endDate = request.getEndDate(); + if (startDate.isAfter(endDate)) throw new IllegalStateException("StartDate > EndDate"); + + XMLReportBuilder reportBuilder = new XMLReportBuilder(reportDataCollector.getReportClass()); + AbstractReport report = reportDataCollector.collectReportWithPeriod(startDate, endDate); + File reportFile = null; + try { + reportFile = reportBuilder.createReport(report); + } catch (IOException e) { + } + + if (reportFile != null) { + // put file in folder + } log.debug("successfully processed"); } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/DOCXReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/DOCXReportBuilder.java index ebf56d43d..2788ca791 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/DOCXReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/DOCXReportBuilder.java @@ -7,10 +7,16 @@ import ru.spcex.clearing.reports.reports.AbstractReport; import java.io.File; import java.io.IOException; -public abstract class DOCXReportBuilder extends FileReportBuilder { +public class DOCXReportBuilder extends FileReportBuilder { private final Logger log = LoggerFactory.getLogger(getClass()); - protected DOCXReportBuilder(Class reportClass, File templateResource) throws IOException { + protected DOCXReportBuilder(Class reportClass, File templateResource) throws IOException { super(reportClass); } + + @Override + public File createReport(AbstractReport report) throws IOException { + // todo implement + return null; + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java index d22e38111..dcde34308 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java @@ -2,10 +2,13 @@ package ru.spcex.clearing.reports.services.builders; import ru.spcex.clearing.reports.reports.AbstractReport; -public abstract class FileReportBuilder { - protected final Class reportClass; +import java.io.File; +import java.io.IOException; - protected FileReportBuilder(Class reportClass) { +public abstract class FileReportBuilder { + protected final Class reportClass; + + protected FileReportBuilder(Class reportClass) { this.reportClass = reportClass; } @@ -13,4 +16,6 @@ public abstract class FileReportBuilder { if (System.getProperty("os.name").toLowerCase().contains("windows")) reportName = reportName.replace(":", "_"); return reportName + extension; } + + public abstract File createReport(AbstractReport report) throws IOException; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java index 0d25b8cf6..61995cab6 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java @@ -6,30 +6,24 @@ import com.thoughtworks.xstream.io.xml.XppDriver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.spcex.clearing.reports.reports.AbstractReport; -import ru.spcex.clearing.reports.services.ReportDataCollector; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.time.LocalDate; import java.time.LocalDateTime; -public class XMLReportBuilder extends FileReportBuilder { +public class XMLReportBuilder extends FileReportBuilder { private final Logger log = LoggerFactory.getLogger(getClass()); - protected final XStream xStream; - protected final ReportDataCollector collector; - - public XMLReportBuilder(Class reportClass, ReportDataCollector collector) { + public XMLReportBuilder(Class reportClass) { super(reportClass); - this.collector = collector; this.xStream = new XStream(new XppDriver(new NoNameCoder())); xStream.processAnnotations(reportClass); } - public File createReport(LocalDate startDate, LocalDate endDate) throws IOException { - R report = collector.collectReportWithPeriod(startDate, endDate); + @Override + public File createReport(AbstractReport report) throws IOException { String reportName = report.getReportName(LocalDateTime.now()); String reportFileName = makeFileName(reportName, ".xml"); diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java index 8233a188e..3d5a6ddcd 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java @@ -14,7 +14,8 @@ public enum Task implements IEnumKey { startPostClearing("SPOC"),// Запуск постклиринга createOrder("CORD"), createOrderConfirm("CORC"), - getAllBalance("GALB"); + getAllBalance("GALB"), + createReport("RPRT");// Создание отчёта (report-service) private final String key; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequest.java new file mode 100644 index 000000000..17952def1 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequest.java @@ -0,0 +1,23 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.reports; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Запрос отчёта (без параметров) report-service + */ +public class ReportRequest { + /** + * Идентификатор отчёта + * см. {@link ru.spcex.clearing.reports.reports.ReportsEnum} + */ + @JsonProperty + protected String reportId; + + public String getReportId() { + return reportId; + } + + public void setReportId(String reportId) { + this.reportId = reportId; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportWithPeriodRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportWithPeriodRequest.java new file mode 100644 index 000000000..4f4c80c75 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportWithPeriodRequest.java @@ -0,0 +1,40 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.reports; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; +import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; + +import java.time.LocalDate; + +/** + * Запрос отчёта с периодом report-service + */ +public class ReportWithPeriodRequest extends ReportRequest { + @JsonSerialize(using = LocalDateSerializer.class) + @JsonDeserialize(using = LocalDateDeserializer.class) + @JsonProperty + protected LocalDate startDate; + + @JsonSerialize(using = LocalDateSerializer.class) + @JsonDeserialize(using = LocalDateDeserializer.class) + @JsonProperty + protected LocalDate endDate; + + public LocalDate getStartDate() { + return startDate; + } + + public void setStartDate(LocalDate startDate) { + this.startDate = startDate; + } + + public LocalDate getEndDate() { + return endDate; + } + + public void setEndDate(LocalDate endDate) { + this.endDate = endDate; + } +} From c6c44b4549b17d4d039fc46d5057fb7384d55eba Mon Sep 17 00:00:00 2001 From: AKurakin Date: Tue, 27 Dec 2022 15:25:37 +0300 Subject: [PATCH 06/15] =?UTF-8?q?reports-service=20=D0=BC=D0=B5=D0=BB?= =?UTF-8?q?=D0=BA=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/spcex/clearing/reports/ReportsServiceApplication.java | 2 +- .../reports/services/collector/Bt17_1_P1_collector.java | 2 +- .../reports/services/collector/Bt17_1_P2_collector.java | 2 +- .../reports-service/src/main/resources/application.properties | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java index 9d5ddc570..99a580de8 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java @@ -32,7 +32,7 @@ public class ReportsServiceApplication { log.info("Report types: {}", allReports); for (ReportDataCollector collector:allReports.values()) { log.info("Make report {}", collector); - XMLReportBuilder xmlReportBuilder = new XMLReportBuilder<>(collector.getReportClass()); + XMLReportBuilder xmlReportBuilder = new XMLReportBuilder(collector.getReportClass()); LocalDate date2 = LocalDate.now(); LocalDate date1 = LocalDate.of(date2.getYear(), date2.getMonth(), 1);//date2.minusMonths(1); AbstractReport report = collector.collectReportWithPeriod(date1, date2); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java index 824306394..c2a42a5bf 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java @@ -103,7 +103,7 @@ public class Bt17_1_P1_collector extends ReportDataCollector collectedToSumm = new HashSet<>(); for (LiabilitiesClaimsAssets lContract : liabilities) { - if (lContract.getPrice() != null && StringUtils.isNotEmpty(lContract.getContract()) + if (lContract.getLiabilitiesQuantity() != null && StringUtils.isNotEmpty(lContract.getContract()) && !collectedToSumm.contains(lContract.getContract())) { collectedToSumm.add(lContract.getContract()); liabilitiesAmount += lContract.getLiabilitiesQuantity().doubleValue(); diff --git a/clearing-parent/reports-service/src/main/resources/application.properties b/clearing-parent/reports-service/src/main/resources/application.properties index c7765a7fe..f4aec6b47 100644 --- a/clearing-parent/reports-service/src/main/resources/application.properties +++ b/clearing-parent/reports-service/src/main/resources/application.properties @@ -19,6 +19,7 @@ reports-service.kafka-consumer.buffer-memory=33554432 #reports-service.kafka-producer.buffer-memory=33554432 reports-service.hazelcast.cluster-members=127.0.0.1:5701,10.200.200.181:5701 + #,10.200.200.181:5701 reports-service.hazelcast.login=dev reports-service.hazelcast.password=dev-pass From 20b05c763d9dc2ceef607ee74667a46d37c34917 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Wed, 28 Dec 2022 20:18:39 +0300 Subject: [PATCH 07/15] =?UTF-8?q?reports-service=20http://jira.mfd.msk:808?= =?UTF-8?q?8/browse/CLS-28=20=D1=87=D0=B0=D1=81=D1=82=D1=8C=20P1=20(todo?= =?UTF-8?q?=20P2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clearing/reports/reports/ReportId.java | 2 +- .../reports/bt_17_4/ReportBR_0420314_P1.java | 31 +++--- .../reports/services/ReportDataCollector.java | 6 + .../reports/services/ReportsService.java | 2 +- .../collector/Bt17_1_P1_collector.java | 22 ++-- .../reports/services/collector/MapUtil.java | 22 ++++ .../Repbr0420314_P1_bt_17_4_collector.java | 105 ++++++++++++++++++ .../spcex/platform/utils/time/TimeUtil.java | 5 + .../platform/utils/time/TimeUtilTest.java | 18 +++ 9 files changed, 184 insertions(+), 29 deletions(-) create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P1_bt_17_4_collector.java create mode 100644 platform-parent/platform-utils/src/test/java/ru/spcex/platform/utils/time/TimeUtilTest.java diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportId.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportId.java index e00830a7f..d2ac8e468 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportId.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportId.java @@ -3,7 +3,7 @@ package ru.spcex.clearing.reports.reports; /** * Идентификаторы отчётов */ -public enum ReportId { +public enum ReportId {//todo переименовать в соответствии с именами файлов () PA_BT2_B, PA_BT2_IV, BT13_11, BT13_12, diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P1.java index e59e2757c..a83fb54e9 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P1.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P1.java @@ -2,8 +2,10 @@ package ru.spcex.clearing.reports.reports.bt_17_4; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import com.thoughtworks.xstream.annotations.XStreamConverter; import ru.spcex.clearing.reports.reports.ReportId; import ru.spcex.clearing.reports.reports.ReportWithClearingStatus; +import ru.spcex.clearing.reports.xml_test.FormattedLocalDateConverter; import java.time.LocalDate; import java.time.LocalDateTime; @@ -41,10 +43,6 @@ public class ReportBR_0420314_P1 extends ReportWithClearingStatus { @XStreamAlias("company_clearingCode") protected String companyClearingCode; - @XStreamAsAttribute - @XStreamAlias("paymentInstruction_senderId") - private String paymentInstructionSenderId; - @XStreamAsAttribute @XStreamAlias("profileDocument_id") private String profileDocumentId; @@ -66,31 +64,36 @@ public class ReportBR_0420314_P1 extends ReportWithClearingStatus { private String clearingMemberCategoryClearingMemberCategory; @XStreamAsAttribute - @XStreamAlias("profileDocument_documentTypeAndValidFromDate") - private String profileDocumentDocumentTypeAndValidFromDate; + @XStreamAlias("liabilitiesClaimsAssets_contract") + private String liabilitiesClaimsAssets_contract; @XStreamAsAttribute - @XStreamAlias("liabilitiesClaimsAssets_liabilitiesQuantity") - private String liabilitiesClaimsAssetsLiabilitiesQuantity; + @XStreamAlias("liabilitiesClaimsAssets_tradingDate") + @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"}) + private LocalDate liabilitiesClaimsAssets_tradingDate; + + @XStreamAsAttribute + @XStreamAlias("liabilitiesClaimsAssests_liabilitiesQuantity") + private String liabilitiesClaimsAssests_liabilitiesQuantity; public Info_0420314_P1(String companyClearingCode, - String paymentInstructionSenderId, String profileDocumentId, String companyFullName, String companySymbolCode, String companySymbolValue, String clearingMemberCategoryClearingMemberCategory, - String profileDocumentDocumentTypeAndValidFromDate, - String liabilitiesClaimsAssetsLiabilitiesQuantity) { + String liabilitiesClaimsAssets_contract, + LocalDate liabilitiesClaimsAssets_tradingDate, + String liabilitiesClaimsAssets_comment) { this.companyClearingCode = companyClearingCode; - this.paymentInstructionSenderId = paymentInstructionSenderId; this.profileDocumentId = profileDocumentId; this.companyFullName = companyFullName; this.companySymbolCode = companySymbolCode; this.companySymbolValue = companySymbolValue; this.clearingMemberCategoryClearingMemberCategory = clearingMemberCategoryClearingMemberCategory; - this.profileDocumentDocumentTypeAndValidFromDate = profileDocumentDocumentTypeAndValidFromDate; - this.liabilitiesClaimsAssetsLiabilitiesQuantity = liabilitiesClaimsAssetsLiabilitiesQuantity; + this.liabilitiesClaimsAssets_contract = liabilitiesClaimsAssets_contract; + this.liabilitiesClaimsAssets_tradingDate = liabilitiesClaimsAssets_tradingDate; + this.liabilitiesClaimsAssests_liabilitiesQuantity = liabilitiesClaimsAssests_liabilitiesQuantity; } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java index 82a8d0001..1ad87fff6 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java @@ -4,6 +4,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.spcex.clearing.reports.reports.AbstractReport; +import java.math.BigDecimal; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; @@ -45,6 +46,11 @@ public abstract class ReportDataCollector { return val.toString(); } + protected String toString(BigDecimal val) { + if (val == null) return null; + return val.toString(); // todo есть ли требования на точность знаков? + } + protected String toString(Instant val) { if (val == null) return null; return DATE_TIME_FORMATTER.format(val.atZone(ZoneId.systemDefault())); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java index 54f5b2277..8217775a1 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java @@ -123,7 +123,7 @@ public class ReportsService { "companySymbolCode", "companySymbolValue", "clearingMemberCategoryClearingMemberCategory", - "profileDocumentDocumentTypeAndValidFromDate", + LocalDate.of(2022,11,10), "liabilitiesClaimsAssetsLiabilitiesQuantity" ); reportBR_0420314P1.getRows().add(info_0420314P1); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java index c2a42a5bf..aaa65c199 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java @@ -18,9 +18,7 @@ import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.*; -import java.util.stream.Collectors; @Component public class Bt17_1_P1_collector extends ReportDataCollector { @@ -63,29 +61,27 @@ public class Bt17_1_P1_collector extends ReportDataCollector liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); Map> indexByCompany = MapUtil.indexList(liabilities, LiabilitiesClaimsAssets::getCompanyId); + company_for: for (Map.Entry> companyEntry : indexByCompany.entrySet()) { final Long companyId = companyEntry.getKey(); List liabilitiesOfCompany = companyEntry.getValue(); Company company = companyImdg.getSingleObjectByID(companyId); if (company != null) { - ClearingMemberCategory cmc = clearingMemberCategoryImdg.getSingleObjectByFieldValues(Map.of("companyId", companyId)); - String checkCategory = cmc == null ? null : cmc.getClearingMemberCategory(); - if (!ALLOW_CLEARING_MEMBER_CATEGORY.contains(checkCategory)) { + Collection cmcLst = clearingMemberCategoryImdg.getCollectionObjectsByFieldValues(Map.of("companyId", companyId)); + boolean checkCategory = cmcLst.stream() + .anyMatch(cmc -> ALLOW_CLEARING_MEMBER_CATEGORY.contains(cmc.getClearingMemberCategory())); + if (!checkCategory) { // фильтруются <> I, V - log.trace("Filtered company[{}] ClearingMemberCategory[{}].ClearingMemberCategory={}", - companyId, cmc == null ? null : cmc.getId(), checkCategory); - continue; + log.trace("Filtered company[{}] ClearingMemberCategory no match: {}", + companyId, cmcLst); + continue company_for; } HashSet onMarket = new HashSet<>(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/MapUtil.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/MapUtil.java index 2b9216819..e49ff0ca6 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/MapUtil.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/MapUtil.java @@ -1,12 +1,26 @@ package ru.spcex.clearing.reports.services.collector; +import org.apache.commons.lang3.StringUtils; +import ru.clearing.platform.dictionary.AbstractDictionary; import ru.spcex.platform.classes.base.interfaces.WithId; +import ru.spcex.platform.imdg.api.Imdg; import java.util.*; import java.util.function.Function; public class MapUtil { + public static String joinMultiString(Collection from, Function stringFieldExtractor) { + ArrayList strToJoin = new ArrayList<>(from.size()); + for (V obj : from) { + String v = stringFieldExtractor.apply(obj); + if (v != null) { + strToJoin.add(v); + } + } + return StringUtils.join(strToJoin, ","); + } + public static Map index(Collection from, Function indexFieldExtractor) { Map index = new HashMap<>(); for (V obj : from) { @@ -30,4 +44,12 @@ public class MapUtil { } return index; } + + public static Long getDictionaryIdByCode(Imdg dImdg, String code) { + TD dictItem = dImdg.getSingleObjectByFieldValues(Map.of("code", code)); + if (dictItem == null) { + throw new IllegalStateException(dImdg.getMapName() + " with code=\"" + code + "\" not fount"); + } + return dictItem.getId(); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P1_bt_17_4_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P1_bt_17_4_collector.java new file mode 100644 index 000000000..6608da0b5 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P1_bt_17_4_collector.java @@ -0,0 +1,105 @@ +package ru.spcex.clearing.reports.services.collector; + +import org.springframework.beans.factory.annotation.Autowired; +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.generated.ClearingMemberCategory; +import ru.clearing.classes.transaction.data.execution.LiabilitiesClaimsAssets; +import ru.clearing.platform.dictionary.ClearingStatusDictionary; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.bt_17_4.ReportBR_0420314_P1; +import ru.spcex.clearing.reports.services.ReportDataCollector; +import ru.spcex.platform.enumeration.ClearingStatus; +import ru.spcex.platform.enumeration.DocumentTypes; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.time.TimeUtil; + +import java.time.LocalDate; +import java.util.Collection; +import java.util.Map; + +/** + * accountTransactionLiabilities + */ +@Component +public class Repbr0420314_P1_bt_17_4_collector extends ReportDataCollector { + private Imdg companyImdg; + private Imdg companySymbolsImdg; + private Imdg clearingMemberCategoryImdg; + private Imdg liabilitiesClaimsAssetsImdg; + private Imdg clearingStatusDictionaryImdg; + + protected static final String ALLOW_CLEARING_STATUS = ClearingStatus.OK.getKey(); + + @Autowired + public Repbr0420314_P1_bt_17_4_collector(ImdgProvider imdgProvider) { + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); + companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); + clearingStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingStatusDictionary, ClearingStatusDictionary.class); + } + + protected CompanySymbols findSymbol(DocumentTypes docType, Long companyId) { + CompanySymbols companySymbol = companySymbolsImdg.getSingleObjectByFieldValues(Map.of( + "companySymbol", docType.getKey(), + "companyId", companyId + )); + return companySymbol; + } + + + @Override + public ReportBR_0420314_P1 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { + validateDateRange(startDate, endDate); + + ReportBR_0420314_P1 reportBR_0420312P1 = new ReportBR_0420314_P1(startDate, endDate, "BR", + ALLOW_CLEARING_STATUS //clearingStatus.getCode() "OK" + ); + final Long allowClearingStatusId = MapUtil.getDictionaryIdByCode(clearingStatusDictionaryImdg, ALLOW_CLEARING_STATUS); // "OK" + + String ql = String.format("'%s' <= refundDate and refundDate <= '%s' and clearingStatus=%s", + startDate, endDate, allowClearingStatusId); + Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); + + for (LiabilitiesClaimsAssets liability: liabilities) { + final Long companyId = liability.getCompanyId(); + Company company = companyImdg.getSingleObjectByID(companyId); + Collection cmcLst = clearingMemberCategoryImdg.getCollectionObjectsByFieldValues(Map.of("companyId", companyId)); +// boolean checkCategory = cmcLst.stream().anyMatch(cmc -> ALLOW_CLEARING_MEMBER_CATEGORY.contains(cmc.getClearingMemberCategory())); +// if (!checkCategory) { +// // фильтруются <> I, V +// log.trace("Filtered company[{}] ClearingMemberCategory no match: {}", +// companyId, cmcLst); +// continue company_for; +// } + String cleanMemberCategories = MapUtil.joinMultiString(cmcLst, ClearingMemberCategory::getClearingMemberCategory); + + CompanySymbols companySymbolCntr = findSymbol(DocumentTypes.cntr, company.getId()); + CompanySymbols companySymbolINN = findSymbol(DocumentTypes.inn, company.getId()); + CompanySymbols companySymbolOGRN = findSymbol(DocumentTypes.ogrn, company.getId()); + + ReportBR_0420314_P1.Info_0420314_P1 info_0420314P1 = new ReportBR_0420314_P1.Info_0420314_P1( + company.getClearingCode(), + toString(companySymbolCntr == null? null : companySymbolCntr.getId()), + company.getFullName(), + (companySymbolINN == null ? null : companySymbolINN.getCompanySymbolValue()), + (companySymbolOGRN == null? null : companySymbolOGRN.getCompanySymbolValue()), + cleanMemberCategories, // может быть несколько, тогда через запятую перечислить + toString(liability.getRefundPaymentId()), + TimeUtil.toLocalDate(liability.getTradingDate()), + toString(liability.getLiabilitiesQuantity()) + ); + reportBR_0420312P1.getRows().add(info_0420314P1); + } + + return reportBR_0420312P1; + } + + @Override + public Class getReportClass() { + return ReportBR_0420314_P1.class; + } +} diff --git a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/time/TimeUtil.java b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/time/TimeUtil.java index d3fcf9119..bd7bc0f90 100644 --- a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/time/TimeUtil.java +++ b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/time/TimeUtil.java @@ -59,4 +59,9 @@ public class TimeUtil { public static Instant strToInstant(String date) { return localDateToInstant(Objects.requireNonNull(strToLocalDate(date))); } + + public static LocalDate toLocalDate(Instant date) { + if (date == null) return null; + return LocalDate.ofInstant(date, ZoneId.systemDefault()); + } } diff --git a/platform-parent/platform-utils/src/test/java/ru/spcex/platform/utils/time/TimeUtilTest.java b/platform-parent/platform-utils/src/test/java/ru/spcex/platform/utils/time/TimeUtilTest.java new file mode 100644 index 000000000..ee5bff21b --- /dev/null +++ b/platform-parent/platform-utils/src/test/java/ru/spcex/platform/utils/time/TimeUtilTest.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.utils.time; + +import org.junit.jupiter.api.Test; + +import java.time.Instant; +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.*; + +class TimeUtilTest { + + @Test + void toLocalDate() { + Instant date1 = Instant.ofEpochMilli(1234567890123L); + LocalDate date2 = TimeUtil.toLocalDate(date1); + assertEquals("2009-02-14", date2.toString()); + } +} \ No newline at end of file From f069bab18a64a4eab2b016b6f63f7e2ebf69aae2 Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 29 Dec 2022 14:00:35 +0300 Subject: [PATCH 08/15] RRPC, REX notification --- .../notifications/NotificationBuilder.java | 43 +++++++ .../notifications/REXNotificationBuilder.java | 106 +++++++++++++++++ .../RRPCNotificationBuilder.java | 112 ++++++++++++++++++ .../reports/services/DOCXService.java | 72 +++++++---- .../reports/services/QCommandExecutor.java | 2 + .../resources/templates/REX_TEMPLATE.docx | Bin 0 -> 10193 bytes .../resources/templates/RRPC_TEMPLATE.docx | Bin 0 -> 10517 bytes .../reports/services/DOCXServiceTest.java | 5 +- .../cud/reports/NotificationRequest.java | 23 ++++ 9 files changed, 338 insertions(+), 25 deletions(-) create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java create mode 100644 clearing-parent/reports-service/src/main/resources/templates/REX_TEMPLATE.docx create mode 100644 clearing-parent/reports-service/src/main/resources/templates/RRPC_TEMPLATE.docx create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/NotificationRequest.java diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java new file mode 100644 index 000000000..cc212b236 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java @@ -0,0 +1,43 @@ +package ru.spcex.clearing.reports.notifications; + +import ru.spcex.clearing.reports.exceptions.ConfigException; +import ru.spcex.clearing.reports.services.DOCXService; + +import java.io.File; +import java.net.URL; +import java.time.format.DateTimeFormatter; + +public abstract class NotificationBuilder { + protected final DateTimeFormatter filenameDateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss"); + protected final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); + protected final DOCXService docxService; + + protected NotificationBuilder(String keyPattern) { + this.docxService = new DOCXService(); + if (!docxService.init(getTemplateFile(), keyPattern)) + throw new ConfigException("Can't create NotificationBuilder: docxService not initialized"); + } + + abstract public File buildNotification(Long consumerId); + + protected File getTemplateFile() { + File templateFile; + String templateResourceName = getTemplateResourceName(); + try { + URL resource = getClass().getClassLoader().getResource(templateResourceName); + if (resource == null) throw new Exception(); + templateFile = new File(resource.toURI()); + } catch (Exception e) { + throw new ConfigException("Can't read template resource " + templateResourceName, e); + } + return templateFile; + } + + protected String normalizeFilenameForOS(String filename) { + if (System.getProperty("os.name").toLowerCase().contains("windows")) + return filename.replace(":", "_"); + return filename; + } + + abstract protected String getTemplateResourceName(); +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java new file mode 100644 index 000000000..e53754c09 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java @@ -0,0 +1,106 @@ +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.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 REXNotificationBuilder extends NotificationBuilder { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Imdg profileDocumentImdg; + private final Imdg companyImdg; + + public REXNotificationBuilder(ImdgProvider imdgProvider) { + super(null); + profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class); + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + } + + @Override + public File buildNotification(Long consumerId) { + String sql = "companyId = %d AND documentType = 'XCNT'".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; + } + + 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("${validFromDate}", "%02d.%02d.%04d".formatted(day, month, year)); + + String outputFilename = "REX.%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/REX_TEMPLATE.docx"; + } + +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java new file mode 100644 index 000000000..46ff76f60 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java @@ -0,0 +1,112 @@ +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 RRPCNotificationBuilder extends NotificationBuilder { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Imdg companyImdg; + private final Imdg relationImdg; + private final Imdg companySymbolsImdg; + + public RRPCNotificationBuilder(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("${relationUpdatedAt}", dateFormatter.format(updatedAt)); + valuesForTemplate.put("${companyFullName}", company.getFullName()); + valuesForTemplate.put("${companyShortName}", company.getShortName()); + valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); + valuesForTemplate.put("${companyClearingCode}", companyClearingCode); + + String outputFilename = "RRPC.%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/RRPC_TEMPLATE.docx"; + } + +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/DOCXService.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/DOCXService.java index 86483a38b..02e1813eb 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/DOCXService.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/DOCXService.java @@ -2,6 +2,7 @@ package ru.spcex.clearing.reports.services; import org.apache.poi.xwpf.usermodel.*; import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.*; import java.util.LinkedList; @@ -10,6 +11,7 @@ import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; import java.util.stream.Collectors; /** @@ -22,58 +24,86 @@ import java.util.stream.Collectors; * идентификатору потом можно установить стиль, который будет применён к вставляемой строке. */ public class DOCXService { + private final Logger log = LoggerFactory.getLogger(getClass()); /** * При инициализации сохраняет все имеющиеся ключи (ищет по маске keyPattern), найденные в текстовых элементах документа */ private List keyPositions = new LinkedList<>(); + /** + * Паттерн поиска ключей в файле по умолчанию + */ + private final Pattern DEFAULT_KEY_PATTERN = Pattern.compile("\\$\\{.*?}"); + /** * Паттерн поиска ключей в файле */ - private Pattern KEY_PATTERN = Pattern.compile("\\$\\{.*?}"); + private Pattern keyPattern = DEFAULT_KEY_PATTERN; + + /** + * Файл шаблона + */ + private File templateFile; + + /** + * Флаг инициализации + */ + private boolean initialized = false; /** * (ре)Инициализация сервиса */ - public void init(String keyPattern) { - KEY_PATTERN = Pattern.compile(keyPattern); + public boolean init(File templateFile, String keyPattern) { + initialized = false; + if (templateFile == null || !templateFile.exists() || !templateFile.isFile()) { + log.warn("Invalid templateFile"); + return false; + } + this.templateFile = templateFile; + if (keyPattern != null) { + try { + this.keyPattern = Pattern.compile(keyPattern); + } catch (PatternSyntaxException e) { + log.warn("Invalid keyPattern"); + return false; + } + } else { + this.keyPattern = DEFAULT_KEY_PATTERN; + } keyPositions = new LinkedList<>(); + initialized = true; + return true; } /** * Вставка значений в шаблон. Шаблон может содержать любое количество ключей, при этом эти ключи должны содержаться в * valuesMap. * - * @param templateFile Файл шаблона * @param outputFile Выходной файл. Должен быть либо файлом (будет перезаписан), либо отсутствовать * @param valuesMap Мапа значений. В файле шаблона будут искаться ключи этой мапы и заменяться на соответствующие значения. - * @param log Если будет передан null, то метод будет выбрасывать исключения. В противном случае будет записан лог и возвращено false * @param checkKeys True - строгий режим, где будет проверено наличие всех ключей из файла в valuesMap. * False - мягкий режим, отсутствующие ключи будут пропущены * * @return true - если вставка прошла успешно */ - public boolean insertValues(File templateFile, - File outputFile, + public boolean insertValues(File outputFile, Map valuesMap, - Logger log, boolean checkKeys) throws Exception { - assert templateFile != null && templateFile.exists() && templateFile.isFile(); + if (!initialized) { + log.warn("DOCXService not initialized"); + return false; + } if (outputFile == null || outputFile.isDirectory()) { - String logMsg = "Can't open output file. Output file: %s".formatted(outputFile == null ? "null" : outputFile.getAbsolutePath()); - if (log == null) throw new Exception(logMsg); - log.error(logMsg); + log.error("Can't open output file. Output file: {}", outputFile == null ? "null" : outputFile.getAbsolutePath()); return false; } if (outputFile.exists()) { - if (log != null) log.warn("Output file {} exist and will be overwritten", outputFile.getAbsolutePath()); + log.warn("Output file {} exist and will be overwritten", outputFile.getAbsolutePath()); boolean deleteOk = outputFile.delete(); if (!deleteOk) { - String logMsg = "Can't delete file %s".formatted(outputFile.getAbsolutePath()); - if (log == null) throw new Exception(logMsg); - log.error(logMsg); + log.error("Can't delete file {}", outputFile.getAbsolutePath()); return false; } } @@ -94,11 +124,9 @@ public class DOCXService { List notPresentInMap = new LinkedList<>(); boolean checkOk = checkIntersection(valuesMap, notPresentInMap); if (!checkOk) { - String logMsg = "Can't insert values in file %s. Keys not in map: %s." - .formatted(templateFile.getAbsolutePath(), - String.join(", ", notPresentInMap)); - if (log == null) throw new Exception(logMsg); - log.error(logMsg); + log.error("Can't insert values in file {}. Keys not in map: {}.", + templateFile.getAbsolutePath(), + String.join(", ", notPresentInMap)); return false; } } @@ -178,7 +206,7 @@ public class DOCXService { for (int currPos = 0; currPos < MAX_POSITION; currPos++) { String currText = run.getText(currPos); if (currText == null) break; - Matcher matcher = KEY_PATTERN.matcher(currText); + Matcher matcher = keyPattern.matcher(currText); while (matcher.find()) { String key = matcher.group(); keyPositions.add(new KeyPositionInDoc(key, run, currPos)); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java index 90b95ed39..3d5e55548 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java @@ -23,6 +23,7 @@ import java.util.Map; public class QCommandExecutor extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final Map collectorForReport = new HashMap<>(); + // private final ImdgId idGenerator; // private final KafkaSender kafkaReqProducer; @@ -71,4 +72,5 @@ public class QCommandExecutor extends QueueConsumer implements InitializingBean } log.debug("successfully processed"); } + } diff --git a/clearing-parent/reports-service/src/main/resources/templates/REX_TEMPLATE.docx b/clearing-parent/reports-service/src/main/resources/templates/REX_TEMPLATE.docx new file mode 100644 index 0000000000000000000000000000000000000000..363dc25682bd2d347e95ab064f450805b0c29b86 GIT binary patch literal 10193 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 z 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 md-Crre*ZN8sz?cv|8?$=0zkfq6$AwSwMYY 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 literal 0 HcmV?d00001 diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/DOCXServiceTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/DOCXServiceTest.java index 528d64be2..ffd640744 100644 --- a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/DOCXServiceTest.java +++ b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/DOCXServiceTest.java @@ -19,10 +19,9 @@ class DOCXServiceTest { valuesMap.put("${test3}", "======== TEST 3 ========="); DOCXService service = new DOCXService(); - service.insertValues(new File(getClass().getClassLoader().getResource("REC.ACTV_TEST.docx").getPath()), - new File("output.docx"), + service.init(new File(getClass().getClassLoader().getResource("REC.ACTV_TEST.docx").getPath()), null); + service.insertValues(new File("output.docx"), valuesMap, - null, false); File file = new File("output.docx"); diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/NotificationRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/NotificationRequest.java new file mode 100644 index 000000000..f09103e1d --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/NotificationRequest.java @@ -0,0 +1,23 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.reports; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Запрос на формирование уведомления + */ +public class NotificationRequest { + /** + * Идентификатор участника клиринга + */ + @JsonProperty + protected String consumerId; + + + public String getConsumerId() { + return consumerId; + } + + public void setConsumerId(String consumerId) { + this.consumerId = consumerId; + } +} From f66c33410095ffbf4623069d87c264407fd61689 Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 29 Dec 2022 14:51:41 +0300 Subject: [PATCH 09/15] 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 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 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 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 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 From c7f6d097cc7e3fd9bf7ea9a7334b1f88fde53498 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Thu, 29 Dec 2022 16:51:58 +0300 Subject: [PATCH 10/15] =?UTF-8?q?reports-service=20http://jira.mfd.msk:808?= =?UTF-8?q?8/browse/CLS-28=20=D1=87=D0=B0=D1=81=D1=82=D1=8C=20P2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reports/bt_17_4/ReportBR_0420314_P2.java | 6 - .../reports/services/ReportDataCollector.java | 7 +- .../reports/services/ReportsService.java | 1 - .../Repbr0420314_P2_bt_17_4_collector.java | 114 ++++++++++++++++++ .../services/ReportDataCollectorTest.java | 15 ++- 5 files changed, 131 insertions(+), 12 deletions(-) create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P2_bt_17_4_collector.java diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java index 10bfcfb72..c52189434 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java @@ -45,10 +45,6 @@ public class ReportBR_0420314_P2 extends ReportWithPeriod { @XStreamAlias("company_clearingCode") protected String companyClearingCode; - @XStreamAsAttribute - @XStreamAlias("paymentInstruction_senderId") - private String paymentInstructionSenderId; - @XStreamAsAttribute @XStreamAlias("profileDocument_id") private String profileDocumentId; @@ -70,14 +66,12 @@ public class ReportBR_0420314_P2 extends ReportWithPeriod { private String accountBalanceCloseBalanceAmount; public Info_0420314_P2(String companyClearingCode, - String paymentInstructionSenderId, String profileDocumentId, String accountBalanceOpenBalanceAmount, String paymentInstructionCreditLegAmount, String paymentInstructionDebitLegAmount, String accountBalanceCloseBalanceAmount) { this.companyClearingCode = companyClearingCode; - this.paymentInstructionSenderId = paymentInstructionSenderId; this.profileDocumentId = profileDocumentId; this.accountBalanceOpenBalanceAmount = accountBalanceOpenBalanceAmount; this.paymentInstructionCreditLegAmount = paymentInstructionCreditLegAmount; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java index 1ad87fff6..bb99d1d68 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java @@ -48,11 +48,16 @@ public abstract class ReportDataCollector { protected String toString(BigDecimal val) { if (val == null) return null; - return val.toString(); // todo есть ли требования на точность знаков? + return val.toString(); } protected String toString(Instant val) { if (val == null) return null; return DATE_TIME_FORMATTER.format(val.atZone(ZoneId.systemDefault())); } + + protected String toString(LocalDate date) { + if (date == null) return null; + return DATE_TIME_FORMATTER.format(date); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java index 8217775a1..f0ba2a4a7 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java @@ -133,7 +133,6 @@ public class ReportsService { ReportBR_0420314_P2 reportBR_0420314P2 = new ReportBR_0420314_P2(LocalDate.now(), LocalDate.now(), "transactionStatus", "BR"); ReportBR_0420314_P2.Info_0420314_P2 info_0420314P2 = new ReportBR_0420314_P2.Info_0420314_P2("companyClearingCode", - "paymentInstructionSenderId", "profileDocumentId", "accountBalanceOpenBalanceAmt", "paymentInstructionCreditLegAmount", diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P2_bt_17_4_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P2_bt_17_4_collector.java new file mode 100644 index 000000000..b19c54de5 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P2_bt_17_4_collector.java @@ -0,0 +1,114 @@ +package ru.spcex.clearing.reports.services.collector; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import ru.clearing.classes.statics.data.account.AccountBalance; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.payment.PaymentInstruction; +import ru.clearing.classes.statics.data.profile.ProfileDocument; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.bt_17_4.ReportBR_0420314_P2; +import ru.spcex.clearing.reports.services.ReportDataCollector; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.DocumentTypes; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.time.LocalDate; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * accountTransactionLiabilities + */ +@Component +public class Repbr0420314_P2_bt_17_4_collector extends ReportDataCollector { + private Imdg companyImdg; + private Imdg paymentInstructionImdg; + private Imdg accountBalanceImdg; + private Imdg profileDocumentImdg; + + @Autowired + public Repbr0420314_P2_bt_17_4_collector(ImdgProvider imdgProvider) { + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + paymentInstructionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); + accountBalanceImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class); + profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class); + } + + @Override + public ReportBR_0420314_P2 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { + validateDateRange(startDate, endDate); + + ReportBR_0420314_P2 reportBR_0420312P2 = new ReportBR_0420314_P2(startDate, endDate, + "", "BR" + ); + + String ql = String.format("'%s' <= created and created <= '%s'", + startDate, endDate); + Collection paymentInstructionsAll = paymentInstructionImdg.getCollectionObjectsBySQL(ql); + + Map> companyIdPyPaymtInstruction = + MapUtil.indexList(paymentInstructionsAll, PaymentInstruction::getSenderId); + + for (Map.Entry> entry : companyIdPyPaymtInstruction.entrySet()) { + final Long companyId = entry.getKey(); + List paymentInstructionsByCompany = entry.getValue(); + Company company = companyImdg.getSingleObjectByID(companyId); + ProfileDocument profileDocumentCntr = profileDocumentImdg.getSingleObjectByFieldValues(Map.of( + "companyId", companyId, + "documentType", DocumentTypes.cntr.getKey() + )); + AccountBalance accountBalance = accountBalanceImdg.getSingleObjectByFieldValues(Map.of( + "accountType", AccountType.Clrn.getKey(), + "companyId", companyId + )); + + String documentTypeStr = null; + if (profileDocumentCntr != null) { + documentTypeStr = profileDocumentCntr.getNumber(); + if (profileDocumentCntr.getValidFromDate() != null) { + if (StringUtils.isEmpty(documentTypeStr)) { + documentTypeStr = ""; + } else { + documentTypeStr += " "; + } + documentTypeStr += toString(profileDocumentCntr.getValidFromDate()); + } + } + + Long paymentInstruction_creditLeg_amount = paymentInstructionsByCompany.stream() + .map(PaymentInstruction::getCreditLegAmount) + .filter(Objects::nonNull) + .reduce(Long::sum) + .orElse(0L); + Long paymentInstructiont_debitLeg_amount = paymentInstructionsByCompany.stream() + .map(PaymentInstruction::getDebitLegAmount) + .filter(Objects::nonNull) + .reduce(Long::sum) + .orElse(0L); + + + ReportBR_0420314_P2.Info_0420314_P2 info_0420314P2 = new ReportBR_0420314_P2.Info_0420314_P2( + company.getClearingCode(), + documentTypeStr, + accountBalance == null ? null : toString(accountBalance.getOpenBalanceAmount()), + toString(paymentInstruction_creditLeg_amount), + toString(paymentInstructiont_debitLeg_amount), + accountBalance == null ? null : toString(accountBalance.getCloseBalanceAmount()) + ); + + reportBR_0420312P2.getRows().add(info_0420314P2); + } + + return reportBR_0420312P2; + } + + @Override + public Class getReportClass() { + return ReportBR_0420314_P2.class; + } +} diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java index 0e730578b..7c16b767c 100644 --- a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java +++ b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java @@ -14,20 +14,27 @@ class ReportDataCollectorTest extends ReportDataCollector { @Test void testToString() { ReportDataCollectorTest instance = new ReportDataCollectorTest(); - assertEquals(null, instance.toString((Long)null)); - assertEquals("1", instance.toString((Long)1L)); - assertEquals("1230", instance.toString((Long)1230L)); + assertEquals(null, instance.toString((Long) null)); + assertEquals("1", instance.toString((Long) 1L)); + assertEquals("1230", instance.toString((Long) 1230L)); } @Test void testToString1() { ReportDataCollectorTest instance = new ReportDataCollectorTest(); - assertEquals(null, instance.toString((Instant)null)); + assertEquals(null, instance.toString((Instant) null)); Instant val = Instant.ofEpochMilli(1672058774338L); assertEquals("26.12.2022T15:46:14", instance.toString(val)); // msk timezone } + @Test + void testToString2() { + ReportDataCollectorTest instance = new ReportDataCollectorTest(); + LocalDate val = LocalDate.of(2022, 12, 26); + assertEquals("26.12.2022", instance.toString(val)); + } + @Override public AbstractReport collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { throw new IllegalStateException("test"); From 732ad424f4be5737c784a7676f50fecde525f1a9 Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 29 Dec 2022 17:09:41 +0300 Subject: [PATCH 11/15] tests for notifications --- .../notifications/REXNotificationBuilder.java | 13 +- .../ROOT_ACTV_NotificationBuilder.java | 11 +- .../ROOT_BLKD_NotificationBuilder.java | 11 +- .../ROOT_CLOS_NotificationBuilder.java | 13 +- .../ROOT_NEW_NotificationBuilder.java | 13 +- .../ROOT_SSPD_NotificationBuilder.java | 11 +- .../RRPCNotificationBuilder.java | 12 +- .../resources/templates/REX_TEMPLATE.docx | Bin 10193 -> 10194 bytes .../templates/ROOT.ACTV_TEMPLATE.docx | Bin 10469 -> 10413 bytes .../templates/ROOT.BLKD_TEMPLATE.docx | Bin 10331 -> 10363 bytes .../templates/ROOT.CLOS_TEMPLATE.docx | Bin 10390 -> 10398 bytes .../templates/ROOT.NEW_TEMPLATE.docx | Bin 10401 -> 10414 bytes .../templates/ROOT.SSPD_TEMPLATE.docx | Bin 10372 -> 10375 bytes .../resources/templates/RRPC_TEMPLATE.docx | Bin 10517 -> 10524 bytes .../NotificationBuilderTest.java | 143 ++++++++++++++++++ 15 files changed, 189 insertions(+), 38 deletions(-) create mode 100644 clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/notifications/NotificationBuilderTest.java diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java index e53754c09..48f539fc2 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java @@ -12,10 +12,9 @@ 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; +import java.time.LocalDateTime; +import java.time.format.TextStyle; +import java.util.*; @Component public class REXNotificationBuilder extends NotificationBuilder { @@ -70,7 +69,7 @@ public class REXNotificationBuilder extends NotificationBuilder { return null; } - LocalDate notificationDate = LocalDate.now(); + LocalDateTime notificationDate = LocalDateTime.now(); int day = notificationDate.getDayOfMonth(); int month = notificationDate.getMonthValue(); int year = notificationDate.getYear(); @@ -80,8 +79,8 @@ public class REXNotificationBuilder extends NotificationBuilder { 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("${currMonth}", notificationDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("ru"))); + valuesForTemplate.put("${currYear}", "%02d".formatted(year % 100)); valuesForTemplate.put("${validFromDate}", "%02d.%02d.%04d".formatted(day, month, year)); String outputFilename = "REX.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(notificationDate)); 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 index 5dbf69886..9ec7c85e2 100644 --- 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 @@ -15,6 +15,9 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import java.io.File; import java.time.Instant; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.TextStyle; import java.util.*; @Component @@ -71,7 +74,7 @@ public class ROOT_ACTV_NotificationBuilder extends NotificationBuilder { return null; } - LocalDate notificationDate = LocalDate.now(); + LocalDateTime notificationDate = LocalDateTime.now(); int day = notificationDate.getDayOfMonth(); int month = notificationDate.getMonthValue(); int year = notificationDate.getYear(); @@ -81,13 +84,13 @@ public class ROOT_ACTV_NotificationBuilder extends NotificationBuilder { 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("${currMonth}", notificationDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("ru"))); + valuesForTemplate.put("${currYear}", "%02d".formatted(year % 100)); valuesForTemplate.put("${companyFullName}", company.getFullName()); valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); valuesForTemplate.put("${companyClearingCode}", companyClearingCode); - valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt)); + valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(ZoneId.systemDefault()).toLocalDate())); String outputFilename = "ROOT.ACTV.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(notificationDate)); outputFilename = normalizeFilenameForOS(outputFilename); 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 index 7b619e177..a9d757451 100644 --- 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 @@ -15,6 +15,9 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import java.io.File; import java.time.Instant; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.TextStyle; import java.util.*; @Component @@ -71,7 +74,7 @@ public class ROOT_BLKD_NotificationBuilder extends NotificationBuilder { return null; } - LocalDate notificationDate = LocalDate.now(); + LocalDateTime notificationDate = LocalDateTime.now(); int day = notificationDate.getDayOfMonth(); int month = notificationDate.getMonthValue(); int year = notificationDate.getYear(); @@ -81,13 +84,13 @@ public class ROOT_BLKD_NotificationBuilder extends NotificationBuilder { 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("${currMonth}", notificationDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("ru"))); + valuesForTemplate.put("${currYear}", "%02d".formatted(year % 100)); valuesForTemplate.put("${companyFullName}", company.getFullName()); valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); valuesForTemplate.put("${companyClearingCode}", companyClearingCode); - valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt)); + valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(ZoneId.systemDefault()).toLocalDate())); String outputFilename = "ROOT.BLKD.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(notificationDate)); outputFilename = normalizeFilenameForOS(outputFilename); 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 index e84ee9b06..4ccbb8d21 100644 --- 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 @@ -13,10 +13,9 @@ 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; +import java.time.LocalDateTime; +import java.time.format.TextStyle; +import java.util.*; @Component public class ROOT_CLOS_NotificationBuilder extends NotificationBuilder { @@ -83,7 +82,7 @@ public class ROOT_CLOS_NotificationBuilder extends NotificationBuilder { return null; } - LocalDate notificationDate = LocalDate.now(); + LocalDateTime notificationDate = LocalDateTime.now(); int day = notificationDate.getDayOfMonth(); int month = notificationDate.getMonthValue(); int year = notificationDate.getYear(); @@ -93,8 +92,8 @@ public class ROOT_CLOS_NotificationBuilder extends NotificationBuilder { 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("${currMonth}", notificationDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("ru"))); + valuesForTemplate.put("${currYear}", "%02d".formatted(year % 100)); valuesForTemplate.put("${companyFullName}", company.getFullName()); valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); valuesForTemplate.put("${companyClearingCode}", companyClearingCode); 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 index a698ce90c..f341e75d1 100644 --- 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 @@ -13,10 +13,9 @@ 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; +import java.time.LocalDateTime; +import java.time.format.TextStyle; +import java.util.*; @Component public class ROOT_NEW_NotificationBuilder extends NotificationBuilder { @@ -83,7 +82,7 @@ public class ROOT_NEW_NotificationBuilder extends NotificationBuilder { return null; } - LocalDate notificationDate = LocalDate.now(); + LocalDateTime notificationDate = LocalDateTime.now(); int day = notificationDate.getDayOfMonth(); int month = notificationDate.getMonthValue(); int year = notificationDate.getYear(); @@ -93,8 +92,8 @@ public class ROOT_NEW_NotificationBuilder extends NotificationBuilder { 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("${currMonth}", notificationDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("ru"))); + valuesForTemplate.put("${currYear}", "%02d".formatted(year % 100)); valuesForTemplate.put("${companyFullName}", company.getFullName()); valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); valuesForTemplate.put("${companyClearingCode}", companyClearingCode); 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 index 9497e3631..73569c55a 100644 --- 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 @@ -15,6 +15,9 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import java.io.File; import java.time.Instant; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.TextStyle; import java.util.*; @Component @@ -71,7 +74,7 @@ public class ROOT_SSPD_NotificationBuilder extends NotificationBuilder { return null; } - LocalDate notificationDate = LocalDate.now(); + LocalDateTime notificationDate = LocalDateTime.now(); int day = notificationDate.getDayOfMonth(); int month = notificationDate.getMonthValue(); int year = notificationDate.getYear(); @@ -81,13 +84,13 @@ public class ROOT_SSPD_NotificationBuilder extends NotificationBuilder { 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("${currMonth}", notificationDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("ru"))); + valuesForTemplate.put("${currYear}", "%02d".formatted(year % 100)); valuesForTemplate.put("${companyFullName}", company.getFullName()); valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); valuesForTemplate.put("${companyClearingCode}", companyClearingCode); - valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt)); + valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(ZoneId.systemDefault()).toLocalDate())); String outputFilename = "ROOT.SSPD.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(notificationDate)); outputFilename = normalizeFilenameForOS(outputFilename); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java index 46ff76f60..609531c94 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java @@ -14,7 +14,9 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import java.io.File; import java.time.Instant; -import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.TextStyle; import java.util.*; @Component @@ -71,7 +73,7 @@ public class RRPCNotificationBuilder extends NotificationBuilder { return null; } - LocalDate notificationDate = LocalDate.now(); + LocalDateTime notificationDate = LocalDateTime.now(); int day = notificationDate.getDayOfMonth(); int month = notificationDate.getMonthValue(); int year = notificationDate.getYear(); @@ -81,10 +83,10 @@ public class RRPCNotificationBuilder extends NotificationBuilder { 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("${currMonth}", notificationDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("ru"))); + valuesForTemplate.put("${currYear}", "%02d".formatted(year % 100)); - valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt)); + valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(ZoneId.systemDefault()).toLocalDate())); valuesForTemplate.put("${companyFullName}", company.getFullName()); valuesForTemplate.put("${companyShortName}", company.getShortName()); valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); diff --git a/clearing-parent/reports-service/src/main/resources/templates/REX_TEMPLATE.docx b/clearing-parent/reports-service/src/main/resources/templates/REX_TEMPLATE.docx index 363dc25682bd2d347e95ab064f450805b0c29b86..6ddc9fad29f5d455c6c1d7dc557b11ce13f7ea59 100644 GIT binary patch delta 6179 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 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 index 135d87f99c099810c631a84a2ea357941569c361..54edd36f61d2b3cda2979fa2cceae4d2d11ae8a8 100644 GIT binary patch delta 6645 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 W7^t76jHfQ9gcb%mlzG}`kN*SSuv4D^ delta 6730 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 a9uev&aBxq=_J5jrQZO?k3NGW5<^KQ!X+@v_ 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 index b5463419d1bca976faf221c7a57f99d37e06c985..fbabbcffa28024300461dd44f9c106b9babfbcf2 100644 GIT binary patch delta 6109 zcmai2XEs+H3Ee&)tuE&@=N+mH+{eMw!Y2v0<#X08gU{yy z!e{$M7k!T;rRs`$t%y5&Uq)(vXL^FpvME>8gO?h4e+*r@c%|rvbqP2q9y}t8GJhgO zRvloe1LaeHr}i$oLUo-aNg|)BQ(rX`wp>H`kOPYss^dy&EZCY9k?xC;NIKd@E@tY| z<;s+}sZQd^d~f8%CW1ZtDFa`eW`G-oZ6o2$iUi-Mc?5vTs9(7uHzajjWU9QZcsnej zBdc~QVtg1DG8EO6)~Tgan52jQ^ulEfj|`_SkP#ol!K5_OclPqi+BeKi`H7k!EH*aE zQUFY49^^~647!N?F;l9x>wMh^^Q}LPLbb|VUbf%N)NwW|U+saVuzgqeuF|`|+8;L@ zD-@w|ei-L521d2s`2R>SRuSevv*~W~@4jiaB&1-qXRq#9Vt%s)qss(jvw&z)f z<94GerL!+TjFzxeVU$+{)H^hZ3-5JhrOvuL+EU6qtvgXlC39di!H3ofFZ#NmC^c1Z z@mBCo{Ik%}(1<_5HS(m7ds-{?IraW|)zq^SA;4wP03WagL@< zW@f4c54%SYj-kZz-t7g_Z?5ue*Vv(~+H}qBc?@2_=z9VTZXp7e2j|20KNT@YZz`Kc zpJQ(|51WlnpQ!LKB;+h{r+jEJ9op_69F&qwJK?q+RF@P6Kc}2}wDy!DV zy;j{59#dmVbOC$xg|((oC0C0Cv^gM!rF;UZmP{SJ@&d2rK? z6LCqnU)FR$A?*s_@m* zXmnIUodRZBh4ObHew|-{@*NeiiU^;9lWr0wC&f~)`+hNQ>Z!jD`#C_TS{cpegi~r8 z*6W~(#G$Uj2XPiW*PD;5($0H2`86U78;G?eU0`!KesbNh4V^;I7QrIiWn}ZzFud_Rum29SVB4Iftu=2R(%7J?X_Dq{g!C3j1} zFw8>PbZc9mhl|wU3-c)(kLx$9FYKn4lb=cWG>9YKwpAR?1g!$-B4atI^NBrkOM5f6 z_6GQ`M0>PUWAWN~EZ#&ap^*kQ1s}}-YDyR@lM1EYdq6%W;J?yw>DayEVQ}|kjbng` z4s`aeyzhKhbMV43w6WbWnd?cq5$lIYLnD~^XV+zaGQ_a%Ha(+2caR#1<5RAn%B9Ft zSeeXI0=1a#{Pj$FhHfq=xYue;02xTN|3yG0)pa|0AP!IZ^b$MJ@Xa(vKgEwGC7)~C zn)W0vekQQP!$})ySKP)ju4^A)-{7U}8mU-DY=Euve#YP&+b-hlUYawW4V5QO`w{Fk zz6d&ABf#k(jpzQWqi_F>7NwDePH`}3se$D?z*zqqT>u}ADH+m&GZ2JRmOU}B9BzQ4 z*+^Jc9o~gj041>ITzX`j9$LAaYe2k5?|R>-B(yf5k&0yZy~Odk5m&S6P)kCILd z{%skG!#$YwEyPN~C-(KdF@r&EMljO&=yiP~0<*4-??XO2F5$G&!x~2kmKLuXBFVB150^FKQzg zF_&<$m+1UC!nyG)pNAJef4cJS{4okhDiiS<$f`sy{pl+3x&P<}h+0nW%5$O@|M3{k+l^Dru5yr%@^v>RhNaZSrjR5Z|15j^ zi(ZD+49lwyYW35*4p}Yzz-HqHlY*~|UZ(`fRf~Rs%2TbgAk%(q#oOHy%}}dLTHN>b z%M(EZOX@ywLhCNxXURg%GmKJ?0zp5CPpwY^N3_5>koM_)T>lXdyS@sQ30tCd(vx_M z$<{>#4aVcHl7P_%_hEFRiHgq;6l*1($I+(JPh=nE`uIej->j&T{0#e&@6Pv8{Y8%`9+Vn8K-HP&7_q>ul+(M?uCE)92g9Ul4(J#I8

!dqjfD$o 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 delta 6610 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 Hdt&?#*P+V{ delta 5814 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 diff --git a/clearing-parent/reports-service/src/main/resources/templates/RRPC_TEMPLATE.docx b/clearing-parent/reports-service/src/main/resources/templates/RRPC_TEMPLATE.docx index a5ecabd1218186c845aec5b66ebb76d780ec1c1b..2dcedee3c032e8bf27c2481c3fc1b1f0074c0acb 100644 GIT binary patch delta 6700 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 delta 6730 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 diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/notifications/NotificationBuilderTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/notifications/NotificationBuilderTest.java new file mode 100644 index 000000000..b0a5f47f7 --- /dev/null +++ b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/notifications/NotificationBuilderTest.java @@ -0,0 +1,143 @@ +package ru.spcex.clearing.reports.notifications; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +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.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.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.Arrays; +import java.util.Collections; + +import static org.mockito.Mockito.*; + +class NotificationBuilderTest { + static ImdgProvider imdgProviderMock; + static Imdg companyImdgMock; + static Company testCompany; + + static Imdg profileDocumentImdgMock; + static ProfileDocument testProfileDocument_1; + static ProfileDocument testProfileDocument_2; + + static Imdg relationImdgMock; + static Relation testRelation_1; + static Relation testRelation_2; + + static Imdg companySymbolsImdgMock; + static CompanySymbols testCompanySymbols_1; + static CompanySymbols testCompanySymbols_2; + + @BeforeAll + public static void initMocks() { + imdgProviderMock = mock(ImdgProvider.class); + + testCompany = new Company(); + testCompany.setFullName("== TEST FULL NAME =="); + testCompany.setShortName("== TEST SHORT NAME =="); + testCompany.setClearingCode("TEST_CLEARING_CODE"); + companyImdgMock = mock(Imdg.class); + when(companyImdgMock.getSingleObjectByID(any())).thenReturn(testCompany); + when(imdgProviderMock.getImdg(eq(IMDGDistributedNames.Map_Company), eq(Company.class))).thenReturn(companyImdgMock); + + testProfileDocument_1 = new ProfileDocument(); + testProfileDocument_1.setId(777L); + testProfileDocument_1.setCompanyId(777L); + testProfileDocument_1.setValidFromDate(LocalDate.of(2020, 1, 1)); + testProfileDocument_1.setNumber("TEST_NUMBER_1"); + testProfileDocument_2 = new ProfileDocument(); + testProfileDocument_2.setId(777L); + testProfileDocument_2.setCompanyId(777L); + testProfileDocument_2.setValidFromDate(LocalDate.of(2019, 1, 1)); + testProfileDocument_2.setNumber("TEST_NUMBER_2"); + profileDocumentImdgMock = mock(Imdg.class); + when(profileDocumentImdgMock.getCollectionObjectsBySQL(any())).thenReturn(Arrays.asList(testProfileDocument_1, testProfileDocument_2)); + when(imdgProviderMock.getImdg(eq(IMDGDistributedNames.Map_ProfileDocument), eq(ProfileDocument.class))).thenReturn(profileDocumentImdgMock); + + testRelation_1 = new Relation(); + testRelation_1.setId(777L); + testRelation_1.setConsumerId(777L); + testRelation_1.setUpdated(LocalDate.of(2020, 1, 1).atStartOfDay(ZoneId.systemDefault()).toInstant()); + testRelation_2 = new Relation(); + testRelation_2.setId(777L); + testRelation_2.setConsumerId(777L); + testRelation_2.setUpdated(LocalDate.of(2019, 1, 1).atStartOfDay(ZoneId.systemDefault()).toInstant()); + relationImdgMock = mock(Imdg.class); + when(relationImdgMock.getCollectionObjectsBySQL(any())).thenReturn(Arrays.asList(testRelation_1, testRelation_2)); + when(imdgProviderMock.getImdg(eq(IMDGDistributedNames.Map_Relation), eq(Relation.class))).thenReturn(relationImdgMock); + + testCompanySymbols_1 = new CompanySymbols(); + testCompanySymbols_1.setId(777L); + testCompanySymbols_1.setCompanyId(777L); + testCompanySymbols_1.setCompanySymbol("TEST_COMPANY_SYMBOL_1"); + testCompanySymbols_1.setCompanySymbolValue("TEST_COMPANY_SYMBOL_VALUE_1"); + testCompanySymbols_2 = new CompanySymbols(); + testCompanySymbols_2.setId(777L); + testCompanySymbols_2.setCompanyId(777L); + testCompanySymbols_2.setCompanySymbol("TEST_COMPANY_SYMBOL_2"); + testCompanySymbols_2.setCompanySymbolValue("TEST_COMPANY_SYMBOL_VALUE_2"); + companySymbolsImdgMock = mock(Imdg.class); + when(companySymbolsImdgMock.getCollectionObjectsBySQL(any())).thenReturn(Arrays.asList(testCompanySymbols_1, testCompanySymbols_2)); + when(imdgProviderMock.getImdg(eq(IMDGDistributedNames.Map_CompanySymbols), eq(CompanySymbols.class))).thenReturn(companySymbolsImdgMock); + + } + + @Test + public void testREX() { + REXNotificationBuilder rexNotificationBuilder = new REXNotificationBuilder(imdgProviderMock); + File outputFile = rexNotificationBuilder.buildNotification(777L); + outputFile.delete(); + } + + @Test + public void testRRPC() { + RRPCNotificationBuilder rrpcNotificationBuilder = new RRPCNotificationBuilder(imdgProviderMock); + File outputFile = rrpcNotificationBuilder.buildNotification(777L); + outputFile.delete(); + } + + @Test + public void testROOT_ACTV() { + ROOT_ACTV_NotificationBuilder root_actv_notificationBuilder = new ROOT_ACTV_NotificationBuilder(imdgProviderMock); + File outputFile = root_actv_notificationBuilder.buildNotification(777L); + outputFile.delete(); + } + + @Test + public void testROOT_BLKD() { + ROOT_BLKD_NotificationBuilder root_actv_notificationBuilder = new ROOT_BLKD_NotificationBuilder(imdgProviderMock); + File outputFile = root_actv_notificationBuilder.buildNotification(777L); + outputFile.delete(); + } + + @Test + public void testROOT_CLOS() { + ROOT_CLOS_NotificationBuilder root_actv_notificationBuilder = new ROOT_CLOS_NotificationBuilder(imdgProviderMock); + File outputFile = root_actv_notificationBuilder.buildNotification(777L); + outputFile.delete(); + } + + @Test + public void testROOT_NEW() { + ROOT_NEW_NotificationBuilder root_actv_notificationBuilder = new ROOT_NEW_NotificationBuilder(imdgProviderMock); + File outputFile = root_actv_notificationBuilder.buildNotification(777L); + outputFile.delete(); + } + + @Test + public void testROOT_SSPD() { + ROOT_SSPD_NotificationBuilder root_actv_notificationBuilder = new ROOT_SSPD_NotificationBuilder(imdgProviderMock); + File outputFile = root_actv_notificationBuilder.buildNotification(777L); + outputFile.delete(); + } + + +} \ No newline at end of file From e7941771555f932512a685b3fea44a3c4dfc9b0f Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 29 Dec 2022 18:05:36 +0300 Subject: [PATCH 12/15] some refactor --- .../notifications/NotificationBuilder.java | 21 +++++++++++++++++++ .../notifications/REXNotificationBuilder.java | 16 +++----------- .../ROOT_ACTV_NotificationBuilder.java | 15 ++----------- .../ROOT_BLKD_NotificationBuilder.java | 15 ++----------- .../ROOT_CLOS_NotificationBuilder.java | 14 ++----------- .../ROOT_NEW_NotificationBuilder.java | 14 ++----------- .../ROOT_SSPD_NotificationBuilder.java | 16 ++------------ .../RRPCNotificationBuilder.java | 14 ++----------- 8 files changed, 36 insertions(+), 89 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java index cc212b236..56cdad6b8 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/NotificationBuilder.java @@ -5,7 +5,13 @@ import ru.spcex.clearing.reports.services.DOCXService; import java.io.File; import java.net.URL; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.time.format.TextStyle; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; public abstract class NotificationBuilder { protected final DateTimeFormatter filenameDateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss"); @@ -20,6 +26,21 @@ public abstract class NotificationBuilder { abstract public File buildNotification(Long consumerId); + protected void fillHeaderValues(Map valuesMap, Long notificationId) { + LocalDate notificationDate = LocalDate.now(); + int day = notificationDate.getDayOfMonth(); + int month = notificationDate.getMonthValue(); + int year = notificationDate.getYear(); + String dateStr = "%04d%02d%02d".formatted(year, month, day); + + valuesMap.put("${dateStr}", dateStr); + valuesMap.put("${count}", String.valueOf(notificationId)); + valuesMap.put("${currDay}", "%02d".formatted(day)); + valuesMap.put("${currMonth}", notificationDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("ru"))); + valuesMap.put("${currYear}", "%02d".formatted(year % 100)); + + } + protected File getTemplateFile() { File templateFile; String templateResourceName = getTemplateResourceName(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java index 48f539fc2..b09df0225 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/REXNotificationBuilder.java @@ -69,21 +69,11 @@ public class REXNotificationBuilder extends NotificationBuilder { return null; } - LocalDateTime notificationDate = LocalDateTime.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}", notificationDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("ru"))); - valuesForTemplate.put("${currYear}", "%02d".formatted(year % 100)); - valuesForTemplate.put("${validFromDate}", "%02d.%02d.%04d".formatted(day, month, year)); + fillHeaderValues(valuesForTemplate, notificationId); + valuesForTemplate.put("${validFromDate}", dateFormatter.format(validFromDate)); - String outputFilename = "REX.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(notificationDate)); + String outputFilename = "REX.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(LocalDateTime.now())); outputFilename = normalizeFilenameForOS(outputFilename); File outputFile = new File(outputFilename); 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 index 9ec7c85e2..b09813c5d 100644 --- 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 @@ -74,25 +74,14 @@ public class ROOT_ACTV_NotificationBuilder extends NotificationBuilder { return null; } - LocalDateTime notificationDate = LocalDateTime.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}", notificationDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("ru"))); - valuesForTemplate.put("${currYear}", "%02d".formatted(year % 100)); - + fillHeaderValues(valuesForTemplate, notificationId); valuesForTemplate.put("${companyFullName}", company.getFullName()); valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); valuesForTemplate.put("${companyClearingCode}", companyClearingCode); valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(ZoneId.systemDefault()).toLocalDate())); - String outputFilename = "ROOT.ACTV.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(notificationDate)); + String outputFilename = "ROOT.ACTV.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(LocalDateTime.now())); outputFilename = normalizeFilenameForOS(outputFilename); File outputFile = new File(outputFilename); 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 index a9d757451..f16848526 100644 --- 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 @@ -74,25 +74,14 @@ public class ROOT_BLKD_NotificationBuilder extends NotificationBuilder { return null; } - LocalDateTime notificationDate = LocalDateTime.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}", notificationDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("ru"))); - valuesForTemplate.put("${currYear}", "%02d".formatted(year % 100)); - + fillHeaderValues(valuesForTemplate, notificationId); valuesForTemplate.put("${companyFullName}", company.getFullName()); valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); valuesForTemplate.put("${companyClearingCode}", companyClearingCode); valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(ZoneId.systemDefault()).toLocalDate())); - String outputFilename = "ROOT.BLKD.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(notificationDate)); + String outputFilename = "ROOT.BLKD.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(LocalDateTime.now())); outputFilename = normalizeFilenameForOS(outputFilename); File outputFile = new File(outputFilename); 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 index 4ccbb8d21..2ac7b9083 100644 --- 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 @@ -82,25 +82,15 @@ public class ROOT_CLOS_NotificationBuilder extends NotificationBuilder { return null; } - LocalDateTime notificationDate = LocalDateTime.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}", notificationDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("ru"))); - valuesForTemplate.put("${currYear}", "%02d".formatted(year % 100)); + fillHeaderValues(valuesForTemplate, notificationId); 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)); + String outputFilename = "ROOT.CLOS.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(LocalDateTime.now())); outputFilename = normalizeFilenameForOS(outputFilename); File outputFile = new File(outputFilename); 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 index f341e75d1..abcfcdd01 100644 --- 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 @@ -82,25 +82,15 @@ public class ROOT_NEW_NotificationBuilder extends NotificationBuilder { return null; } - LocalDateTime notificationDate = LocalDateTime.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}", notificationDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("ru"))); - valuesForTemplate.put("${currYear}", "%02d".formatted(year % 100)); + fillHeaderValues(valuesForTemplate, notificationId); 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)); + String outputFilename = "ROOT.NEW.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(LocalDateTime.now())); outputFilename = normalizeFilenameForOS(outputFilename); File outputFile = new File(outputFilename); 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 index 73569c55a..eb009a49b 100644 --- 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 @@ -14,7 +14,6 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import java.io.File; import java.time.Instant; -import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.TextStyle; @@ -74,25 +73,14 @@ public class ROOT_SSPD_NotificationBuilder extends NotificationBuilder { return null; } - LocalDateTime notificationDate = LocalDateTime.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}", notificationDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("ru"))); - valuesForTemplate.put("${currYear}", "%02d".formatted(year % 100)); - + fillHeaderValues(valuesForTemplate, notificationId); valuesForTemplate.put("${companyFullName}", company.getFullName()); valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); valuesForTemplate.put("${companyClearingCode}", companyClearingCode); valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(ZoneId.systemDefault()).toLocalDate())); - String outputFilename = "ROOT.SSPD.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(notificationDate)); + String outputFilename = "ROOT.SSPD.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(LocalDateTime.now())); outputFilename = normalizeFilenameForOS(outputFilename); File outputFile = new File(outputFilename); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java index 609531c94..797d6cbfb 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/RRPCNotificationBuilder.java @@ -73,18 +73,8 @@ public class RRPCNotificationBuilder extends NotificationBuilder { return null; } - LocalDateTime notificationDate = LocalDateTime.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}", notificationDate.getMonth().getDisplayName(TextStyle.FULL, new Locale("ru"))); - valuesForTemplate.put("${currYear}", "%02d".formatted(year % 100)); + fillHeaderValues(valuesForTemplate, notificationId); valuesForTemplate.put("${relationUpdatedAt}", dateFormatter.format(updatedAt.atZone(ZoneId.systemDefault()).toLocalDate())); valuesForTemplate.put("${companyFullName}", company.getFullName()); @@ -92,7 +82,7 @@ public class RRPCNotificationBuilder extends NotificationBuilder { valuesForTemplate.put("${companySymbolsINN}", companySymbols.getCompanySymbolValue()); valuesForTemplate.put("${companyClearingCode}", companyClearingCode); - String outputFilename = "RRPC.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(notificationDate)); + String outputFilename = "RRPC.%s.%s.docx".formatted(companyClearingCode, filenameDateTimeFormatter.format(LocalDateTime.now())); outputFilename = normalizeFilenameForOS(outputFilename); File outputFile = new File(outputFilename); From 220239de6e0737c0818a712f3c8da09c0fe883cb Mon Sep 17 00:00:00 2001 From: AKurakin Date: Thu, 29 Dec 2022 19:14:37 +0300 Subject: [PATCH 13/15] =?UTF-8?q?reports-service=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8=20IMDG,=20=D1=82.=D0=BA.=20Hazelcast=20<4.0.?= =?UTF-8?q?0=20=D0=BD=D0=B5=20=D1=83=D0=BC=D0=B5=D0=B5=D1=82=20Instant=20?= =?UTF-8?q?=D1=81=D1=80=D0=B0=D0=B2=D0=BD=D0=B8=D0=B2=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20SQL!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reports/services/ReportDataCollector.java | 7 +- .../collector/Bt17_1_P1_collector.java | 24 ++++++- .../collector/Bt17_1_P2_collector.java | 2 +- .../services/collector/Bt17_2_collector.java | 2 +- .../collector/Bt17_5_P1_collector.java | 2 +- .../Repbr0420314_P1_bt_17_4_collector.java | 2 +- .../Repbr0420314_P2_bt_17_4_collector.java | 2 +- .../src/main/resources/application.properties | 2 +- .../iml/hazelcast/adapter/ImdgHazelcast.java | 26 ++++++++ .../ImdgPredicateBuilderHazelcast.java | 65 +++++++++++++++++++ .../predicate/ImdgPredicateHazelcast.java | 24 +++++++ .../java/ru/spcex/platform/imdg/api/Imdg.java | 11 ++++ .../imdg/api/predicate/ImdgPredicate.java | 4 ++ .../api/predicate/ImdgPredicateBuilder.java | 13 ++++ 14 files changed, 176 insertions(+), 10 deletions(-) create mode 100644 platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateBuilderHazelcast.java create mode 100644 platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateHazelcast.java create mode 100644 platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicate.java create mode 100644 platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicateBuilder.java diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java index bb99d1d68..0bf10f174 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java @@ -58,6 +58,11 @@ public abstract class ReportDataCollector { protected String toString(LocalDate date) { if (date == null) return null; - return DATE_TIME_FORMATTER.format(date); + return DATE_FORMATTER.format(date); + } + + protected String formatToIMDGInstant(LocalDate date) { + LocalDateTime ldt = date.atStartOfDay(); + return DATE_TIME_FORMATTER.format(ldt); } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java index aaa65c199..2972c8974 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java @@ -16,7 +16,11 @@ import ru.spcex.platform.enumeration.ClearingStatus; import ru.spcex.platform.enumeration.Market; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.utils.time.TimeUtil; +import java.time.Instant; import java.time.LocalDate; import java.util.*; @@ -52,6 +56,22 @@ public class Bt17_1_P1_collector extends ReportDataCollector searchLiabilitiesClaimsAssets(LocalDate startDate, LocalDate endDate, Long allowClearingStatusId) { + // String ql = String.format("'%s' <= refundDate and refundDate <= '%s' and clearingStatus=%s", +// formatToIMDGInstant(startDate), formatToIMDGInstant(endDate), allowClearingStatusId); +// Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); + //todo refactoring IMDG API, TimeUtil + ImdgPredicateBuilder pb = liabilitiesClaimsAssetsImdg.predicateBuilder(); + Instant dateTimeLo = startDate.atStartOfDay(TimeUtil.zone).toInstant(); + Instant dateTimeHi = endDate.plusDays(1).atStartOfDay(TimeUtil.zone).minusSeconds(1).toInstant(); + + ImdgPredicate p=pb.and(pb.and(pb.greatEqual("refundDate", dateTimeLo), + pb.lessEqual("refundDate", dateTimeHi)), + pb.equals("clearingStatus", allowClearingStatusId)); + Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsByPredicate(p); + return liabilities; + } + @Override public ReportBR_0420315_P1 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { validateDateRange(startDate, endDate); @@ -63,9 +83,7 @@ public class Bt17_1_P1_collector extends ReportDataCollector liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); + Collection liabilities = searchLiabilitiesClaimsAssets(startDate, endDate, allowClearingStatusId); Map> indexByCompany = MapUtil.indexList(liabilities, LiabilitiesClaimsAssets::getCompanyId); company_for: diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java index 5c8afe043..33dd36ddc 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java @@ -26,7 +26,7 @@ public class Bt17_1_P2_collector extends ReportDataCollector liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); long contractorQty; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java index b85eed586..8b13a2872 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java @@ -34,7 +34,7 @@ public class Bt17_2_collector extends ReportDataCollector { public ReportBR_0420317 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { validateDateRange(startDate, endDate); - String ql = String.format("'%s' <= updated and updated <= '%s' and service='MKR'", startDate, endDate); + String ql = String.format("'%s' <= updated and updated <= '%s' and service='MKR'", formatToIMDGInstant(startDate), formatToIMDGInstant(endDate)); // todo обговорить про updatedAt updated, todo enum MKR Collection relations = relationImdg.getCollectionObjectsBySQL(ql); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java index 11ccb81d6..7954461bc 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java @@ -55,7 +55,7 @@ public class Bt17_5_P1_collector extends ReportDataCollector liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); Map> indexByCompany = MapUtil.indexList(liabilities, LiabilitiesClaimsAssets::getCompanyId); for (Map.Entry> companyEntry : indexByCompany.entrySet()) { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P1_bt_17_4_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P1_bt_17_4_collector.java index 6608da0b5..4a3d96b53 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P1_bt_17_4_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P1_bt_17_4_collector.java @@ -61,7 +61,7 @@ public class Repbr0420314_P1_bt_17_4_collector extends ReportDataCollector liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); for (LiabilitiesClaimsAssets liability: liabilities) { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P2_bt_17_4_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P2_bt_17_4_collector.java index b19c54de5..4d5c9fb44 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P2_bt_17_4_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P2_bt_17_4_collector.java @@ -48,7 +48,7 @@ public class Repbr0420314_P2_bt_17_4_collector extends ReportDataCollector paymentInstructionsAll = paymentInstructionImdg.getCollectionObjectsBySQL(ql); Map> companyIdPyPaymtInstruction = diff --git a/clearing-parent/reports-service/src/main/resources/application.properties b/clearing-parent/reports-service/src/main/resources/application.properties index f4aec6b47..ffa1ebe50 100644 --- a/clearing-parent/reports-service/src/main/resources/application.properties +++ b/clearing-parent/reports-service/src/main/resources/application.properties @@ -18,7 +18,7 @@ reports-service.kafka-consumer.buffer-memory=33554432 #reports-service.kafka-producer.linger-ms=1 #reports-service.kafka-producer.buffer-memory=33554432 -reports-service.hazelcast.cluster-members=127.0.0.1:5701,10.200.200.181:5701 +reports-service.hazelcast.cluster-members=127.0.0.1:5701 #,10.200.200.181:5701 reports-service.hazelcast.login=dev reports-service.hazelcast.password=dev-pass diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java index 43aad9a39..20cc14328 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java @@ -11,6 +11,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast; +import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateHazelcast; import ru.spcex.platform.utils.log.ExceptionUtils; import java.util.*; @@ -181,4 +185,26 @@ public class ImdgHazelcast implements Imdg { public void setMapName(String mapName) { this.mapName = mapName; } + + + // Predicate API + @Override + public Collection getCollectionObjectsByPredicate(ImdgPredicate predicateImdg) { + Predicate hazelcastPredicate = ((ImdgPredicateHazelcast) predicateImdg).getRawPredicate(); + Set ids = map.keySet(hazelcastPredicate); + Iterator idIterator = ids.iterator(); + Collection searchResult = new ArrayList<>(); + while (idIterator.hasNext()) { + T element = map.get(idIterator.next()); + if (element != null) { + searchResult.add(element); + } + } + return searchResult; + } + + @Override + public ImdgPredicateBuilder predicateBuilder() { + return new ImdgPredicateBuilderHazelcast(this); + } } diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateBuilderHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateBuilderHazelcast.java new file mode 100644 index 000000000..d3d63f4d8 --- /dev/null +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateBuilderHazelcast.java @@ -0,0 +1,65 @@ +package ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate; + +import com.hazelcast.query.Predicates; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.imdg.iml.hazelcast.adapter.ImdgHazelcast; + +public class ImdgPredicateBuilderHazelcast implements ImdgPredicateBuilder { + protected final ImdgHazelcast imdg; + + public ImdgPredicateBuilderHazelcast(ImdgHazelcast imdg) { + this.imdg = imdg; + } + + @Override + public ImdgPredicate equals(String key, Object value) { + Comparable cmpValue = (Comparable) value; + return new ImdgPredicateHazelcast(this, Predicates.equal(key, cmpValue)); + } + + @Override + public ImdgPredicate greatEqual(String key, Comparable cmpValue) { + return new ImdgPredicateHazelcast(this, Predicates.greaterEqual(key, cmpValue)); + } + + @Override + public ImdgPredicate lessEqual(String key, Comparable cmpValue) { + return new ImdgPredicateHazelcast(this, Predicates.lessEqual(key, cmpValue)); + } + + @Override + public ImdgPredicate greater(String key, Comparable cmpValue) { + return new ImdgPredicateHazelcast(this, Predicates.greaterThan(key, cmpValue)); + } + + @Override + public ImdgPredicate less(String key, Comparable cmpValue) { + return new ImdgPredicateHazelcast(this, Predicates.lessThan(key, cmpValue)); + } + + @Override + public ImdgPredicate not(ImdgPredicate param) { + ImdgPredicateHazelcast paramMy = (ImdgPredicateHazelcast) param; + assert this == paramMy.builder; + return new ImdgPredicateHazelcast(this, Predicates.not(paramMy.hazelcastPredicate)); + } + + @Override + public ImdgPredicate and(ImdgPredicate paramA, ImdgPredicate paramB) { + ImdgPredicateHazelcast paramAMy = (ImdgPredicateHazelcast) paramA; + assert this == paramAMy.builder; + ImdgPredicateHazelcast paramBMy = (ImdgPredicateHazelcast) paramB; + assert this == paramBMy.builder; + return new ImdgPredicateHazelcast(this, Predicates.and(paramAMy.hazelcastPredicate, paramBMy.hazelcastPredicate)); + } + + @Override + public ImdgPredicate or(ImdgPredicate paramA, ImdgPredicate paramB) { + ImdgPredicateHazelcast paramAMy = (ImdgPredicateHazelcast) paramA; + assert this == paramAMy.builder; + ImdgPredicateHazelcast paramBMy = (ImdgPredicateHazelcast) paramB; + assert this == paramBMy.builder; + return new ImdgPredicateHazelcast(this, Predicates.or(paramAMy.hazelcastPredicate, paramBMy.hazelcastPredicate)); + } +} diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateHazelcast.java new file mode 100644 index 000000000..1c2f36461 --- /dev/null +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateHazelcast.java @@ -0,0 +1,24 @@ +package ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate; + +import com.hazelcast.query.Predicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; + +public class ImdgPredicateHazelcast implements ImdgPredicate { + protected final ImdgPredicateBuilderHazelcast builder; + protected final Predicate hazelcastPredicate; + + protected ImdgPredicateHazelcast(ImdgPredicateBuilderHazelcast builder, Predicate hazelcastPredicate) { + assert hazelcastPredicate != null; + this.builder = builder; + this.hazelcastPredicate = hazelcastPredicate; + } + + public Predicate getRawPredicate() { + return hazelcastPredicate; + } + + @Override + public String toString() { + return "ImdgPredicateHazelcast{" + hazelcastPredicate + '}'; + } +} diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java index 2784cc2dd..bc4adb9c1 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java @@ -1,6 +1,8 @@ package ru.spcex.platform.imdg.api; import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import java.util.Collection; import java.util.Map; @@ -65,4 +67,13 @@ public interface Imdg { default Integer size() { throw new UnsupportedOperationException("not implemented size"); } + + // Predicate API + default Collection getCollectionObjectsByPredicate(ImdgPredicate predicate) { + throw new UnsupportedOperationException("not implemented getCollectionObjectsByPredicate"); + } + + default ImdgPredicateBuilder predicateBuilder() { + throw new UnsupportedOperationException("not implemented predicateBuilder API"); + } } diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicate.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicate.java new file mode 100644 index 000000000..922245086 --- /dev/null +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicate.java @@ -0,0 +1,4 @@ +package ru.spcex.platform.imdg.api.predicate; + +public interface ImdgPredicate { +} diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicateBuilder.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicateBuilder.java new file mode 100644 index 000000000..4ff3d679f --- /dev/null +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicateBuilder.java @@ -0,0 +1,13 @@ +package ru.spcex.platform.imdg.api.predicate; + +public interface ImdgPredicateBuilder { + ImdgPredicate equals(String key, Object value); + ImdgPredicate greatEqual(String key, Comparable value); + ImdgPredicate lessEqual(String key, Comparable value); + ImdgPredicate greater(String key, Comparable value); + ImdgPredicate less(String key, Comparable value); + + ImdgPredicate not(ImdgPredicate param); + ImdgPredicate and(ImdgPredicate paramA, ImdgPredicate paramB); + ImdgPredicate or(ImdgPredicate paramA, ImdgPredicate paramB); +} From 55e0dc1c87fb8548b87f942270556f02c5c7b5ef Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 30 Dec 2022 11:41:01 +0300 Subject: [PATCH 14/15] =?UTF-8?q?imdg,=20reports-service=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B8=20IMDG,=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BE=D1=82=D1=87=D1=91=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reports/ReportsServiceApplication.java | 2 +- .../reports/services/ReportDataCollector.java | 17 +++++-- .../collector/Bt17_1_P1_collector.java | 10 ++--- .../collector/Bt17_1_P2_collector.java | 19 ++++++-- .../services/collector/Bt17_2_collector.java | 20 +++++++-- .../collector/Bt17_5_P1_collector.java | 31 ++++++++----- .../Repbr0420314_P1_bt_17_4_collector.java | 24 ++++++++-- .../Repbr0420314_P2_bt_17_4_collector.java | 20 +++++++-- .../iml/hazelcast/adapter/ImdgHazelcast.java | 2 +- .../ImdgPredicateBuilderHazelcast.java | 45 ++++++++++++------- .../predicate/ImdgPredicateHazelcast.java | 10 ++--- .../api/predicate/ImdgPredicateBuilder.java | 2 + 12 files changed, 145 insertions(+), 57 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java index 99a580de8..643b8f596 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java @@ -30,7 +30,7 @@ public class ReportsServiceApplication { log.info("Run generate report."); Map allReports = context.getBeansOfType(ReportDataCollector.class); log.info("Report types: {}", allReports); - for (ReportDataCollector collector:allReports.values()) { + for (ReportDataCollector collector : allReports.values()) { log.info("Make report {}", collector); XMLReportBuilder xmlReportBuilder = new XMLReportBuilder(collector.getReportClass()); LocalDate date2 = LocalDate.now(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java index 0bf10f174..143ffe7dd 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java @@ -3,6 +3,7 @@ package ru.spcex.clearing.reports.services; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.spcex.clearing.reports.reports.AbstractReport; +import ru.spcex.platform.utils.time.TimeUtil; import java.math.BigDecimal; import java.time.Instant; @@ -21,6 +22,7 @@ public abstract class ReportDataCollector { /** * T extends ReportWithPeriod + * * @return */ abstract public T collectReportWithPeriod(LocalDate startDate, LocalDate endDate); @@ -41,6 +43,13 @@ public abstract class ReportDataCollector { } } + protected Instant toInstantStartDay(LocalDate date) { + return date.atStartOfDay(TimeUtil.zone).toInstant(); + } + protected Instant toInstantEndDay(LocalDate date) { + return date.plusDays(1).atStartOfDay(TimeUtil.zone).minusSeconds(1).toInstant(); + } + protected String toString(Long val) { if (val == null) return null; return val.toString(); @@ -61,8 +70,8 @@ public abstract class ReportDataCollector { return DATE_FORMATTER.format(date); } - protected String formatToIMDGInstant(LocalDate date) { - LocalDateTime ldt = date.atStartOfDay(); - return DATE_TIME_FORMATTER.format(ldt); - } +// protected String formatToIMDGInstant(LocalDate date) { +// LocalDateTime ldt = date.atStartOfDay(); +// return DATE_TIME_FORMATTER.format(ldt); +// } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java index 2972c8974..7774d4b6d 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java @@ -60,13 +60,11 @@ public class Bt17_1_P1_collector extends ReportDataCollector liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); - //todo refactoring IMDG API, TimeUtil - ImdgPredicateBuilder pb = liabilitiesClaimsAssetsImdg.predicateBuilder(); - Instant dateTimeLo = startDate.atStartOfDay(TimeUtil.zone).toInstant(); - Instant dateTimeHi = endDate.plusDays(1).atStartOfDay(TimeUtil.zone).minusSeconds(1).toInstant(); - ImdgPredicate p=pb.and(pb.and(pb.greatEqual("refundDate", dateTimeLo), - pb.lessEqual("refundDate", dateTimeHi)), + ImdgPredicateBuilder pb = liabilitiesClaimsAssetsImdg.predicateBuilder(); + Instant dateTimeLo = toInstantStartDay(startDate); + Instant dateTimeHi = toInstantStartDay(endDate); + ImdgPredicate p = pb.and(pb.greatEqual("refundDate", dateTimeLo), pb.lessEqual("refundDate", dateTimeHi), pb.equals("clearingStatus", allowClearingStatusId)); Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsByPredicate(p); return liabilities; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java index 33dd36ddc..69040ecd4 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java @@ -9,9 +9,11 @@ import ru.spcex.clearing.reports.reports.bt_17_1.ReportBR_0420315_P2; import ru.spcex.clearing.reports.services.ReportDataCollector; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import java.time.Instant; import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.*; @Component @@ -23,11 +25,22 @@ public class Bt17_1_P2_collector extends ReportDataCollector searchLiabilitiesClaimsAssets(LocalDate startDate, LocalDate endDate) { +// String ql = String.format("'%s' <= refundDate and refundDate <= '%s'", formatToIMDGInstant(startDate), formatToIMDGInstant(endDate)); +// Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); + + ImdgPredicateBuilder pb = liabilitiesClaimsAssetsImdg.predicateBuilder(); + Instant dateTimeLo = toInstantStartDay(startDate); + Instant dateTimeHi = toInstantStartDay(endDate); + ImdgPredicate p = pb.and(pb.greatEqual("refundDate", dateTimeLo), pb.lessEqual("refundDate", dateTimeHi)); + Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsByPredicate(p); + return liabilities; + } + @Override public ReportBR_0420315_P2 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { validateDateRange(startDate, endDate); - String ql = String.format("'%s' <= refundDate and refundDate <= '%s'", formatToIMDGInstant(startDate), formatToIMDGInstant(endDate)); - Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); + Collection liabilities = searchLiabilitiesClaimsAssets(startDate, endDate); long contractorQty; double liabilitiesAmount = 0; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java index 8b13a2872..272becd5d 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java @@ -11,10 +11,11 @@ import ru.spcex.clearing.reports.services.ReportDataCollector; import ru.spcex.platform.enumeration.DocumentTypes; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import java.time.Instant; import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.*; @Component @@ -30,13 +31,24 @@ public class Bt17_2_collector extends ReportDataCollector { companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); } + Collection searchRelation(LocalDate startDate, LocalDate endDate, String service) { +// String ql = String.format("'%s' <= updated and updated <= '%s' and service='MKR'", startDate, endDate); +// Collection relations = relationImdg.getCollectionObjectsBySQL(ql); + + ImdgPredicateBuilder pb = relationImdg.predicateBuilder(); + Instant dateTimeLo = toInstantStartDay(startDate); + Instant dateTimeHi = toInstantStartDay(endDate); + ImdgPredicate p = pb.and(pb.greatEqual("updated", dateTimeLo), pb.lessEqual("updated", dateTimeHi), + pb.equals("service", service)); + Collection relations = relationImdg.getCollectionObjectsByPredicate(p); + return relations; + } + @Override public ReportBR_0420317 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { validateDateRange(startDate, endDate); - String ql = String.format("'%s' <= updated and updated <= '%s' and service='MKR'", formatToIMDGInstant(startDate), formatToIMDGInstant(endDate)); - // todo обговорить про updatedAt updated, todo enum MKR - Collection relations = relationImdg.getCollectionObjectsBySQL(ql); + Collection relations = searchRelation(startDate, endDate, "MKR"); ReportBR_0420317 reportBR_0420317 = new ReportBR_0420317(startDate, endDate, "BR"); for (Relation relation: relations) { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java index 7954461bc..804ace657 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java @@ -4,17 +4,18 @@ import org.springframework.beans.factory.annotation.Autowired; 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.company.relation.Relation; import ru.clearing.classes.statics.data.generated.ClearingMemberCategory; import ru.clearing.classes.transaction.data.execution.LiabilitiesClaimsAssets; -import ru.clearing.platform.dictionary.CountryCodeDictionary; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.reports.reports.bt_17_5.ReportBR_0420312_P1; import ru.spcex.clearing.reports.services.ReportDataCollector; import ru.spcex.platform.enumeration.DocumentTypes; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import java.time.Instant; import java.time.LocalDate; import java.util.Collection; import java.util.List; @@ -23,9 +24,7 @@ import java.util.Map; @Component public class Bt17_5_P1_collector extends ReportDataCollector { private Imdg companyImdg; - // private Imdg relationImdg; private Imdg companySymbolsImdg; - private Imdg countryCodeDictionaryImdg; private Imdg clearingMemberCategoryImdg; private Imdg liabilitiesClaimsAssetsImdg; @@ -33,10 +32,8 @@ public class Bt17_5_P1_collector extends ReportDataCollector searchLiabilitiesClaimsAssets(LocalDate startDate, LocalDate endDate) { +// String ql = String.format("'%s' <= refundDate and refundDate <= '%s'", formatToIMDGInstant(startDate), formatToIMDGInstant(endDate)); +// Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); + + ImdgPredicateBuilder pb = liabilitiesClaimsAssetsImdg.predicateBuilder(); + Instant dateTimeLo = toInstantStartDay(startDate); + Instant dateTimeHi = toInstantStartDay(endDate); + ImdgPredicate p = pb.and(pb.greatEqual("refundDate", dateTimeLo), pb.lessEqual("refundDate", dateTimeHi)); + Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsByPredicate(p); + return liabilities; + } + @Override public ReportBR_0420312_P1 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { validateDateRange(startDate, endDate); ReportBR_0420312_P1 reportBR_0420312P1 = new ReportBR_0420312_P1(startDate, endDate, "BR"); - // todo обговорить про updatedAt updated, todo enum MKR - String ql = String.format("'%s' <= refundDate and refundDate <= '%s'", - formatToIMDGInstant(startDate), formatToIMDGInstant(endDate)); - Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); + Collection liabilities = searchLiabilitiesClaimsAssets(startDate, endDate); Map> indexByCompany = MapUtil.indexList(liabilities, LiabilitiesClaimsAssets::getCompanyId); + for (Map.Entry> companyEntry : indexByCompany.entrySet()) { final Long companyId = companyEntry.getKey(); Company company = companyImdg.getSingleObjectByID(companyId); + if (company == null) { + log.warn("Company not found by LiabilitiesClaimsAssets.CompanyId={}", companyId); + continue; + } CompanySymbols companySymbolINN = findSymbol(DocumentTypes.inn, company.getId()); CompanySymbols companySymbolOGRN = findSymbol(DocumentTypes.ogrn, company.getId()); ClearingMemberCategory cmc = clearingMemberCategoryImdg.getSingleObjectByFieldValues(Map.of("companyId", companyId)); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P1_bt_17_4_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P1_bt_17_4_collector.java index 4a3d96b53..6dc1e1bfd 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P1_bt_17_4_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P1_bt_17_4_collector.java @@ -14,8 +14,11 @@ import ru.spcex.platform.enumeration.ClearingStatus; import ru.spcex.platform.enumeration.DocumentTypes; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.utils.time.TimeUtil; +import java.time.Instant; import java.time.LocalDate; import java.util.Collection; import java.util.Map; @@ -50,6 +53,19 @@ public class Repbr0420314_P1_bt_17_4_collector extends ReportDataCollector searchLiabilitiesClaimsAssets(LocalDate startDate, LocalDate endDate, Long allowClearingStatusId) { + // String ql = String.format("'%s' <= refundDate and refundDate <= '%s' and clearingStatus=%s", +// formatToIMDGInstant(startDate), formatToIMDGInstant(endDate), allowClearingStatusId); +// Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); + + ImdgPredicateBuilder pb = liabilitiesClaimsAssetsImdg.predicateBuilder(); + Instant dateTimeLo = toInstantStartDay(startDate); + Instant dateTimeHi = toInstantStartDay(endDate); + ImdgPredicate p = pb.and(pb.greatEqual("refundDate", dateTimeLo), pb.lessEqual("refundDate", dateTimeHi), + pb.equals("clearingStatus", allowClearingStatusId)); + Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsByPredicate(p); + return liabilities; + } @Override public ReportBR_0420314_P1 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { @@ -60,13 +76,15 @@ public class Repbr0420314_P1_bt_17_4_collector extends ReportDataCollector liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); + Collection liabilities = searchLiabilitiesClaimsAssets(startDate, endDate, allowClearingStatusId); for (LiabilitiesClaimsAssets liability: liabilities) { final Long companyId = liability.getCompanyId(); Company company = companyImdg.getSingleObjectByID(companyId); + if (company == null) { + log.warn("Company not found by LiabilitiesClaimsAssets.CompanyId={}", companyId); + continue; + } Collection cmcLst = clearingMemberCategoryImdg.getCollectionObjectsByFieldValues(Map.of("companyId", companyId)); // boolean checkCategory = cmcLst.stream().anyMatch(cmc -> ALLOW_CLEARING_MEMBER_CATEGORY.contains(cmc.getClearingMemberCategory())); // if (!checkCategory) { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P2_bt_17_4_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P2_bt_17_4_collector.java index 4d5c9fb44..9dd77e4c0 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P2_bt_17_4_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Repbr0420314_P2_bt_17_4_collector.java @@ -14,7 +14,10 @@ import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.DocumentTypes; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import java.time.Instant; import java.time.LocalDate; import java.util.Collection; import java.util.List; @@ -39,6 +42,19 @@ public class Repbr0420314_P2_bt_17_4_collector extends ReportDataCollector searchPaymentInstruction(LocalDate startDate, LocalDate endDate) { +// String ql = String.format("'%s' <= created and created <= '%s'", +// formatToIMDGInstant(startDate), formatToIMDGInstant(endDate)); +// Collection paymentInstructionsAll = paymentInstructionImdg.getCollectionObjectsBySQL(ql); + + ImdgPredicateBuilder pb = paymentInstructionImdg.predicateBuilder(); + Instant dateTimeLo = toInstantStartDay(startDate); + Instant dateTimeHi = toInstantStartDay(endDate); + ImdgPredicate p = pb.and(pb.greatEqual("created", dateTimeLo), pb.lessEqual("created", dateTimeHi)); + Collection paymentInstructionsAll = paymentInstructionImdg.getCollectionObjectsByPredicate(p); + return paymentInstructionsAll; + } + @Override public ReportBR_0420314_P2 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { validateDateRange(startDate, endDate); @@ -47,9 +63,7 @@ public class Repbr0420314_P2_bt_17_4_collector extends ReportDataCollector paymentInstructionsAll = paymentInstructionImdg.getCollectionObjectsBySQL(ql); + Collection paymentInstructionsAll = searchPaymentInstruction(startDate, endDate); Map> companyIdPyPaymtInstruction = MapUtil.indexList(paymentInstructionsAll, PaymentInstruction::getSenderId); diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java index 20cc14328..c447524f6 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java @@ -205,6 +205,6 @@ public class ImdgHazelcast implements Imdg { @Override public ImdgPredicateBuilder predicateBuilder() { - return new ImdgPredicateBuilderHazelcast(this); + return ImdgPredicateBuilderHazelcast.instance(); } } diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateBuilderHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateBuilderHazelcast.java index d3d63f4d8..0764ac47c 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateBuilderHazelcast.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateBuilderHazelcast.java @@ -3,63 +3,74 @@ package ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate; import com.hazelcast.query.Predicates; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; -import ru.spcex.platform.imdg.iml.hazelcast.adapter.ImdgHazelcast; public class ImdgPredicateBuilderHazelcast implements ImdgPredicateBuilder { - protected final ImdgHazelcast imdg; + protected static final ImdgPredicateBuilderHazelcast instance = new ImdgPredicateBuilderHazelcast(); - public ImdgPredicateBuilderHazelcast(ImdgHazelcast imdg) { - this.imdg = imdg; + public static ImdgPredicateBuilderHazelcast instance() { + return instance; } + @Override public ImdgPredicate equals(String key, Object value) { Comparable cmpValue = (Comparable) value; - return new ImdgPredicateHazelcast(this, Predicates.equal(key, cmpValue)); + return new ImdgPredicateHazelcast(Predicates.equal(key, cmpValue)); } @Override public ImdgPredicate greatEqual(String key, Comparable cmpValue) { - return new ImdgPredicateHazelcast(this, Predicates.greaterEqual(key, cmpValue)); + return new ImdgPredicateHazelcast(Predicates.greaterEqual(key, cmpValue)); } @Override public ImdgPredicate lessEqual(String key, Comparable cmpValue) { - return new ImdgPredicateHazelcast(this, Predicates.lessEqual(key, cmpValue)); + return new ImdgPredicateHazelcast(Predicates.lessEqual(key, cmpValue)); } @Override public ImdgPredicate greater(String key, Comparable cmpValue) { - return new ImdgPredicateHazelcast(this, Predicates.greaterThan(key, cmpValue)); + return new ImdgPredicateHazelcast(Predicates.greaterThan(key, cmpValue)); } @Override public ImdgPredicate less(String key, Comparable cmpValue) { - return new ImdgPredicateHazelcast(this, Predicates.lessThan(key, cmpValue)); + return new ImdgPredicateHazelcast(Predicates.lessThan(key, cmpValue)); } @Override public ImdgPredicate not(ImdgPredicate param) { ImdgPredicateHazelcast paramMy = (ImdgPredicateHazelcast) param; - assert this == paramMy.builder; - return new ImdgPredicateHazelcast(this, Predicates.not(paramMy.hazelcastPredicate)); + return new ImdgPredicateHazelcast(Predicates.not(paramMy.hazelcastPredicate)); } @Override public ImdgPredicate and(ImdgPredicate paramA, ImdgPredicate paramB) { ImdgPredicateHazelcast paramAMy = (ImdgPredicateHazelcast) paramA; - assert this == paramAMy.builder; ImdgPredicateHazelcast paramBMy = (ImdgPredicateHazelcast) paramB; - assert this == paramBMy.builder; - return new ImdgPredicateHazelcast(this, Predicates.and(paramAMy.hazelcastPredicate, paramBMy.hazelcastPredicate)); + return new ImdgPredicateHazelcast(Predicates.and(paramAMy.hazelcastPredicate, paramBMy.hazelcastPredicate)); + } + + @Override + public ImdgPredicate and(ImdgPredicate paramA, ImdgPredicate paramB, ImdgPredicate paramC) { + ImdgPredicateHazelcast paramAMy = (ImdgPredicateHazelcast) paramA; + ImdgPredicateHazelcast paramBMy = (ImdgPredicateHazelcast) paramB; + ImdgPredicateHazelcast paramCMy = (ImdgPredicateHazelcast) paramB; + return new ImdgPredicateHazelcast(Predicates.and(paramAMy.hazelcastPredicate, paramBMy.hazelcastPredicate, paramCMy.hazelcastPredicate)); } @Override public ImdgPredicate or(ImdgPredicate paramA, ImdgPredicate paramB) { ImdgPredicateHazelcast paramAMy = (ImdgPredicateHazelcast) paramA; - assert this == paramAMy.builder; ImdgPredicateHazelcast paramBMy = (ImdgPredicateHazelcast) paramB; - assert this == paramBMy.builder; - return new ImdgPredicateHazelcast(this, Predicates.or(paramAMy.hazelcastPredicate, paramBMy.hazelcastPredicate)); + return new ImdgPredicateHazelcast(Predicates.or(paramAMy.hazelcastPredicate, paramBMy.hazelcastPredicate)); + } + + @Override + public ImdgPredicate or(ImdgPredicate paramA, ImdgPredicate paramB, ImdgPredicate paramC) { + ImdgPredicateHazelcast paramAMy = (ImdgPredicateHazelcast) paramA; + ImdgPredicateHazelcast paramBMy = (ImdgPredicateHazelcast) paramB; + ImdgPredicateHazelcast paramCMy = (ImdgPredicateHazelcast) paramC; + return new ImdgPredicateHazelcast(Predicates.or(paramAMy.hazelcastPredicate, paramBMy.hazelcastPredicate, paramCMy.hazelcastPredicate)); } } diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateHazelcast.java index 1c2f36461..e2ee78c25 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateHazelcast.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/predicate/ImdgPredicateHazelcast.java @@ -3,13 +3,13 @@ package ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate; import com.hazelcast.query.Predicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import java.util.Objects; + public class ImdgPredicateHazelcast implements ImdgPredicate { - protected final ImdgPredicateBuilderHazelcast builder; protected final Predicate hazelcastPredicate; - protected ImdgPredicateHazelcast(ImdgPredicateBuilderHazelcast builder, Predicate hazelcastPredicate) { - assert hazelcastPredicate != null; - this.builder = builder; + protected ImdgPredicateHazelcast(Predicate hazelcastPredicate) { + Objects.requireNonNull(hazelcastPredicate); this.hazelcastPredicate = hazelcastPredicate; } @@ -19,6 +19,6 @@ public class ImdgPredicateHazelcast implements ImdgPredicate { @Override public String toString() { - return "ImdgPredicateHazelcast{" + hazelcastPredicate + '}'; + return hazelcastPredicate.toString(); } } diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicateBuilder.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicateBuilder.java index 4ff3d679f..09b135a35 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicateBuilder.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/predicate/ImdgPredicateBuilder.java @@ -9,5 +9,7 @@ public interface ImdgPredicateBuilder { ImdgPredicate not(ImdgPredicate param); ImdgPredicate and(ImdgPredicate paramA, ImdgPredicate paramB); + ImdgPredicate and(ImdgPredicate paramA, ImdgPredicate paramB, ImdgPredicate paramC); ImdgPredicate or(ImdgPredicate paramA, ImdgPredicate paramB); + ImdgPredicate or(ImdgPredicate paramA, ImdgPredicate paramB, ImdgPredicate paramC); } From 2d2a0f5b9c1a196edd24818a8cf1db1cfe1ec7e0 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 30 Dec 2022 11:41:55 +0300 Subject: [PATCH 15/15] =?UTF-8?q?reports-service=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20XML=20=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D0=BA=D0=B8=20ReportBR=5F0420312=5FP1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java index 13f432afb..69be76846 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java @@ -16,7 +16,6 @@ public class ReportBR_0420312_P1 extends ReportWithPeriod { @XStreamAlias("destination") private String destination; - @XStreamAlias("rows") private final List rows = new ArrayList<>(); @@ -58,6 +57,7 @@ public class ReportBR_0420312_P1 extends ReportWithPeriod { clearingMemberCategoryClearingMemberCategory)); } + @XStreamAlias("rows") public static class Info_0420312_P1 { @XStreamAsAttribute @XStreamAlias("company_clearingCode")