From 22ffb029711ce4a38a3a2901228ad8705f0ac18b Mon Sep 17 00:00:00 2001 From: akulikov Date: Mon, 29 May 2023 16:31:08 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-283 --- .../docs/report.BR для разработчиков.docx | Bin 140552 -> 0 bytes .../reports/ReportsServiceApplication.java | 20 +- .../reports/config/ReportCmdParser.java | 43 --- .../element/ReportsServiceSettings.java | 5 - .../config/validation/ValidationConfig.java | 20 ++ .../DOCXService.java | 34 +- .../notifications/NotificationBuilder.java | 1 - .../reports/reports/AbstractReport.java | 48 --- .../clearing/reports/reports/Destination.java | 23 -- .../clearing/reports/reports/ReportId.java | 49 --- .../reports/ReportWithClearingStatus.java | 25 -- .../reports/reports/ReportWithPeriod.java | 35 -- .../PeriodLiabilitiesClaimsReportBuilder.java | 12 +- .../bp/PeriodMoneyChangeReportBuilder.java | 7 +- ...SummaryLiabilitiesClaimsReportBuilder.java | 12 +- .../bp/SummaryMoneyChangeReportBuilder.java | 18 +- .../reports/bt/bt_12_2/ReportPA_B.java | 80 ----- .../reports/bt/bt_12_2/ReportPA_IV.java | 83 ----- .../reports/reports/bt/bt_13/ReportDOCIN.java | 75 ---- .../reports/bt/bt_13/ReportDOCOUT.java | 74 ---- .../reports/bt/bt_16_5/ReportINACCNT.java | 72 ---- .../bt/bt_17_1/ReportBR_0420315_P1.java | 66 ---- .../bt/bt_17_1/ReportBR_0420315_P2.java | 54 --- .../reports/bt/bt_17_2/ReportBR_0420317.java | 60 ---- .../reports/bt/bt_17_3/ReportBR_0420318.java | 64 ---- .../bt/bt_17_4/ReportBR_0420314_P1.java | 60 ---- .../bt/bt_17_4/ReportBR_0420314_P2.java | 61 ---- .../bt/bt_17_5/ReportBR_0420312_P1.java | 59 ---- .../bt/bt_17_5/ReportBR_0420312_P10.java | 52 --- .../bt/bt_17_5/ReportBR_0420312_P2.java | 55 --- .../bt/bt_17_5/ReportBR_0420312_P3.java | 54 --- .../bt/bt_17_5/ReportBR_0420312_P4.java | 52 --- .../bt/bt_17_5/ReportBR_0420312_P5.java | 54 --- .../bt/bt_17_5/ReportBR_0420312_P6.java | 52 --- .../bt/bt_17_5/ReportBR_0420312_P7.java | 52 --- .../bt/bt_17_5/ReportBR_0420312_P8.java | 59 ---- .../bt/bt_17_5/ReportBR_0420312_P9.java | 55 --- .../services/AbstractReportCollector.java | 102 ------ .../reports/services/QCommandExecutor.java | 87 ----- .../ReportForClearingCodeCollector.java | 10 - .../reports/services/ReportService.java | 101 +++++- .../services/ReportWithPeriodCollector.java | 42 --- .../reports/services/ReportsService.java | 320 ------------------ .../services/ReportsServiceCommand.java | 270 --------------- .../services/SimpleReportCollector.java | 11 - .../services/builders/FileReportBuilder.java | 22 -- .../services/builders/XMLReportBuilder.java | 46 --- .../reports/services/collector/MapUtil.java | 55 --- .../bt/bt_12_2/ReportPA_B_Collector.java | 105 ------ .../bt/bt_12_2/ReportPA_IV_Collector.java | 109 ------ .../bt/bt_13/ReportDOCIN_Collector.java | 66 ---- .../bt/bt_13/ReportDOCOUT_Collector.java | 65 ---- .../bt/bt_16_5/ReportINACCNT_Collector.java | 78 ----- .../ReportBR_0420315_P1_Collector.java | 125 ------- .../ReportBR_0420315_P2_collector.java | 57 ---- .../bt_17_2/ReportBR_0420317_Collector.java | 83 ----- .../bt_17_3/ReportBR_0420318_Collector.java | 117 ------- .../ReportBR_0420314_P1_Collector.java | 101 ------ .../ReportBR_0420314_P2_Collector.java | 131 ------- .../ReportBR_0420312_P10_Collector.java | 49 --- .../ReportBR_0420312_P1_Collector.java | 85 ----- .../ReportBR_0420312_P2_Collector.java | 63 ---- .../ReportBR_0420312_P3_Collector.java | 63 ---- .../ReportBR_0420312_P4_Collector.java | 49 --- .../ReportBR_0420312_P5_Collector.java | 49 --- .../ReportBR_0420312_P6_Collector.java | 49 --- .../ReportBR_0420312_P7_Collector.java | 49 --- .../ReportBR_0420312_P8_Collector.java | 100 ------ .../ReportBR_0420312_P9_Collector.java | 82 ----- .../services/AbstractReportCollectorTest.java | 1 - .../reports/services/DOCXServiceTest.java | 1 + 71 files changed, 183 insertions(+), 4205 deletions(-) delete mode 100644 clearing-parent/reports-service/docs/report.BR для разработчиков.docx delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportCmdParser.java rename clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/{services => notifications}/DOCXService.java (90%) delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/Destination.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportId.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithClearingStatus.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithPeriod.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_12_2/ReportPA_B.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_12_2/ReportPA_IV.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_13/ReportDOCIN.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_13/ReportDOCOUT.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_16_5/ReportINACCNT.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_1/ReportBR_0420315_P1.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_1/ReportBR_0420315_P2.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_2/ReportBR_0420317.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_3/ReportBR_0420318.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_4/ReportBR_0420314_P1.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_4/ReportBR_0420314_P2.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P1.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P10.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P2.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P3.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P4.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P5.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P6.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P7.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P8.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P9.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/AbstractReportCollector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportForClearingCodeCollector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportWithPeriodCollector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsServiceCommand.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/SimpleReportCollector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/MapUtil.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_12_2/ReportPA_B_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_12_2/ReportPA_IV_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_13/ReportDOCIN_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_13/ReportDOCOUT_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_16_5/ReportINACCNT_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_1/ReportBR_0420315_P1_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_1/ReportBR_0420315_P2_collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_2/ReportBR_0420317_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_3/ReportBR_0420318_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_4/ReportBR_0420314_P1_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_4/ReportBR_0420314_P2_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P10_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P1_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P2_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P3_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P4_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P5_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P6_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P7_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P8_Collector.java delete mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P9_Collector.java diff --git a/clearing-parent/reports-service/docs/report.BR для разработчиков.docx b/clearing-parent/reports-service/docs/report.BR для разработчиков.docx deleted file mode 100644 index 3e4c567ac16c9ffff9caa941bd25f46b2fed20f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140552 zcmeFY^N(mj7pB{`ZQHhO+qP}nJnin&wr$(CZCm$z-^}FB&HM>-E0z6ARd%v>)|*=E zS#K#w1B0LdfB`@N000mIP&BxYX8-~Kbb|o^AOk=EX$#xixtQ9y=&N`-m^$mydDz+z z6o3Fx`~?8|xBvei{}=y(rc_z^K?azxTZyl5D)l8Z2LXuc!@f~OGDeab%L}_eAIkf+ zms`gd#eB=czL8=j>rY?&&e+Y~4D1|VfryFqq#ShKKY^(=YHm6WY4gHsMX2831Dc)42Vg2r{R`iSb|4oLZY5N( z;^OC}+=U3L#Wi%{`B9}aZfPi;JpnAY!}y!J*LBOeUirB^tBED?xA2RaHH5ndv*`W# zg601OFNIS{Qs5wf3bZ3w@

bLr* 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
    TP2ss%|U>G@jqz?PNprK(N^>qWjo7= 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 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 06efcbe60..0492bb849 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,34 +6,16 @@ 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.config.ReportCmdParser; -import ru.spcex.clearing.reports.services.QCommandExecutor; -import ru.spcex.clearing.reports.services.ReportsServiceCommand; @SpringBootApplication public class ReportsServiceApplication { public static void main(String[] args) { try { - ReportCmdParser cmdArgs = new ReportCmdParser(args); - SpringApplicationBuilder builder = new SpringApplicationBuilder(ReportsServiceApplication.class); ConfigurableApplicationContext context = builder.run(args); Logger log = LoggerFactory.getLogger(ReportsServiceApplication.class); - if (cmdArgs.isConsole()) { - log.info("Console mode"); - try { - ReportsServiceCommand reportCommand = context.getBean(ReportsServiceCommand.class); - reportCommand.writeAllXML(); - } finally { - log.info("Shutdown application after work"); - context.close(); - } - } else { - log.info("Service mode"); - QCommandExecutor queueListener = context.getBean(QCommandExecutor.class); - log.trace("QCommandExecutor: {}", queueListener); - } + } catch (Throwable e) { LoggerFactory.getLogger(ReportsServiceApplication.class).error("Report-service start failed: {} -> {}", e.getClass().getSimpleName(), ExceptionUtils.getStackTrace(e)); System.exit(-1); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportCmdParser.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportCmdParser.java deleted file mode 100644 index 62bc96299..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/ReportCmdParser.java +++ /dev/null @@ -1,43 +0,0 @@ -package ru.spcex.clearing.reports.config; - -/** - * Параметры запуска командной строки. - * - * @see ru.spcex.clearing.reports.config.element.ReportsServiceSettings - */ -public class ReportCmdParser { - protected static final String ARG_CONSOLE = "--console"; - protected static final String ARG_SERVICE = "--service"; - protected boolean console; - protected boolean service; - - public ReportCmdParser(String[] args) { - for (String arg : args) { - if (ARG_CONSOLE.equals(arg)) console = true; - if (ARG_SERVICE.equals(arg)) service = true; - } - } - - public boolean isConsole() { - return console; - } - - public boolean isService() { - return service; - } - - @Override - public String toString() { - return "ReportCmdParser{console=" + console + ", service=" + service + '}'; - } -} - -/* -Вариант парсинга сложных выражений: - - commons-cli - commons-cli - 1.4 - -но сейчас достаточно один параметр проверять - */ \ No newline at end of file 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 c8d0d3ad3..365eafeb8 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 @@ -7,11 +7,6 @@ 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; -/** - * Параметр запуска: XMLReportBuilder - * --spring.config.location=E:/MFD_GIT_REPO/clearing/clearing-parent/reports-service/src/main/resources - * - */ @Component @PropertySource("file:${spring.config.location}/application.properties") @ConfigurationProperties("reports-service") diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java index 5295a3da6..650fa6668 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java @@ -9,6 +9,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequest; import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithPeriod; import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionId; import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionIdList; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.reports.errors.ReportError; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.clearing.validation.common.rules.EndDtAfterStartDtRule; @@ -144,6 +145,25 @@ public class ValidationConfig { }; } + // todo оставил бин валидатора на будущее, если в дальнейшем придется проверять запрос. в текущей версии, по факту, + // запрос не проверяется: в случае если sessionId не указан отчеты не строятся + @Bean("reportRequestGREP") + public Function reportRequestGREPValidator( + Map> imdgForValidation + ) { + return launcherCommandRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(launcherCommandRequest); + return new ValidatorImpl<>(context, + FieldRequiredRule.instance( + "sessionId", + LauncherCommandRequest::getSessionId, + ReportError.RequiredFieldEmpty, + false) + ); + }; + } + } 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/notifications/DOCXService.java similarity index 90% rename from clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/DOCXService.java rename to clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/notifications/DOCXService.java index 67cd092ea..7bcd951f5 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/notifications/DOCXService.java @@ -1,10 +1,13 @@ -package ru.spcex.clearing.reports.services; +package ru.spcex.clearing.reports.notifications; import org.apache.poi.xwpf.usermodel.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.*; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; import java.net.URL; import java.util.LinkedList; import java.util.List; @@ -16,26 +19,26 @@ import java.util.regex.PatternSyntaxException; import java.util.stream.Collectors; /** + * todo Пока неизвестно нужны ли будут ещё эти уведомления, поэтому весь связанный код переместил в один пакет + *

    * Сервис для работы с DOCX файлами * Читает шаблон .docx и во всех текстовых элементах меняет переданные ключи на соответствующие им значения * Пример ключа по умолчанию: ${ключ} - * + *

    * При использовании нового шаблона, необходимо отредактировать docx документ так, чтобы ключ содержался в одном * элементе. Для этого нужно вырезать ключ и в это же место вставить его как текст, без форматирования. Если нужно, * идентификатору потом можно установить стиль, который будет применён к вставляемой строке. */ public class DOCXService { private final Logger log = LoggerFactory.getLogger(getClass()); - /** - * При инициализации сохраняет все имеющиеся ключи (ищет по маске keyPattern), найденные в текстовых элементах документа - */ - private List keyPositions = new LinkedList<>(); - /** * Паттерн поиска ключей в файле по умолчанию */ private final Pattern DEFAULT_KEY_PATTERN = Pattern.compile("\\$\\{.*?}"); - + /** + * При инициализации сохраняет все имеющиеся ключи (ищет по маске keyPattern), найденные в текстовых элементах документа + */ + private List keyPositions = new LinkedList<>(); /** * Паттерн поиска ключей в файле */ @@ -56,7 +59,7 @@ public class DOCXService { */ public boolean init(URL templateFile, String keyPattern) { initialized = false; - if (templateFile == null /*|| !templateFile.exists() || !templateFile.isFile()*/) { + if (templateFile == null) { log.warn("Invalid templateFile {}", templateFile); return false; } @@ -82,10 +85,9 @@ public class DOCXService { * valuesMap. * * @param outputFile Выходной файл. Должен быть либо файлом (будет перезаписан), либо отсутствовать - * @param valuesMap Мапа значений. В файле шаблона будут искаться ключи этой мапы и заменяться на соответствующие значения. - * @param checkKeys True - строгий режим, где будет проверено наличие всех ключей из файла в valuesMap. - * False - мягкий режим, отсутствующие ключи будут пропущены - * + * @param valuesMap Мапа значений. В файле шаблона будут искаться ключи этой мапы и заменяться на соответствующие значения. + * @param checkKeys True - строгий режим, где будет проверено наличие всех ключей из файла в valuesMap. + * False - мягкий режим, отсутствующие ключи будут пропущены * @return true - если вставка прошла успешно */ public boolean insertValues(File outputFile, @@ -110,7 +112,7 @@ public class DOCXService { } } - try (InputStream inputStream = templateFile.openStream(); //new FileInputStream(templateFile); + try (InputStream inputStream = templateFile.openStream(); OutputStream outputStream = new FileOutputStream(outputFile)) { XWPFDocument doc = new XWPFDocument(inputStream); @@ -127,7 +129,7 @@ public class DOCXService { boolean checkOk = checkIntersection(valuesMap, notPresentInMap); if (!checkOk) { log.error("Can't insert values in file {}. Keys not in map: {}.", - templateFile.toExternalForm()/*templateFile.getAbsolutePath()*/, + templateFile.toExternalForm(), String.join(", ", notPresentInMap)); return false; } 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 9773f4a1e..16053a381 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 @@ -3,7 +3,6 @@ package ru.spcex.clearing.reports.notifications; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.spcex.clearing.reports.exceptions.ConfigException; -import ru.spcex.clearing.reports.services.DOCXService; import java.io.File; import java.net.URL; 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 deleted file mode 100644 index c8b56a13e..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java +++ /dev/null @@ -1,48 +0,0 @@ -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; - -/** - * Общая шапка (атрибуты) для всех отчетов - */ -@Deprecated -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; - - @XStreamAsAttribute - @XStreamAlias("code") - protected String code; - - @XStreamAsAttribute - @XStreamAlias("name") - protected String name; - - public AbstractReport(ReportId reportId, - String version, - String code, - String name) { - this.reportId = reportId; - this.version = version; - this.code = code; - this.name = name; - } - - abstract public String getReportName(LocalDateTime reportDateTime); - - public ReportId getReportId() { - return reportId; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/Destination.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/Destination.java deleted file mode 100644 index da4f82002..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/Destination.java +++ /dev/null @@ -1,23 +0,0 @@ -package ru.spcex.clearing.reports.reports; - -import ru.spcex.platform.utils.enumeration.IEnumKey; - -public enum Destination implements IEnumKey { - BR("BR"), _1C("1C"); - - private final String key; - - Destination(String key) { - this.key = key; - } - - @Override - public String getKey() { - return this.key; - } - - @Override - public boolean equalsByKey(String key) { - return IEnumKey.super.equalsByKey(key); - } -} 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 deleted file mode 100644 index 1d66b3ebc..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportId.java +++ /dev/null @@ -1,49 +0,0 @@ -package ru.spcex.clearing.reports.reports; - -import ru.spcex.platform.utils.enumeration.IEnumKey; - -/** - * Идентификаторы отчётов - */ -@Deprecated -public enum ReportId implements IEnumKey { - PA_B("REPPA.B"), PA_IV("REPPA.IV"), - - BT13_11("DOCIN"), BT13_12("DOCOUT"), - - BT16_5("INACCNT"), - - BR_0420315_P1("REPBR.0420315.P1"), BR_0420315_P2("REPBR.0420315.P2"), - - BR_0420317("REPBR.0420317"), - - BR_0420318("REPBR.0420318"), - - BR_0420314_P1("REPBR.0420314.P1"), BR_0420314_P2("REPBR.0420314.P2"), - - BR_0420312_P1("REPBR.0420312_р1-1"), BR_0420312_P2("REPBR.0420312_р1-2"), BR_0420312_P3("REPBR.0420312_р1-3"), BR_0420312_P4("REPBR.0420312_р1-4"), - BR_0420312_P5("REPBR.0420312_р1-5"), BR_0420312_P6("REPBR.0420312_р1-6"), BR_0420312_P7("REPBR.0420312_р1-7"), BR_0420312_P8("REPBR.0420312_р3-1"), - BR_0420312_P9("REPBR.0420312_р3-2"), BR_0420312_P10("REPBR.0420312_р3-3"), - - OPERATIONAL_LIABILITIES_CLAIMS("operational_liabilities_claims"), - OPERATIONAL_MONEY_CHANGE("operational_money_change"), - SUMMARY_LIABILITIES_CLAIMS("summary_liabilities_claims"), - SUMMARY_L_MONEY_CHANGE("summary_lmoney_change"), - PERIOD_LIABILITIES_CLAIMS("period_liabilities_claims"), - PERIOD_MONEY_CHANGE("period_money_change"), - EXECUTED_DEAL_REPORT("executed_deal_report"), - UNFULFILLED_DEAL_REPORT("unfulfilled_deal_report"), - - ; - - private final String key; - - ReportId(String key) { - this.key = key; - } - - @Override - public String getKey() { - return key; - } -} 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 deleted file mode 100644 index 051362750..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithClearingStatus.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.spcex.clearing.reports.reports; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; - -import java.time.LocalDate; - -@Deprecated -public abstract class ReportWithClearingStatus extends ReportWithPeriod { - @XStreamAsAttribute - @XStreamAlias("clearingStatus") - protected String clearingStatus; - - public ReportWithClearingStatus(ReportId reportId, - String version, - String code, - String name, - LocalDate startDate, - LocalDate endDate, - String clearingStatus) { - super(reportId, version, code, name, startDate, endDate); - this.clearingStatus = clearingStatus; - } - -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithPeriod.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithPeriod.java deleted file mode 100644 index e7e6d7376..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/ReportWithPeriod.java +++ /dev/null @@ -1,35 +0,0 @@ -package ru.spcex.clearing.reports.reports; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; - -import java.time.LocalDate; - -/** - * Шапка для отчётов, содержащих startDate и endDate - */ -@Deprecated -public abstract class ReportWithPeriod extends AbstractReport { - - @XStreamAsAttribute - @XStreamAlias("startDate") -// @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"}) - protected LocalDate startDate; - - @XStreamAsAttribute - @XStreamAlias("endDate") -// @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"}) - protected LocalDate endDate; - - - public ReportWithPeriod(ReportId reportId, - String version, - String code, - String name, - LocalDate startDate, - LocalDate endDate) { - 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/bp/PeriodLiabilitiesClaimsReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/PeriodLiabilitiesClaimsReportBuilder.java index 4d5532b07..de8e639ea 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/PeriodLiabilitiesClaimsReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/PeriodLiabilitiesClaimsReportBuilder.java @@ -5,7 +5,10 @@ import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.spcex.clearing.reports.reports.SessionIdListParams; import ru.spcex.platform.enumeration.ReportType; 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.LocalDate; import java.time.LocalDateTime; import java.util.Collection; import java.util.Collections; @@ -29,9 +32,14 @@ public class PeriodLiabilitiesClaimsReportBuilder extends LiabilitiesClaimsRepor @Override protected Collection getExecutionFondsForReport(SessionIdListParams params) { if (params.getSessionIdList() == null || params.getSessionIdList().isEmpty()) return Collections.emptyList(); - return executionFondImdg.getCollectionObjectsByPredicate( - executionFondImdg.predicateBuilder().in("sessionId", params.getSessionIdList().toArray(new Long[0])) + ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder(); + // todo OR - временное решение. В изначальном плане была передача списка id сессий, но теперь нужно делать на текущий день + // пока не определятся, что именно им нужно - остается OR, в дальнейшем предикат будет правиться + ImdgPredicate predicate = pb.or( + pb.in("sessionId", params.getSessionIdList().toArray(new Long[0])), + pb.equals("clearingDate", LocalDate.now()) ); + return executionFondImdg.getCollectionObjectsByPredicate(predicate); } @Override diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/PeriodMoneyChangeReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/PeriodMoneyChangeReportBuilder.java index 6e35c0cab..d4a4b2886 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/PeriodMoneyChangeReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/PeriodMoneyChangeReportBuilder.java @@ -8,6 +8,7 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import java.time.LocalDateTime; import java.util.Collection; +import java.util.stream.Collectors; public class PeriodMoneyChangeReportBuilder extends MoneyChangeReportBuilder { @@ -18,12 +19,16 @@ public class PeriodMoneyChangeReportBuilder extends MoneyChangeReportBuilder getRegistryForReport(PeriodParams params) { ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); - return registryImdg.getCollectionObjectsByPredicate( + Collection registries = registryImdg.getCollectionObjectsByPredicate( pb.and( pb.greatEqual("clearingDate", params.getStartDate()), pb.lessEqual("clearingDate", params.getEndDate()) ) ); + registries = registries.stream() + .filter(registry -> registry.getRegistryCode().startsWith("AM")) + .collect(Collectors.toList()); + return registries; } @Override diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/SummaryLiabilitiesClaimsReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/SummaryLiabilitiesClaimsReportBuilder.java index 50de7bac2..448b3e34e 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/SummaryLiabilitiesClaimsReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/SummaryLiabilitiesClaimsReportBuilder.java @@ -5,7 +5,9 @@ import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.spcex.clearing.reports.reports.EmptyParams; import ru.spcex.platform.enumeration.ReportType; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Collection; @@ -16,12 +18,18 @@ public class SummaryLiabilitiesClaimsReportBuilder extends LiabilitiesClaimsRepo @Override protected Collection getExecutionFondsForReport(EmptyParams params) { - return executionFondImdg.getAllValues(); + // todo Временное решение. В изначальном плане была передача списка id сессий, но теперь нужно делать на текущий день + // пока не определятся, что именно им нужно - остается OR, в дальнейшем предикат будет правиться + ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder(); + return executionFondImdg.getCollectionObjectsByPredicate(pb.equals("clearingDate", LocalDate.now())); } @Override protected Collection getExecutionDepositsForReport(EmptyParams params) { - return executionDepositImdg.getAllValues(); + // todo Временное решение. В изначальном плане была передача списка id сессий, но теперь нужно делать на текущий день + // пока не определятся, что именно им нужно - остается OR, в дальнейшем предикат будет правиться + ImdgPredicateBuilder pb = executionDepositImdg.predicateBuilder(); + return executionDepositImdg.getCollectionObjectsByPredicate(pb.equals("clearingDate", LocalDate.now())); } @Override diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/SummaryMoneyChangeReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/SummaryMoneyChangeReportBuilder.java index a636c5911..2cf12fc9f 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/SummaryMoneyChangeReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bp/SummaryMoneyChangeReportBuilder.java @@ -4,9 +4,12 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.reports.reports.EmptyParams; import ru.spcex.platform.enumeration.ReportType; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Collection; +import java.util.stream.Collectors; public class SummaryMoneyChangeReportBuilder extends MoneyChangeReportBuilder { public SummaryMoneyChangeReportBuilder(ImdgProvider imdgProvider) { @@ -15,7 +18,20 @@ public class SummaryMoneyChangeReportBuilder extends MoneyChangeReportBuilder getRegistryForReport(EmptyParams param) { - return registryImdg.getAllValues(); + // todo отсечение по периоду - временный код, пока не решили как передавать в GREP период. + // по изначальной задумке в summary отчет должны включаться все записи. + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + LocalDate now = LocalDate.now(); + Collection registries = registryImdg.getCollectionObjectsByPredicate( + pb.and( + pb.greatEqual("clearingDate", now), + pb.lessEqual("clearingDate", now) + ) + ); + registries = registries.stream() + .filter(registry -> registry.getRegistryCode().startsWith("AM")) + .collect(Collectors.toList()); + return registries; } @Override diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_12_2/ReportPA_B.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_12_2/ReportPA_B.java deleted file mode 100644 index d638fbf44..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_12_2/ReportPA_B.java +++ /dev/null @@ -1,80 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_12_2; - -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.ReportWithPeriod; -import ru.spcex.platform.enumeration.ClearingCategory; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("netPositionBank") -@Deprecated -public class ReportPA_B extends ReportWithPeriod { - @XStreamAsAttribute - @XStreamAlias("clearingMemberCategory") - private String clearingMemberCategory; - - @XStreamAlias("rows") - private List rows = new ArrayList<>(); - - @XStreamAlias("total") - private Total total; - - public ReportPA_B(LocalDate startDate, - LocalDate endDate) { - super(ReportId.PA_B, - "0.0.1", - "BT12.2", - "Отчет по нетто-позиции участника клиринга в секции МКР (Уполномоченный банк)", - startDate, - endDate); - this.clearingMemberCategory = ClearingCategory.B.getKey(); - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPPA.B.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - public void setTotal(Total total) { - this.total = total; - } - - public List getRows() { - return rows; - } - - @XStreamAlias("total") - public record Total(@XStreamAsAttribute @XStreamAlias("claimsAmount") String claimsAmount, - @XStreamAsAttribute @XStreamAlias("liabilitiesAmount") String liabilitiesAmount, - @XStreamAsAttribute @XStreamAlias("paymentAmount") String paymentAmount) { - } - - - @XStreamAlias("row") - public record Info_PA_B( - @XStreamAsAttribute @XStreamAlias("id") String id, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_fullName") String liabilitiesClaimsAssetsFullName, - @XStreamAsAttribute @XStreamAlias("company_clearingCode") String companyClearingCode, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_settlementDate") String liabilitiesClaimsAssetsSettlementDate, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_refundDate") String liabilitiesClaimsAssetsRefundDate, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_tradingDate") String liabilitiesClaimsAssetsTradingDate, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_contract") String liabilitiesClaimsAssetsContract, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_liabilitiesQuantity") String liabilitiesClaimsAssetsLiabilitiesQuantity, - @XStreamAsAttribute @XStreamAlias("chargeCommission") String chargeCommission, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_ClaimsQuantity") String liabilitiesClaimsAssetsClaimsQuantity, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_refundPaymentId") String liabilitiesClaimsAssetsRefundPaymentId, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_clearingStatus") String liabilitiesClaimsAssetsClearingStatus, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_comment") String liabilitiesClaimsAssetsComment - ) { - } - -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_12_2/ReportPA_IV.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_12_2/ReportPA_IV.java deleted file mode 100644 index a989f5a03..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_12_2/ReportPA_IV.java +++ /dev/null @@ -1,83 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_12_2; - -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.ReportWithPeriod; -import ru.spcex.platform.enumeration.ClearingCategory; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("netPositionInitiator") -@Deprecated -public class ReportPA_IV extends ReportWithPeriod { - @XStreamAsAttribute - @XStreamAlias("clearingMemberCategory") - private String clearingMemberCategory; - - @XStreamAlias("rows") - private List rows = new ArrayList<>(); - - @XStreamAlias("total") - private Total total; - - - public ReportPA_IV(LocalDate startDate, - LocalDate endDate) { - super(ReportId.PA_IV, - "0.0.1", - "BT2", - "Отчет по нетто-позиции участника клиринга в секции МКР (Вкладчик)", - startDate, - endDate); - this.clearingMemberCategory = "%s,%s".formatted( - ClearingCategory.I.getKey(), - ClearingCategory.V.getKey() - ); - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPPA.IV.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - public void setTotal(Total total) { - this.total = total; - } - - public List getRows() { - return rows; - } - - @XStreamAlias("total") - public record Total(@XStreamAsAttribute @XStreamAlias("claimsAmount") String claimsAmount, - @XStreamAsAttribute @XStreamAlias("liabilitiesAmount") String liabilitiesAmount, - @XStreamAsAttribute @XStreamAlias("paymentAmount") String paymentAmount) { - } - - @XStreamAlias("row") - public record Info_PA_IV( - @XStreamAsAttribute @XStreamAlias("id") String id, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_fullName") String liabilitiesClaimsAssetsFullName, - @XStreamAsAttribute @XStreamAlias("company_clearingCode") String companyClearingCode, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_settlementDate") String liabilitiesClaimsAssetsSettlementDate, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_refundDate") String liabilitiesClaimsAssetsRefundDate, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_tradingDate") String liabilitiesClaimsAssetsTradingDate, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_contract") String liabilitiesClaimsAssetsContract, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_liabilitiesQuantity") String liabilitiesClaimsAssetsLiabilitiesQuantity, - @XStreamAsAttribute @XStreamAlias("chargeCommission") String chargeCommission, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_ClaimsQuantity") String liabilitiesClaimsAssetsClaimsQuantity, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_refundPaymentId") String liabilitiesClaimsAssetsRefundPaymentId, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_clearingStatus") String liabilitiesClaimsAssetsClearingStatus, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_comment") String liabilitiesClaimsAssetsComment - ) { - } - -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_13/ReportDOCIN.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_13/ReportDOCIN.java deleted file mode 100644 index c10a38e33..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_13/ReportDOCIN.java +++ /dev/null @@ -1,75 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.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; -import java.time.LocalTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("incomingDocuments") -@Deprecated -public class ReportDOCIN extends AbstractReport { - /** - * Дата в формате: dd.MM.yyyy - */ - @XStreamAsAttribute - @XStreamAlias("date") -// @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"}) - private final LocalDate date; - - /** - * Время в формате: hh:mm:ss - */ - @XStreamAsAttribute - @XStreamAlias("time") -// @XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"}) - private final LocalTime time; - - @XStreamAlias("rows") - private List rows = new ArrayList<>(); - - public ReportDOCIN(LocalDate date, - LocalTime time) { - super(ReportId.BT13_11, - "0.0.1", - "BT 13.11", - "Журнал Входящих документов"); - this.date = date; - this.time = time; - } - - public List getRows() { - return rows; - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "DOCIN.%s".formatted( - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - @XStreamAlias("row") - public record Info_DOCIN( - @XStreamAsAttribute @XStreamAlias("id") String id, - @XStreamAsAttribute @XStreamAlias("inDocumentJournal_registrationDate") String inDocumentJournalRegistrationDate, - @XStreamAsAttribute @XStreamAlias("inDocumentJournal_registrationTime") String inDocumentJournalRegistrationTime, - @XStreamAsAttribute @XStreamAlias("inDocumentJournal_registrationNumber") String inDocumentJournalRegistrationNumber, - @XStreamAsAttribute @XStreamAlias("inDocumentJournal_documentName") String inDocumentJournalDocumentName, - @XStreamAsAttribute @XStreamAlias("inDocumentJournal_sender") String inDocumentJournalSender, - @XStreamAsAttribute @XStreamAlias("inDocumentJournal_quantity") String inDocumentJournalQuantity, - @XStreamAsAttribute @XStreamAlias("inDocumentJournal_clearingCode") String inDocumentJournalClearingCode, - @XStreamAsAttribute @XStreamAlias("inDocumentJournal_courierType") String inDocumentJournalCourierType, - @XStreamAsAttribute @XStreamAlias("inDocumentJournal_emailDate") String inDocumentJournal_emailDate, - @XStreamAsAttribute @XStreamAlias("inDocumentJournal_Amount") String inDocumentJournalAmount, - @XStreamAsAttribute @XStreamAlias("inDocumentJournal_dossierNumber") String inDocumentJournalDossierNumber, - @XStreamAsAttribute @XStreamAlias("inDocumentJournal_Comment") String inDocumentJournalComment, - @XStreamAsAttribute @XStreamAlias("inDocumentJournal_receiptDate") String inDocumentJournalReceiptDate - ) { - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_13/ReportDOCOUT.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_13/ReportDOCOUT.java deleted file mode 100644 index be4037989..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_13/ReportDOCOUT.java +++ /dev/null @@ -1,74 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.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; -import java.time.LocalTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("incomingDocuments") -@Deprecated -public class ReportDOCOUT extends AbstractReport { - /** - * Дата в формате: dd.MM.yyyy - */ - @XStreamAsAttribute - @XStreamAlias("date") -// @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"}) - private final LocalDate date; - - /** - * Время в формате: hh:mm:ss - */ - @XStreamAsAttribute - @XStreamAlias("time") -// @XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"}) - private final LocalTime time; - - @XStreamAlias("rows") - private List rows = new ArrayList<>(); - - public ReportDOCOUT(LocalDate date, - LocalTime time) { - super(ReportId.BT13_12, - "0.0.1", - "BT 13.12", - "Журнал Исходящих документов"); - this.date = date; - this.time = time; - } - - public List getRows() { - return rows; - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "DOCOUT.%s".formatted( - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - @XStreamAlias("row") - public record Info_DOCOUT( - @XStreamAsAttribute @XStreamAlias("id") String id, - @XStreamAsAttribute @XStreamAlias("outDocumentJournal_registrationDate") String outDocumentJournalRegistrationDate, - @XStreamAsAttribute @XStreamAlias("outDocumentJournal_registrationTime") String outDocumentJournalRegistrationTime, - @XStreamAsAttribute @XStreamAlias("outDocumentJournal_registrationNumber") String outDocumentJournalRegistrationNumber, - @XStreamAsAttribute @XStreamAlias("outDocumentJournal_documentName") String outDocumentJournalDocumentName, - @XStreamAsAttribute @XStreamAlias("outDocumentJournal_addressee") String outDocumentJournalAddressee, - @XStreamAsAttribute @XStreamAlias("outDocumentJournal_quantity") String outDocumentJournalQuantity, - @XStreamAsAttribute @XStreamAlias("outDocumentJournal_clearingCode") String outDocumentJournalClearingCode, - @XStreamAsAttribute @XStreamAlias("outDocumentJournal_courierType") String outDocumentJournalCourierType, - @XStreamAsAttribute @XStreamAlias("outDocumentJournal_emailDate") String outDocumentJournal_emailDate, - @XStreamAsAttribute @XStreamAlias("outDocumentJournal_Amount") String outDocumentJournalAmount, - @XStreamAsAttribute @XStreamAlias("outDocumentJournal_dossierNumber") String outDocumentJournalDossierNumber, - @XStreamAsAttribute @XStreamAlias("outDocumentJournal_postDate") String outDocumentJournalPostDate - ) { - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_16_5/ReportINACCNT.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_16_5/ReportINACCNT.java deleted file mode 100644 index 32d9cad93..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_16_5/ReportINACCNT.java +++ /dev/null @@ -1,72 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.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; -import java.time.LocalTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("accountBalanceInfo") -@Deprecated -public class ReportINACCNT extends AbstractReport { - @XStreamAsAttribute - @XStreamAlias("clearingMemberCategory") - private final String companyClearingCode; - - /** - * Дата в формате: dd.MM.yyyy - */ - @XStreamAsAttribute - @XStreamAlias("date") -// @XStreamConverter(value = FormattedLocalDateConverter.class, strings = {"dd.MM.yyyy"}) - private final LocalDate date; - - /** - * Время в формате: hh:mm:ss - */ - @XStreamAsAttribute - @XStreamAlias("time") -// @XStreamConverter(value = FormattedLocalTimeConverter.class, strings = {"HH:mm:ss"}) - private final LocalTime time; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportINACCNT(String companyClearingCode, LocalDate date, LocalTime time) { - super(ReportId.BT16_5, - "0.0.1", - "BT16.5", - "Отчет о денежных средствах на счете внутреннего учета (клиринговом регистре) Участника клиринга"); - this.companyClearingCode = companyClearingCode; - this.date = date; - this.time = time; - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "INACCNT.%s.%s".formatted( - companyClearingCode, - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - public List getRows() { - return rows; - } - - @XStreamAlias("row") - public record Info_INACCNT(@XStreamAsAttribute @XStreamAlias("id") String id, - @XStreamAsAttribute @XStreamAlias("company_fullName") String companyFullName, - @XStreamAsAttribute @XStreamAlias("company_clearingCode") String companyClearingCode, - @XStreamAsAttribute @XStreamAlias("accountBalance_account") String accountBalanceAccount, - @XStreamAsAttribute @XStreamAlias("accountBalance_openAccount") String accountBalanceOpenAccount, - @XStreamAsAttribute @XStreamAlias("accountBalance_debitAccount") String accountBalanceDebitAccount, - @XStreamAsAttribute @XStreamAlias("accountBalance_creditAccount") String accountBalanceCreditAccount, - @XStreamAsAttribute @XStreamAlias("accountBalance_closeAccount") String accountBalanceCloseAccount) { - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_1/ReportBR_0420315_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_1/ReportBR_0420315_P1.java deleted file mode 100644 index bd317a145..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_1/ReportBR_0420315_P1.java +++ /dev/null @@ -1,66 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_17_1; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.reports.Destination; -import ru.spcex.clearing.reports.reports.ReportId; -import ru.spcex.clearing.reports.reports.ReportWithClearingStatus; -import ru.spcex.platform.enumeration.ClearingCategory; -import ru.spcex.platform.enumeration.ClearingStatus; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("clearedLiabilities") -@Deprecated -public class ReportBR_0420315_P1 extends ReportWithClearingStatus { - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - @XStreamAsAttribute - @XStreamAlias("clearingMemberCategory") - private String clearingMemberCategory; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportBR_0420315_P1(LocalDate startDate, - LocalDate endDate) { - super(ReportId.BR_0420315_P1, - "0.0.1", - "0420315", - "Сведения об исполненных обязательствах, допущенных к клирингу, за отчетный период, часть 1", - startDate, - endDate, - ClearingStatus.OK.getKey()); - this.destination = Destination.BR.getKey(); - this.clearingMemberCategory = "%s,%s".formatted( - ClearingCategory.I.getKey(), - ClearingCategory.V.getKey() - ); - } - - public List getRows() { - return rows; - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420315.P1.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - @XStreamAlias("row") - public record Info_0420315_P1(@XStreamAlias("company_id") @XStreamAsAttribute String companyId, - @XStreamAlias("company_fullName") @XStreamAsAttribute String companyFullName, - @XStreamAlias("listing_market") @XStreamAsAttribute String listingMarket, - @XStreamAlias("contract_qty") @XStreamAsAttribute String contractQty, - @XStreamAlias("liabilities_amount") @XStreamAsAttribute String liabilitiesAmount) { - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_1/ReportBR_0420315_P2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_1/ReportBR_0420315_P2.java deleted file mode 100644 index dd013a1ff..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_1/ReportBR_0420315_P2.java +++ /dev/null @@ -1,54 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_17_1; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.reports.Destination; -import ru.spcex.clearing.reports.reports.ReportId; -import ru.spcex.clearing.reports.reports.ReportWithPeriod; - -import java.time.LocalDate; -import java.time.LocalDateTime; - -@XStreamAlias("clearedLiabilitiesTotal") -@Deprecated -public class ReportBR_0420315_P2 extends ReportWithPeriod { - @XStreamAlias("rows") - private Info_0420315_P2 rows; - - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - public ReportBR_0420315_P2(LocalDate startDate, - LocalDate endDate) { - super(ReportId.BR_0420315_P2, - "0.0.1", - "0420315", - "Сведения об исполненных обязательствах, допущенных к клирингу, за отчетный период, часть 2", - startDate, - endDate); - this.destination = Destination.BR.getKey(); - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420315.P2.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - public Info_0420315_P2 getRows() { - return rows; - } - - public void setRows(Info_0420315_P2 rows) { - this.rows = rows; - } - - public record Info_0420315_P2(@XStreamAlias("contract_qty") @XStreamAsAttribute String contractQty, - @XStreamAlias("liabilities_amount") @XStreamAsAttribute String liabilitiesAmount) { - } - -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_2/ReportBR_0420317.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_2/ReportBR_0420317.java deleted file mode 100644 index 167b889de..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_2/ReportBR_0420317.java +++ /dev/null @@ -1,60 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_17_2; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.reports.Destination; -import ru.spcex.clearing.reports.reports.ReportId; -import ru.spcex.clearing.reports.reports.ReportWithPeriod; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("clearingServiceStatus") -@Deprecated -public class ReportBR_0420317 extends ReportWithPeriod { - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportBR_0420317(LocalDate startDate, LocalDate endDate) { - super(ReportId.BR_0420317, - "0.0.1", - "0420317", - "Сведения о предоставлении, прекращении, приостановке," + - " возобновлении допуска к клиринговому обслуживанию", - startDate, - endDate); - this.destination = Destination.BR.getKey(); - } - - public List getRows() { - return rows; - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420317.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - @XStreamAlias("row") - public record Info_0420317( - @XStreamAsAttribute @XStreamAlias("company_clearingCode") String companyClearingCode, - @XStreamAsAttribute @XStreamAlias("relation_supplierId") String relationSupplierId, - @XStreamAsAttribute @XStreamAlias("relation_serviceId") String relationServiceId, - @XStreamAsAttribute @XStreamAlias("relation_serviceStatus") String relationServiceStatus, - @XStreamAsAttribute @XStreamAlias("relation_updatedAt") String relationUpdatedAt, - @XStreamAsAttribute @XStreamAlias("company_fullName") String companyFullName, - @XStreamAsAttribute @XStreamAlias("companySymbol_code") String companySymbolCode, - @XStreamAsAttribute @XStreamAlias("companyInfo_countryCode") String companyInfoCountryCode, - @XStreamAsAttribute @XStreamAlias("relation_comment") String relationComment) { - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_3/ReportBR_0420318.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_3/ReportBR_0420318.java deleted file mode 100644 index 0a4d1529c..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_3/ReportBR_0420318.java +++ /dev/null @@ -1,64 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_17_3; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.reports.Destination; -import ru.spcex.clearing.reports.reports.ReportId; -import ru.spcex.clearing.reports.reports.ReportWithClearingStatus; -import ru.spcex.platform.enumeration.ClearingStatus; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("unfundedLiabilities") -@Deprecated -public class ReportBR_0420318 extends ReportWithClearingStatus { - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportBR_0420318(LocalDate startDate, LocalDate endDate) { - super(ReportId.BR_0420318, - "0.0.1", - "0420318", - "Сведения о неисполненных обязательствах", - startDate, - endDate, - ClearingStatus.FAIL.getKey()); - this.destination = Destination.BR.getKey(); - } - - public List getRows() { - return rows; - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420318.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - @XStreamAlias("row") - public record Info_0420318( - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_fullName") String liabilitiesClaimsAssetsFullName, - @XStreamAsAttribute @XStreamAlias("companySymbols_code") String companySymbolsCode, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_countryCode") String liabilitiesClaimsAssetsCountryCode, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_settlementDate") String liabilitiesClaimsAssetsSettlementDate, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_Contract") String liabilitiesClaimsAssetsContract, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsMoney_currencyCode") String liabilitiesClaimsMoneyCurrencyCode, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_liabilitiesQuantity") String liabilitiesClaimsAssetsLiabilitiesQuantity, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsMoney_name") String liabilitiesClaimsMoneyName, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_liabilities") String liabilitiesClaimsAssetsLiabilities, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_comment") String liabilitiesClaimsAssetsComment, - @XStreamAsAttribute @XStreamAlias("companySymbol_value") String companySymbolValue, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_fullNames") String liabilitiesClaimsAssetsFullNames) { - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_4/ReportBR_0420314_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_4/ReportBR_0420314_P1.java deleted file mode 100644 index 55fede8b5..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_4/ReportBR_0420314_P1.java +++ /dev/null @@ -1,60 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_17_4; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.reports.Destination; -import ru.spcex.clearing.reports.reports.ReportId; -import ru.spcex.clearing.reports.reports.ReportWithClearingStatus; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("accountTransactionLiabilities") -@Deprecated -public class ReportBR_0420314_P1 extends ReportWithClearingStatus { - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportBR_0420314_P1(LocalDate startDate, LocalDate endDate, String clearingStatus, String destination) { - super(ReportId.BR_0420314_P1, - "0.0.1", - "0420314", - "Сведения об УК и операциях, проведенных по торговым счетам, часть 1", - startDate, - endDate, - clearingStatus); - this.destination = Destination.BR.getKey(); - } - - public List getRows() { - return rows; - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420314.P1.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - @XStreamAlias("partOne") - public record Info_0420314_P1( - @XStreamAsAttribute @XStreamAlias("company_clearingCode") String companyClearingCode, - @XStreamAsAttribute @XStreamAlias("profileDocument_id") String profileDocumentId, - @XStreamAsAttribute @XStreamAlias("company_fullName") String companyFullName, - @XStreamAsAttribute @XStreamAlias("companySymbol_code") String companySymbolCode, - @XStreamAsAttribute @XStreamAlias("companySymbol_value") String companySymbolValue, - @XStreamAsAttribute @XStreamAlias("clearingMemberCategory_clearingMemberCategory") String clearingMemberCategoryClearingMemberCategory, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_contract") String liabilitiesClaimsAssets_contract, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_tradingDate") String liabilitiesClaimsAssets_tradingDate, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_liabilitiesQuantity") String liabilitiesClaimsAssetsLiabilitiesQuantity) { - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_4/ReportBR_0420314_P2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_4/ReportBR_0420314_P2.java deleted file mode 100644 index 1feed5112..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_4/ReportBR_0420314_P2.java +++ /dev/null @@ -1,61 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.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.ReportWithPeriod; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("accountTransactionTurnover") -@Deprecated -public class ReportBR_0420314_P2 extends ReportWithPeriod { - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - @XStreamAsAttribute - @XStreamAlias("transactionStatus") - protected String transactionStatus; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportBR_0420314_P2(LocalDate startDate, LocalDate endDate, String transactionStatus, String destination) { - super(ReportId.BR_0420314_P2, - "0.0.1", - "0420314", - "Сведения об УК и операциях, проведенных по торговым счетам, часть 2", - startDate, - endDate); - this.transactionStatus = transactionStatus; - this.destination = destination; - } - - public List getRows() { - return rows; - } - - - @XStreamAlias("partTwo") - public record Info_0420314_P2( - @XStreamAsAttribute @XStreamAlias("company_clearingCode") String companyClearingCode, - @XStreamAsAttribute @XStreamAlias("profileDocument_id") String profileDocumentId, - @XStreamAsAttribute @XStreamAlias("accountBalance_openBalanceAmount") String accountBalanceOpenBalanceAmount, - @XStreamAsAttribute @XStreamAlias("paymentInstruction_creditLeg_amount") String paymentInstructionCreditLegAmount, - @XStreamAsAttribute @XStreamAlias("paymentInstruction_debitLeg_amount") String paymentInstructionDebitLegAmount, - @XStreamAsAttribute @XStreamAlias("accountBalance_closeBalanceAmount") String accountBalanceCloseBalanceAmount) { - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420314.P2.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P1.java deleted file mode 100644 index 3e6492797..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P1.java +++ /dev/null @@ -1,59 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_17_5; - -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.ReportWithPeriod; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("clearingCoverage1") -@Deprecated -public class ReportBR_0420312_P1 extends ReportWithPeriod { - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportBR_0420312_P1(LocalDate startDate, - LocalDate endDate, - String destination) { - super(ReportId.BR_0420312_P1, - "0.0.1", - "0420312", - "Сведения о клиринговом обеспечении, часть 1", - startDate, - endDate); - this.destination = destination; - } - - public List getRows() { - return rows; - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420312_р1-1.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - @XStreamAlias("row") - public record Info_0420312_P1( - @XStreamAsAttribute @XStreamAlias("company_clearingCode") String companyClearingCode, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_companyId") String liabilitiesClaimsAssetsCompanyId, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_fullName") String liabilitiesClaimsAssetsFullName, - @XStreamAsAttribute @XStreamAlias("companySymbol_code") String companySymbolCode, - @XStreamAsAttribute @XStreamAlias("companySymbol_value") String companySymbolValue, - @XStreamAsAttribute @XStreamAlias("companyInfo_countryCode") String companyInfoCountryCode, - @XStreamAsAttribute @XStreamAlias("clearingMemberCategory_clearingMemberCategory") String clearingMemberCategoryClearingMemberCategory) { - } - -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P10.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P10.java deleted file mode 100644 index 32ad2e543..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P10.java +++ /dev/null @@ -1,52 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_17_5; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.reports.Destination; -import ru.spcex.clearing.reports.reports.ReportId; -import ru.spcex.clearing.reports.reports.ReportWithPeriod; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("clearingCoverage10") -@Deprecated -public class ReportBR_0420312_P10 extends ReportWithPeriod { - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportBR_0420312_P10(LocalDate startDate, - LocalDate endDate) { - super(ReportId.BR_0420312_P10, - "0.0.5", - "0420312", - "Сведения о клиринговом обеспечении, часть 10", - startDate, - endDate); - this.destination = Destination.BR.getKey(); - } - - public List getRows() { - return rows; - } - - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420312_р3-3.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - public record Info_0420312_P10( - @XStreamAsAttribute @XStreamAlias("liabilities_amount") String liabilitiesAmount) { - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P2.java deleted file mode 100644 index 6e0043854..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P2.java +++ /dev/null @@ -1,55 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_17_5; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.reports.Destination; -import ru.spcex.clearing.reports.reports.ReportId; -import ru.spcex.clearing.reports.reports.ReportWithPeriod; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("clearingCoverage2") -@Deprecated -public class ReportBR_0420312_P2 extends ReportWithPeriod { - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportBR_0420312_P2(LocalDate startDate, - LocalDate endDate, - String destination) { - super(ReportId.BR_0420312_P2, - "0.0.1", - "0420312", - "Сведения о клиринговом обеспечении, часть 2", - startDate, - endDate); - this.destination = Destination.BR.getKey(); - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420312_р1-2.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - public List getRows() { - return rows; - } - - @XStreamAlias("row") - public record Info_0420312_P2( - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_companyId") String liabilitiesClaimsAssetsCompanyId, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_liabilities") String liabilitiesClaimsAssetsLiabilities) { - } - -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P3.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P3.java deleted file mode 100644 index 79ec3df44..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P3.java +++ /dev/null @@ -1,54 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_17_5; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.reports.Destination; -import ru.spcex.clearing.reports.reports.ReportId; -import ru.spcex.clearing.reports.reports.ReportWithPeriod; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("clearingCoverage3") -@Deprecated -public class ReportBR_0420312_P3 extends ReportWithPeriod { - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportBR_0420312_P3(LocalDate startDate, - LocalDate endDate, - String destination) { - super(ReportId.BR_0420312_P3, - "0.0.5", - "0420312", - "Сведения о клиринговом обеспечении, часть 3", - startDate, - endDate); - this.destination = Destination.BR.getKey(); - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420312_р1-3.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - public List getRows() { - return rows; - } - - @XStreamAlias("row") - public record Info_0420312_P3( - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_companyId") String liabilitiesClaimsAssetsCompanyId, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_liabilities") String liabilitiesClaimsAssetsLiabilities) { - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P4.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P4.java deleted file mode 100644 index e8350d3b7..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P4.java +++ /dev/null @@ -1,52 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_17_5; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.reports.Destination; -import ru.spcex.clearing.reports.reports.ReportId; -import ru.spcex.clearing.reports.reports.ReportWithPeriod; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("clearingCoverage4") -@Deprecated -public class ReportBR_0420312_P4 extends ReportWithPeriod { - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportBR_0420312_P4(LocalDate startDate, - LocalDate endDate) { - super(ReportId.BR_0420312_P4, - "0.0.5", - "0420312", - "Сведения о клиринговом обеспечении, часть 4", - startDate, - endDate); - this.destination = Destination.BR.getKey(); - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420312_р1-4.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - public List getRows() { - return rows; - } - - @XStreamAlias("row") - public record Info_0420312_P4( - @XStreamAsAttribute @XStreamAlias("liabilities_amount") String liabilitiesAmount) { - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P5.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P5.java deleted file mode 100644 index 5579eaf22..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P5.java +++ /dev/null @@ -1,54 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_17_5; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.reports.Destination; -import ru.spcex.clearing.reports.reports.ReportId; -import ru.spcex.clearing.reports.reports.ReportWithPeriod; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("clearingCoverage5") -@Deprecated -public class ReportBR_0420312_P5 extends ReportWithPeriod { - - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportBR_0420312_P5(LocalDate startDate, - LocalDate endDate) { - super(ReportId.BR_0420312_P5, - "0.0.5", - "0420312", - "Сведения о клиринговом обеспечении, часть 5", - startDate, - endDate); - this.destination = Destination.BR.getKey(); - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420312_р1-5.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - public List getRows() { - return rows; - } - - - @XStreamAlias("row") - public record Info_0420312_P5( - @XStreamAsAttribute @XStreamAlias("liabilities_amount") String liabilitiesAmount) { - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P6.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P6.java deleted file mode 100644 index 7f8220da6..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P6.java +++ /dev/null @@ -1,52 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_17_5; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.reports.Destination; -import ru.spcex.clearing.reports.reports.ReportId; -import ru.spcex.clearing.reports.reports.ReportWithPeriod; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("clearingCoverage6") -@Deprecated -public class ReportBR_0420312_P6 extends ReportWithPeriod { - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportBR_0420312_P6(LocalDate startDate, - LocalDate endDate) { - super(ReportId.BR_0420312_P6, - "0.0.5", - "0420312", - "Сведения о клиринговом обеспечении, часть 6", - startDate, - endDate); - this.destination = Destination.BR.getKey(); - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420312_р1-6.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - public List getRows() { - return rows; - } - - @XStreamAlias("row") - public record Info_0420312_P6( - @XStreamAsAttribute @XStreamAlias("liabilities_amount") String liabilitiesAmount) { - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P7.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P7.java deleted file mode 100644 index fa809a07e..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P7.java +++ /dev/null @@ -1,52 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_17_5; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.reports.Destination; -import ru.spcex.clearing.reports.reports.ReportId; -import ru.spcex.clearing.reports.reports.ReportWithPeriod; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("clearingCoverage7") -@Deprecated -public class ReportBR_0420312_P7 extends ReportWithPeriod { - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportBR_0420312_P7(LocalDate startDate, - LocalDate endDate) { - super(ReportId.BR_0420312_P7, - "0.0.5", - "0420312", - "Сведения о клиринговом обеспечении, часть 7", - startDate, - endDate); - this.destination = Destination.BR.getKey(); - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420312_р1-7.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - public List getRows() { - return rows; - } - - @XStreamAlias("row") - public record Info_0420312_P7( - @XStreamAsAttribute @XStreamAlias("liabilities_amount") String liabilitiesAmount) { - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P8.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P8.java deleted file mode 100644 index 51d6c3345..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P8.java +++ /dev/null @@ -1,59 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_17_5; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.reports.Destination; -import ru.spcex.clearing.reports.reports.ReportId; -import ru.spcex.clearing.reports.reports.ReportWithPeriod; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("clearingCoverage8") -@Deprecated -public class ReportBR_0420312_P8 extends ReportWithPeriod { - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportBR_0420312_P8(LocalDate startDate, - LocalDate endDate) { - super(ReportId.BR_0420312_P8, - "0.0.5", - "0420312", - "Сведения о клиринговом обеспечении, часть 8", - startDate, - endDate); - this.destination = Destination.BR.getKey(); - } - - public List getRows() { - return rows; - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420312_р3-1.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - @XStreamAlias("row") - public record Info_0420312_P8( - @XStreamAsAttribute @XStreamAlias("currency_id") String currencyId, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_companyId") String liabilitiesClaimsAssetsCompanyId, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_fullName") String liabilitiesClaimsAssetsFullName, - @XStreamAsAttribute @XStreamAlias("companySymbol_code") String companySymbolCode, - @XStreamAsAttribute @XStreamAlias("companySymbol_value") String companySymbolValue, - @XStreamAsAttribute @XStreamAlias("companyInfo_countryCode") String companyInfoCountryCode, - @XStreamAsAttribute @XStreamAlias("clearingMemberCategory_clearingMemberCategory") String clearingMemberCategoryClearingMemberCategory - ) { - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P9.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P9.java deleted file mode 100644 index 24e899539..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt/bt_17_5/ReportBR_0420312_P9.java +++ /dev/null @@ -1,55 +0,0 @@ -package ru.spcex.clearing.reports.reports.bt.bt_17_5; - -import com.thoughtworks.xstream.annotations.XStreamAlias; -import com.thoughtworks.xstream.annotations.XStreamAsAttribute; -import ru.spcex.clearing.reports.reports.Destination; -import ru.spcex.clearing.reports.reports.ReportId; -import ru.spcex.clearing.reports.reports.ReportWithPeriod; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@XStreamAlias("clearingCoverage9") -@Deprecated -public class ReportBR_0420312_P9 extends ReportWithPeriod { - @XStreamAsAttribute - @XStreamAlias("destination") - private String destination; - - @XStreamAlias("rows") - private final List rows = new ArrayList<>(); - - public ReportBR_0420312_P9(LocalDate startDate, - LocalDate endDate) { - super(ReportId.BR_0420312_P9, - "0.0.5", - "0420312", - "Сведения о клиринговом обеспечении, часть 9", - startDate, - endDate); - this.destination = Destination.BR.getKey(); - } - - public List getRows() { - return rows; - } - - @Override - public String getReportName(LocalDateTime reportDateTime) { - return "REPBR.0420312_р3-2.%s-%s.%s".formatted( - DATE_FORMATTER.format(startDate), - DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(reportDateTime) - ); - } - - public record Info_0420312_P9( - @XStreamAsAttribute @XStreamAlias("currency_id") String currencyId, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_companyId") String liabilitiesClaimsAssetsCompanyId, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsMoney_currencyCode") String liabilitiesClaimsMoneyCurrencyCode, - @XStreamAsAttribute @XStreamAlias("liabilitiesClaimsAssets_liabilities") String liabilitiesClaimsAssetsLiabilities - ) { - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/AbstractReportCollector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/AbstractReportCollector.java deleted file mode 100644 index 8c79bf7df..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/AbstractReportCollector.java +++ /dev/null @@ -1,102 +0,0 @@ -package ru.spcex.clearing.reports.services; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import ru.spcex.clearing.reports.reports.AbstractReport; -import ru.spcex.clearing.reports.reports.ReportId; -import ru.spcex.platform.utils.time.TimeUtil; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.Locale; - -@Deprecated -public abstract class AbstractReportCollector { - public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy"); - public static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss"); - public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss"); - protected final Logger log = LoggerFactory.getLogger(getClass()); - - abstract public Class getReportClass(); - - public ReportId getReportId() { - Class theClass = getReportClass(); - Constructor[] constructors = theClass.getConstructors(); // getConstructors - public, getDeclaredConstructors - all - Constructor useConstructor = null; - for (int i = 0; i < constructors.length; i++) { - if (useConstructor == null || useConstructor.getParameterCount() > constructors[i].getParameterCount()) { - useConstructor = constructors[i]; - } - } - Object[] cArg = new Object[useConstructor.getParameterCount()]; // all null - try { - T object = useConstructor.newInstance(cArg); - ReportId theId = object.getReportId(); - return theId; - } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException("Can not found ReportId from class " + theClass.getName(), e); - } - } - - protected void validateDateRange(LocalDate startDate, LocalDate endDate) throws IllegalArgumentException { - if (startDate.isAfter(endDate)) { - throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")"); - } - } - - 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(String str) { - if (str == null) return ""; - return str; - } - - protected String toString(Long val) { - if (val == null) return ""; - return val.toString(); - } - - /** - * Обеспечивает точность 2 знака после запятой - */ - protected String toString(Double val) { - if (val == null) return ""; - return String.format(Locale.US, "%.2f", val); - } - - /** - * Обеспечивает точность 2 знака после запятой - */ - protected String toString(BigDecimal val) { - if (val == null) return ""; - return val.setScale(2, RoundingMode.HALF_UP).toString(); - } - - protected String toString(Instant val) { - if (val == null) return ""; - return DATE_TIME_FORMATTER.format(val.atZone(ZoneId.systemDefault())); - } - - protected String toString(LocalDate date) { - if (date == null) return ""; - return DATE_FORMATTER.format(date); - } - - protected String toString(LocalTime date) { - if (date == null) return ""; - return TIME_FORMATTER.format(date); - } - -} 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 deleted file mode 100644 index 95436a786..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java +++ /dev/null @@ -1,87 +0,0 @@ -package ru.spcex.clearing.reports.services; - -import org.apache.commons.lang3.StringUtils; -import org.apache.kafka.clients.consumer.Consumer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.reports.config.element.ReportsServiceSettings; -import ru.spcex.platform.enumeration.Task; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.log.ExceptionUtils; - -import java.io.IOException; -import java.time.LocalDate; - -import static ru.spcex.clearing.reports.services.ReportsServiceCommand.QUEUE_RUN_DAILY_REPORT_COMMAND; -import static ru.spcex.clearing.reports.services.ReportsServiceCommand.QUEUE_RUN_REPORT_COMMAND; - -@Service -@Lazy // требуется получать экземпляр сервиса явно, когда надо его запустить -public class QCommandExecutor extends QueueConsumer implements InitializingBean { - private final Logger log = LoggerFactory.getLogger(getClass()); - - ReportsServiceCommand reportsServiceCommand; - ReportsServiceSettings config; - - public QCommandExecutor(Consumer kafkaQueue, ImdgProvider imdgProvider, - ReportsServiceCommand reportsServiceCommand, - ReportsServiceSettings config) { - super(kafkaQueue); - this.reportsServiceCommand = reportsServiceCommand; - this.config = config; - } - - @Override - public void afterPropertiesSet() { - log.info("Init queue listener {}", getClass().getSimpleName()); - callback(LauncherCommandRequest.class) - .setConsumer(this::newReportWithPeriod) - .forDestination(Task.createReport_GREP.topic(), callbacks::put); - init(); - } - - private void newReportWithPeriod(BaseRequest reportRequest) { - LauncherCommandRequest request = reportRequest.getRequestPayload(); - log.info("newReportWithPeriod request received: {}", request); - final String taskName = QUEUE_RUN_REPORT_COMMAND; //request.getTaskName(); - -// if (StringUtils.isBlank(request.getReportId())) -// throw new IllegalStateException("ReportID is empty"); -// LocalDate startDate = request.getStartDate(); -// LocalDate endDate = request.getEndDate(); - LocalDate startDate = null; - LocalDate endDate = null; - if (startDate == null && endDate == null) { - endDate = LocalDate.now(); - startDate = LocalDate.of(endDate.getYear(), endDate.getMonth(), 1); - log.debug("No date present, use default: {} - {}", startDate, endDate); - } - if (startDate == null || endDate == null) - throw new IllegalStateException("StartDate or EndDate is null"); - if (startDate.isAfter(endDate)) - throw new IllegalStateException("StartDate > EndDate"); - - try { - if (QUEUE_RUN_REPORT_COMMAND.equals(taskName) - || QUEUE_RUN_DAILY_REPORT_COMMAND.equals(taskName)) { - log.info("Generate all report by command {}", taskName); - reportsServiceCommand.generateReportAll(taskName, startDate, endDate); - } else { - log.info("Generate single report by command {}", taskName); - reportsServiceCommand.generateReportById(taskName, startDate, endDate); - } - - log.debug("successfully processed"); - } catch (IOException e) { - log.error("Error create report {}: {}", taskName, ExceptionUtils.getStackTrace(e)); - } - } - - -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportForClearingCodeCollector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportForClearingCodeCollector.java deleted file mode 100644 index 6926ce635..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportForClearingCodeCollector.java +++ /dev/null @@ -1,10 +0,0 @@ -package ru.spcex.clearing.reports.services; - -import ru.spcex.clearing.reports.reports.AbstractReport; - -public abstract class ReportForClearingCodeCollector extends AbstractReportCollector { - /** - * Подготовка отчета по clearingCode - */ - abstract public T collectReportForClearingCode(String clearingCode); -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java index 2718a3053..3dac2987a 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java @@ -13,6 +13,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequest; import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithPeriod; import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionId; import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionIdList; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.reports.config.element.ReportsServiceSettings; @@ -20,11 +21,14 @@ import ru.spcex.clearing.reports.reports.*; import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.enumeration.ReportType; +import ru.spcex.platform.enumeration.Task; import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.validation.IValidator; import java.io.File; +import java.time.LocalDate; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -38,6 +42,7 @@ public class ReportService extends QueueConsumer implements InitializingBean { private final Function reportRequestWithSessionIdValidator; private final Function reportRequestWithSessionIdListValidator; private final Function reportRequestWithPeriodValidator; + private final Function reportRequestGREPValidator; private final Map>> reportBuildersWithoutParams; private final Map>> reportBuildersWithSessionIdParam; private final Map>> reportBuildersWithSessionIdListParam; @@ -65,7 +70,9 @@ public class ReportService extends QueueConsumer implements InitializingBean { @Qualifier("reportRequestWithSessionIdListValidator") Function reportRequestWithSessionIdListValidator, @Qualifier("reportRequestWithPeriodValidator") - Function reportRequestWithPeriodValidator) { + Function reportRequestWithPeriodValidator, + @Qualifier("reportRequestGREP") + Function reportRequestGREPValidator) { super(kafkaQueue, kafkaResponseQueue); this.userRoleVerification = userRoleVerification; this.validationHelper = validationHelper; @@ -77,6 +84,7 @@ public class ReportService extends QueueConsumer implements InitializingBean { this.reportBuildersWithSessionIdParam = reportBuildersWithSessionIdParam; this.reportBuildersWithSessionIdListParam = reportBuildersWithSessionIdListParam; this.reportBuildersWithPeriodParams = reportBuildersWithPeriodParams; + this.reportRequestGREPValidator = reportRequestGREPValidator; this.outFolder = new File(reportsServiceSettings.getReportModuleOut()); assert outFolder.isDirectory(); } @@ -95,6 +103,9 @@ public class ReportService extends QueueConsumer implements InitializingBean { callback(ReportRequestWithPeriod.class) .setFunction(this::createReportForPeriod) .forDestination(Consts.CREATE_REPORT_FOR_PERIOD, callbacks::put); + callback(LauncherCommandRequest.class) + .setFunction(this::createReportForGREP) + .forDestination(Task.createReport_GREP.topic(), callbacks::put); init(); } @@ -233,5 +244,93 @@ public class ReportService extends QueueConsumer implements InitializingBean { return null; } + public RequestInfoUpdate createReportForGREP(BaseRequest userRequest) { + log.debug("ReportRequestWithPeriod received"); + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return null; + + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestGREPValidator); + if (requestInfoUpdate != null) return null; + + Long sessionId = userRequest.getRequestPayload().getSessionId(); + + int cntErrors = 0; + List outFilenames = new ArrayList<>(); + + Collection>> buildersWithoutParams = reportBuildersWithoutParams.values(); + for (List> builderList : buildersWithoutParams) { + for (CSVReportBuilder builder : builderList) { + File outFile = builder.createReport(new EmptyParams(), outFolder); + if (outFile == null) { + log.warn("Something wrong, report type: {}", builder.getReportType().getKey()); + cntErrors++; + continue; + } + outFilenames.add(outFile.getAbsolutePath()); + } + } + + if (sessionId != null) { + + Collection>> buildersWithSessionIdParam = reportBuildersWithSessionIdParam.values(); + for (List> builderList : buildersWithSessionIdParam) { + for (CSVReportBuilder builder : builderList) { + if ( + builder.getReportType() == ReportType.OPERATIONAL_MONEY_CHANGE || + builder.getReportType() == ReportType.OPERATIONAL_LIABILITIES_CLAIMS + ) { + continue; + } + SessionIdParam sessionIdParam = new SessionIdParam(); + sessionIdParam.setSessionId(sessionId); + File outFile = builder.createReport(sessionIdParam, outFolder); + if (outFile == null) { + log.warn("Something wrong, report type: {}", builder.getReportType().getKey()); + cntErrors++; + continue; + } + outFilenames.add(outFile.getAbsolutePath()); + } + } + + Collection>> buildersWithSessionIdListParam = reportBuildersWithSessionIdListParam.values(); + for (List> builderList : buildersWithSessionIdListParam) { + for (CSVReportBuilder builder : builderList) { + SessionIdListParams sessionIdListParams = new SessionIdListParams(); + sessionIdListParams.setSessionIdList(List.of(sessionId)); + File outFile = builder.createReport(sessionIdListParams, outFolder); + if (outFile == null) { + log.warn("Something wrong, report type: {}", builder.getReportType().getKey()); + cntErrors++; + continue; + } + outFilenames.add(outFile.getAbsolutePath()); + } + } + + } + + LocalDate now = LocalDate.now(); + Collection>> buildersWithPeriodParams = reportBuildersWithPeriodParams.values(); + for (List> builderList : buildersWithPeriodParams) { + for (CSVReportBuilder builder : builderList) { + PeriodParams periodParams = new PeriodParams(); + periodParams.setStartDate(now); + periodParams.setEndDate(now); + File outFile = builder.createReport(periodParams, outFolder); + if (outFile == null) { + log.warn("Something wrong, report type: {}", builder.getReportType().getKey()); + cntErrors++; + continue; + } + outFilenames.add(outFile.getAbsolutePath()); + } + } + + if (cntErrors == 0) log.debug("All reports successfully created. Output files: {}", String.join(", ", outFilenames)); + else log.debug("Some reports ({}) create failed. Output files: {}", cntErrors, String.join(", ", outFilenames)); + + return null; + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportWithPeriodCollector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportWithPeriodCollector.java deleted file mode 100644 index 607d35ede..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportWithPeriodCollector.java +++ /dev/null @@ -1,42 +0,0 @@ -package ru.spcex.clearing.reports.services; - -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.spcex.clearing.reports.reports.AbstractReport; -import ru.spcex.platform.imdg.api.Imdg; -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; - -@Deprecated -public abstract class ReportWithPeriodCollector extends AbstractReportCollector { - /** - * Подготовка отчета на период startDate..endDate - */ - abstract public T collectReportWithPeriod(LocalDate startDate, LocalDate endDate); - - protected Collection searchLiabilitiesClaimsAssets(Imdg liabilitiesClaimsAssetsImdg, - LocalDate startDate, - LocalDate endDate) { - ImdgPredicateBuilder pb = liabilitiesClaimsAssetsImdg.predicateBuilder(); -// Instant dateTimeLo = toInstantStartDay(startDate); -// Instant dateTimeHi = toInstantEndDay(endDate); - ImdgPredicate p = pb.and(pb.greatEqual("refundDate", startDate), pb.lessEqual("refundDate", endDate)); - Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsByPredicate(p); - return liabilities; - } - - protected Collection searchLiabilitiesClaimsAssets(Imdg liabilitiesClaimsAssetsImdg, - LocalDate startDate, LocalDate endDate, - Long allowClearingStatusId) { - ImdgPredicateBuilder pb = liabilitiesClaimsAssetsImdg.predicateBuilder(); -// Instant dateTimeLo = toInstantStartDay(startDate); -// Instant dateTimeHi = toInstantEndDay(endDate); - ImdgPredicate p = pb.and(pb.greatEqual("refundDate", startDate), pb.lessEqual("refundDate", endDate), - 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/ReportsService.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java deleted file mode 100644 index 1339fcdb2..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsService.java +++ /dev/null @@ -1,320 +0,0 @@ -//package ru.spcex.clearing.reports.services; -// -//import com.thoughtworks.xstream.XStream; -//import com.thoughtworks.xstream.io.naming.NoNameCoder; -//import com.thoughtworks.xstream.io.xml.XppDriver; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -//import ru.spcex.clearing.reports.reports.bt_12_2.ReportPA_BT2_B; -//import ru.spcex.clearing.reports.reports.bt_12_2.ReportPA_BT2_IV; -//import ru.spcex.clearing.reports.reports.bt_13.ReportDOCIN; -////import ru.spcex.clearing.reports.reports.bt_13.Report_BT13_12; -//import ru.spcex.clearing.reports.reports.bt_16_5.Report_BT16_5; -//import ru.spcex.clearing.reports.reports.bt_17_1.ReportBR_0420315_P1; -//import ru.spcex.clearing.reports.reports.bt_17_1.ReportBR_0420315_P2; -//import ru.spcex.clearing.reports.reports.bt_17_2.ReportBR_0420317; -//import ru.spcex.clearing.reports.reports.bt_17_3.ReportBR_0420318; -//import ru.spcex.clearing.reports.reports.bt_17_4.ReportBR_0420314_P1; -//import ru.spcex.clearing.reports.reports.bt_17_4.ReportBR_0420314_P2; -//import ru.spcex.clearing.reports.reports.bt_17_5.*; -// -//import java.time.LocalDate; -//import java.time.LocalTime; -// -//@Deprecated -//public class ReportsService { -// private final Logger log = LoggerFactory.getLogger(getClass()); -// -// public void writeXML() { -// XStream xStream = new XStream(new XppDriver(new NoNameCoder())); -// -// xStream.processAnnotations(ReportBR_0420315_P1.class); -// xStream.processAnnotations(ReportBR_0420315_P2.class); -// xStream.processAnnotations(ReportBR_0420317.class); -// xStream.processAnnotations(ReportBR_0420318.class); -// xStream.processAnnotations(ReportBR_0420314_P1.class); -// xStream.processAnnotations(ReportBR_0420314_P2.class); -// xStream.processAnnotations(ReportBR_0420312_P1.class); -// xStream.processAnnotations(ReportBR_0420312_P2.class); -// xStream.processAnnotations(ReportBR_0420312_P3.class); -// xStream.processAnnotations(ReportBR_0420312_P4.class); -// xStream.processAnnotations(ReportBR_0420312_P5.class); -// xStream.processAnnotations(ReportBR_0420312_P6.class); -// xStream.processAnnotations(ReportBR_0420312_P7.class); -// xStream.processAnnotations(ReportBR_0420312_P8.class); -// xStream.processAnnotations(ReportBR_0420312_P9.class); -// xStream.processAnnotations(ReportBR_0420312_P10.class); -// xStream.processAnnotations(ReportPA_BT2_IV.class); -// xStream.processAnnotations(ReportPA_BT2_B.class); -// xStream.processAnnotations(Report_BT16_5.class); -// xStream.processAnnotations(ReportDOCIN.class); -//// xStream.processAnnotations(Report_BT13_12.class); -// -// -// -// /* ========= БТ 17.1 ========== */ -// // todo see ReportDataCollector -// ReportBR_0420315_P1 reportBR_0420315_p1 = new ReportBR_0420315_P1(LocalDate.now(), -// LocalDate.now()); -// ReportBR_0420315_P1.Info_0420315_P1 info_0420315_p1 = new ReportBR_0420315_P1.Info_0420315_P1("companyId", -// "companyFullName", -// "listingMarket", -// "contractorQty", -// "liabilitiesAmount"); -// reportBR_0420315_p1.getRows().add(info_0420315_p1); -// log.info("ReportBR_0420315_P1:\n{}\n", xStream.toXML(reportBR_0420315_p1)); -// -// -// -//// ReportBR_0420315_P2 reportBR_0420315_p2 = new ReportBR_0420315_P2(LocalDate.now(), -//// LocalDate.now(), -//// "BR", -//// "contractorQty", -//// "liabilitiesAmount"); -//// log.info("ReportBR_0420315_P2:\n{}\n", xStream.toXML(reportBR_0420315_p2)); -// -// -// -// /* ========= БТ 17.2 ========== */ -// ReportBR_0420317 reportBR_0420317 = new ReportBR_0420317(LocalDate.now(), LocalDate.now()); -// ReportBR_0420317.Info_0420317 info_0420317 = new ReportBR_0420317.Info_0420317("companyClearingCode", -// "relationSupplierId", -// "relationServiceId", -// "relationServiceStatus", -// "relationUpdatedAt", -// "companyFullName", -// "companySymbolCode", -// "companyInfoCountryCode", -// "relationComment"); -// reportBR_0420317.getRows().add(info_0420317); -// log.info("ReportBR_0420317:\n{}\n", xStream.toXML(reportBR_0420317)); -// -// -// -// /* ========= БТ 17.3 ========== */ -// ReportBR_0420318 reportBR_0420318 = new ReportBR_0420318(LocalDate.now(), LocalDate.now()); -// ReportBR_0420318.Info_0420318 info_0420318 = new ReportBR_0420318.Info_0420318( -// "liabilitiesClaimsAssetsFullName", -// "companySymbolsCode", -// "liabilitiesClaimsAssetsCountryCode", -// "liabilitiesClaimsAssetsSettlementDate", -// "liabilitiesClaimsAssetsAccountType", -// "liabilitiesClaimsAssetsContract", -// "liabilitiesClaimsMoneyCurrencyCode", -// "liabilitiesAmountAmount", -// "liabilitiesClaimsMoneyName", -// "liabilitiesClaimsAssetsLiabilities", -// "liabilitiesClaimsAssetsComment", -// "companySymbolValue", -// "liabilitiesClaimsAssetsFullNames"); -// reportBR_0420318.getRows().add(info_0420318); -// log.info("ReportBR_0420318:\n{}\n", xStream.toXML(reportBR_0420318)); -// -// -// -// /* ========= БТ 17.4 ========== */ -// ReportBR_0420314_P1 reportBR_0420314P1 = new ReportBR_0420314_P1(LocalDate.now(), LocalDate.now(), "clearingStatus", "BR"); -// ReportBR_0420314_P1.Info_0420314_P1 info_0420314P1 = new ReportBR_0420314_P1.Info_0420314_P1("companyClearingCode", -// "paymentInstructionSenderId", -// "profileDocumentId", -// "companyFullName", -// "companySymbolCode", -// "companySymbolValue", -// "clearingMemberCategoryClearingMemberCategory", -//// LocalDate.of(2022,11,10), -// "liabilitiesClaimsAssetsLiabilitiesQuantity" -// ); -// reportBR_0420314P1.getRows().add(info_0420314P1); -// log.info("ReportBR_0420314_P1:\n{}\n", xStream.toXML(reportBR_0420314P1)); -// -// -// -// 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", -// "profileDocumentId", -// "accountBalanceOpenBalanceAmt", -// "paymentInstructionCreditLegAmount", -// "paymentInstructionDebitLegAmount", -// "accountBalanceCloseBalanceAmount" -// ); -// reportBR_0420314P2.getRows().add(info_0420314P2); -// log.info("ReportBR_0420314_P2:\n{}\n", xStream.toXML(reportBR_0420314P2)); -// -// -//// -//// /* ========= БТ 17.5 ========== */ -//// ReportBR_0420312_P1 reportBR_0420312P1 = new ReportBR_0420312_P1(LocalDate.now(), -//// LocalDate.now(), -//// "companyClearingCode", -//// "BR", -//// "liabilitesClaimsAssetsCompanyId", -//// "liabilitesClaimsAssetsFullName", -//// "companySymbolCode", -//// "companySymbolValue", -//// "companyInfoCountryCode", -//// "clearingMemberCategory"); -//// log.info("ReportBR_0420312_P1:\n{}\n", xStream.toXML(reportBR_0420312P1)); -//// -//// ReportBR_0420312_P2 reportBR_0420312P2 = new ReportBR_0420312_P2(LocalDate.now(), -//// LocalDate.now(), -//// "BR", -//// "liabilitiesClaimsAssetsCompanyId", -//// "liabilitiesClaimsAssetsLiabilities"); -//// log.info("ReportBR_0420312_P2:\n{}\n", xStream.toXML(reportBR_0420312P2)); -//// -//// ReportBR_0420312_P3 reportBR_0420312P3 = new ReportBR_0420312_P3(LocalDate.now(), -//// LocalDate.now(), -//// "BR", -//// "liabilitiesClaimsAssetsCompanyId", -//// "liabilitiesClaimsAssetsLiabilities"); -//// log.info("ReportBR_0420312_P3:\n{}\n", xStream.toXML(reportBR_0420312P3)); -//// -//// ReportBR_0420312_P4 reportBR_0420312P4 = new ReportBR_0420312_P4(LocalDate.now(), -//// LocalDate.now(), -//// "BR", -//// "liabilitiesAmount"); -//// log.info("ReportBR_0420312_P4:\n{}\n", xStream.toXML(reportBR_0420312P4)); -//// -//// ReportBR_0420312_P5 reportBR_0420312P5 = new ReportBR_0420312_P5(LocalDate.now(), -//// LocalDate.now(), -//// "BR", -//// "liabilitiesAmount"); -//// log.info("ReportBR_0420312_P5:\n{}\n", xStream.toXML(reportBR_0420312P5)); -//// -//// ReportBR_0420312_P6 reportBR_0420312P6 = new ReportBR_0420312_P6(LocalDate.now(), -//// LocalDate.now(), -//// "BR", -//// "liabilitiesAmount"); -//// log.info("ReportBR_0420312_P6:\n{}\n", xStream.toXML(reportBR_0420312P6)); -//// -//// ReportBR_0420312_P7 reportBR_0420312P7 = new ReportBR_0420312_P7(LocalDate.now(), -//// LocalDate.now(), -//// "BR", -//// "liabilitiesAmount"); -//// log.info("ReportBR_0420312_P7:\n{}\n", xStream.toXML(reportBR_0420312P7)); -//// -//// ReportBR_0420312_P8 reportBR_0420312P8 = new ReportBR_0420312_P8(LocalDate.now(), -//// LocalDate.now(), -//// "BR", -//// "currencyId", -//// "liabilitiesClaimsAssetsCompanyId", -//// "liabilitiesClaimsAssetsFullName", -//// "companySymbolCode", -//// "companySymbolValue", -//// "companyInfoCountryCode", -//// "clearingMemberCategory"); -//// log.info("ReportBR_0420312_P8:\n{}\n", xStream.toXML(reportBR_0420312P8)); -//// -//// ReportBR_0420312_P9 reportBR_0420312P9 = new ReportBR_0420312_P9(LocalDate.now(), -//// LocalDate.now(), -//// "BR", -//// "currencyId", -//// "liabilitiesClaimsAssetsCompanyId", -//// "liabilitiesClaimsMoneyCurrencyCode", -//// "liabilitiesClaimsAssetsLiabilities"); -//// log.info("ReportBR_0420312_P9:\n{}\n", xStream.toXML(reportBR_0420312P9)); -//// -//// ReportBR_0420312_P10 reportBR_0420312P10 = new ReportBR_0420312_P10(LocalDate.now(), -//// LocalDate.now(), -//// "BR", -//// "liabilitiesAmount"); -//// log.info("ReportBR_0420312_P10:\n{}\n", xStream.toXML(reportBR_0420312P10)); -//// -// -// -// /* ========= БТ 12.2 ========== */ -//// ReportPA_BT2_IV reportPA_bt2_iv = new ReportPA_BT2_IV(LocalDate.now(), -//// LocalDate.now(), -//// "clearingMemberCategory", -//// "liabilitiesClaimsAssetsFullName", -//// "companyClearingCode", -//// "liabilitiesClaimsAssetsSettlementDate", -//// "liabilitiesClaimsAssetsRefundDate", -//// "liabilitiesClaimsAssetsTradingDate", -//// "liabilitiesClaimsAssetsContract", -//// "liabilitiesClaimsAssetsLiabilitiesQuantity", -//// "chargeCommission", -//// "liabilitiesClaimsAssetsClaimsQuantity", -//// "liabilitiesClaimsAssetsRefundPaymentId", -//// "liabilitiesClaimsAssetsClearingStatus", -//// "liabilitiesClaimsAssetsComment", -//// "claimsAmount", -//// "liabilitiesAmount", -//// "paymentAmount"); -//// log.info("ReportPA_BT2_IV:\n{}\n", xStream.toXML(reportPA_bt2_iv)); -// -//// ReportPA_BT2_B reportPA_bt2_b = new ReportPA_BT2_B(LocalDate.now(), -//// LocalDate.now(), -//// "clearingMemberCategory", -//// "liabilitiesClaimsAssetsFullName", -//// "companyClearingCode", -//// "liabilitiesClaimsAssetsSettlementDate", -//// "liabilitiesClaimsAssetsRefundDate", -//// "liabilitiesClaimsAssetsTradingDate", -//// "liabilitiesClaimsAssetsContract", -//// "liabilitiesClaimsAssetsLiabilitiesQuantity", -//// "chargeCommission", -//// "liabilitiesClaimsAssetsClaimsQuantity", -//// "liabilitiesClaimsAssetsRefundPaymentId", -//// "liabilitiesClaimsAssetsClearingStatus", -//// "liabilitiesClaimsAssetsComment", -//// "claimsAmount", -//// "liabilitiesAmount", -//// "paymentAmount"); -//// log.info("ReportPA_BT2_B:\n{}\n", xStream.toXML(reportPA_bt2_b)); -// -// -// -// /* ========= БТ 13 ========== */ -//// ReportDOCIN report_bt13_11 = new ReportDOCIN(LocalDate.now(), -//// LocalTime.now(), -//// "inDocumentJournalRegistrationDate", -//// "inDocumentJournalRegistrationTime", -//// "inDocumentJournalRegistrationNumber", -//// "inDocumentJournalDocumentName" , -//// "inDocumentJournalSender", -//// "inDocumentJournalQuality", -//// "inDocumentJournalClearingCode", -//// "inDocumentJournalCourierType", -//// "inDocumentJournalEmailDate", -//// "inDocumentJournalAmount", -//// "inDocumentJournalDossierNumber", -//// "inDocumentJournalComment", -//// "inDocumentJournalReceiptDate"); -//// log.info("Report_BT13_11:\n{}\n", xStream.toXML(report_bt13_11)); -// -// Report_BT13_12 report_bt13_12 = new Report_BT13_12(LocalDate.now(), -// LocalTime.now(), -// "outDocumentJournalRegistrationDate", -// "outDocumentJournalRegistrationTime", -// "outDocumentJournalRegistrationNumber", -// "outDocumentJournalDocumentName" , -// "outDocumentJournalAddress", -// "outDocumentJournalQuality", -// "outDocumentJournalClearingCode", -// "outDocumentJournalCourierType", -// "outDocumentJournalEmailDate", -// "outDocumentJournalAmount", -// "outDocumentJournalDossierNumber", -// "outDocumentJournalPostDate"); -// log.info("Report_BT13_12:\n{}\n", xStream.toXML(report_bt13_12)); -// -// -// -// /* ========= БТ 16.5 ========== */ -// Report_BT16_5 report_bt16_5 = new Report_BT16_5(LocalDate.now(), -// LocalTime.now(), -// "clearingHouse", -// "companyClearingCode", -// "companyFullName", -// "accountBalanceAccount", -// "accountBalanceOpenAmount", -// "accountBalanceDebitAmount", -// "accountBalanceCreditAmount", -// "accountBalanceCloseAmount"); -// log.info("Report_BT16_5:\n{}\n", xStream.toXML(report_bt16_5)); -// -// -// -// } -//} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsServiceCommand.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsServiceCommand.java deleted file mode 100644 index a9244df38..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportsServiceCommand.java +++ /dev/null @@ -1,270 +0,0 @@ -package ru.spcex.clearing.reports.services; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.lang.Nullable; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.misc.Session; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithPeriod; -import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionId; -import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestWithSessionIdList; -import ru.spcex.clearing.reports.config.ReportBuildersConfig; -import ru.spcex.clearing.reports.config.element.ReportsServiceSettings; -import ru.spcex.clearing.reports.reports.*; -import ru.spcex.clearing.reports.services.builders.XMLReportBuilder; -import ru.spcex.platform.enumeration.ReportType; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.IEnumKey; -import ru.spcex.platform.utils.log.ExceptionUtils; - -import java.io.File; -import java.io.IOException; -import java.time.LocalDate; -import java.util.*; - -/** - * Исполняет создание отчётов. - * - * @see QCommandExecutor - */ -@Service -public class ReportsServiceCommand implements InitializingBean { - public static final String QUEUE_RUN_REPORT_COMMAND = "GREP"; // см. Task.createReport - public static final String QUEUE_RUN_DAILY_REPORT_COMMAND = QUEUE_RUN_REPORT_COMMAND; // дневные тоже по команде GREP запускать с остальными. - - private final Logger log = LoggerFactory.getLogger(getClass()); - - protected ReportsServiceSettings settings; - protected ImdgProvider imdg; - - @Deprecated - protected List allPeriodReports; // Spring services - @Deprecated - protected List allSimpleReports; - @Deprecated - private final Map collectorForReportById; - - // new format report: - ReportService newReportService; // by ReportBuildersConfig - Map>> reportBuildersWithoutParams; - Map>> reportBuildersWithSessionIdParam; - Map>> reportBuildersWithSessionIdListParam; - Map>> reportBuildersWithPeriodParams; - - - @Autowired - public ReportsServiceCommand(ImdgProvider imdg, - List allPeriodReports, - List allSimpleReports, - @Qualifier("reportBuildersWithoutParams") Map>> reportBuildersWithoutParams, - @Qualifier("reportBuildersWithSessionIdParam") Map>> reportBuildersWithSessionIdParam, - @Qualifier("reportBuildersWithSessionIdListParam") Map>> reportBuildersWithSessionIdListParam, - @Qualifier("reportBuildersWithPeriodParams") Map>> reportBuildersWithPeriodParams, - - ReportService reportService, - ReportsServiceSettings settings) { - this.imdg = imdg; - this.settings = settings; - - this.newReportService = reportService; - this.reportBuildersWithoutParams = reportBuildersWithoutParams; - this.reportBuildersWithSessionIdParam = reportBuildersWithSessionIdParam; - this.reportBuildersWithSessionIdListParam = reportBuildersWithSessionIdListParam; - this.reportBuildersWithPeriodParams = reportBuildersWithPeriodParams; - - this.allSimpleReports = allSimpleReports; - this.allPeriodReports = allPeriodReports; // allReports = context.getBeansOfType(ReportDataCollector.class); - this.collectorForReportById = new HashMap<>(); - for (ReportWithPeriodCollector collector : allPeriodReports) { - ReportId rId = collector.getReportId(); - collectorForReportById.put(rId, collector); - String idStr = rId == null ? null : rId.getKey(); - log.info("Register collector service {} (period report id \"{}\")for generate {}", collector, idStr, collector.getReportClass().getSimpleName()); - } - assert allPeriodReports.size() == collectorForReportById.size(); - for (SimpleReportCollector collector : allSimpleReports) { - ReportId rId = collector.getReportId(); - collectorForReportById.put(rId, collector); - String idStr = rId == null ? null : rId.getKey(); - log.info("Register collector service {} (simple report id \"{}\")for generate {}", collector, idStr, collector.getReportClass().getSimpleName()); - } - - } - - @Override - public void afterPropertiesSet() { - log.info("Wait IMDG..."); - imdg.waitAvailable(); - log.info("Report generator ready."); - } - - public void generateReportAll(@Nullable String reportGroup, LocalDate startDate, LocalDate endDate) throws IOException { - // new reports: - { - HashSet reported=new HashSet<>(); - for (ReportType rType : reportBuildersWithoutParams.keySet()) { - if (reported.contains(rType)) continue; - reported.add(rType); - log.info("Make report {}", rType); - try { - BaseRequest request = new BaseRequest<>(); - request.setRequestPayload(new ReportRequest()); - request.getRequestPayload().setReportId(rType.getKey()); - newReportService.createReport(request); - } catch (Exception e) { - log.error("Error make report {}: {}", rType, ExceptionUtils.getStackTrace(e)); - } - } - Imdg sessionImdg = imdg.getImdg(IMDGDistributedNames.Map_Session, Session.class); - Long sessionId = sessionImdg.aggregateLongMax("id", sessionImdg.predicateBuilder().greatEqual("id", 0L)); // max, always true - log.info("For all report sessionId={}", sessionId); - for (ReportType rType : reportBuildersWithSessionIdParam.keySet()) { - if (reported.contains(rType)) continue; - reported.add(rType); - log.info("Make report {}, session {}", rType, sessionId); - try { - BaseRequest request = new BaseRequest<>(); - request.setRequestPayload(new ReportRequestWithSessionId()); - request.getRequestPayload().setReportId(rType.getKey()); - request.getRequestPayload().setSessionId(sessionId); - newReportService.createReportForSessionId(request); - } catch (Exception e) { - log.error("Error make report {}: {}", rType, ExceptionUtils.getStackTrace(e)); - } - } - for (ReportType rType : reportBuildersWithSessionIdListParam.keySet()) { - if (reported.contains(rType)) continue; - reported.add(rType); - log.info("Make report {}, sessions {}", rType, sessionId); - try { - BaseRequest request = new BaseRequest<>(); - request.setRequestPayload(new ReportRequestWithSessionIdList()); - request.getRequestPayload().setReportId(rType.getKey()); - request.getRequestPayload().setSessionIdList(Arrays.asList(sessionId)); - newReportService.createReportForSessionIdList(request); - } catch (Exception e) { - log.error("Error make report {}: {}", rType, ExceptionUtils.getStackTrace(e)); - } - } - for (ReportType rType : reportBuildersWithPeriodParams.keySet()) { - if (reported.contains(rType)) continue; - reported.add(rType); - LocalDate d1=LocalDate.now().minusDays(1); - LocalDate d2=LocalDate.now().minusDays(1); - log.info("Make report {} period {} - {}", rType, d1, d2); - try { - BaseRequest request = new BaseRequest<>(); - request.setRequestPayload(new ReportRequestWithPeriod()); - request.getRequestPayload().setReportId(rType.getKey()); - request.getRequestPayload().setStartDate(d1); - request.getRequestPayload().setStartDate(d2); - newReportService.createReportForPeriod(request); - } catch (Exception e) { - log.error("Error make report {}: {}", rType, ExceptionUtils.getStackTrace(e)); - } - } - - } - - log.info(" Old format report..."); - // deprecated code: - for (ReportWithPeriodCollector reportDataCollector : allPeriodReports) { - if (reportGroup == null || QUEUE_RUN_REPORT_COMMAND.equals(reportGroup)) { - try { - makeSingleReport(reportDataCollector, startDate, endDate); - } catch (Exception e) { - log.error("Error generate report of type {}: {}", reportDataCollector, ExceptionUtils.getStackTrace(e)); - } - } - } - for (SimpleReportCollector reportDataCollector : allSimpleReports) { - if (reportGroup == null || QUEUE_RUN_DAILY_REPORT_COMMAND.equals(reportGroup)) { - try { - makeSingleReport(reportDataCollector); - } catch (Exception e) { - log.error("Error generate report of type {}: {}", reportDataCollector, ExceptionUtils.getStackTrace(e)); - } - } - } - } - - public void generateReportById(String reportIdStr, LocalDate startDate, LocalDate endDate) throws IOException { - ReportId reportId = parseReportId(reportIdStr); - AbstractReportCollector reportDataCollector = collectorForReportById.get(reportId); - if (reportDataCollector == null) - throw new IllegalStateException("Collector for ReportID " + reportId + " not implemented yet"); - - if (reportDataCollector instanceof ReportWithPeriodCollector) { - makeSingleReport((ReportWithPeriodCollector) reportDataCollector, startDate, endDate); - } else if (reportDataCollector instanceof SimpleReportCollector) { - makeSingleReport((SimpleReportCollector) reportDataCollector); - } else { - throw new IllegalArgumentException("Uncknown report class: " + reportDataCollector.getClass().getName()); - } - } - - - ReportId parseReportId(String reportStr) { - ReportId id = IEnumKey.getEnumByKey(ReportId.class, reportStr); - if (id == null) { - log.trace("Can not find ReportId by name: {}", reportStr); - id = ReportId.valueOf(reportStr); - } - return id; - } - - protected void makeSingleReport(ReportWithPeriodCollector reportDataCollector, LocalDate startDate, LocalDate endDate) throws IOException { - log.debug("Generate report by collector {} - {}", reportDataCollector.getClass().getSimpleName(), reportDataCollector.getReportClass().getSimpleName()); - File outPath = new File(settings.getReportModuleOut()); - XMLReportBuilder reportBuilder = new XMLReportBuilder(reportDataCollector.getReportClass(), outPath); - AbstractReport report = reportDataCollector.collectReportWithPeriod(startDate, endDate); - if (report == null) { - throw new NullPointerException("reportDataCollector " + reportDataCollector + " return null"); - } - File reportFile = reportBuilder.createReport(report); - if (reportFile != null) { - log.debug("New report file done: \"{}\"", reportFile); - } - } - - protected void makeSingleReport(SimpleReportCollector reportDataCollector) throws IOException { - log.debug("Generate report by collector {} - {}", reportDataCollector.getClass().getSimpleName(), reportDataCollector.getReportClass().getSimpleName()); - File outPath = new File(settings.getReportModuleOut()); - XMLReportBuilder reportBuilder = new XMLReportBuilder(reportDataCollector.getReportClass(), outPath); - AbstractReport report = reportDataCollector.collectReport(); - File reportFile = reportBuilder.createReport(report); - if (reportFile != null) { - log.debug("New report file done: \"{}\"", reportFile); - } - } - - - public void writeAllXML() throws IOException { - log.info("Report types with data range: {}", allPeriodReports); - for (ReportWithPeriodCollector collector : allPeriodReports) { - log.info("Make report {}", collector); - LocalDate date2 = LocalDate.now(); - LocalDate date1 = LocalDate.of(date2.getYear(), date2.getMonth(), 1);//date2.minusMonths(1); - makeSingleReport(collector, date1, date2); - } - log.info("Report types: {}", allSimpleReports); - for (SimpleReportCollector collector : allSimpleReports) { - log.info("Make report {}", collector); - LocalDate date2 = LocalDate.now(); - makeSingleReport(collector); - } - log.info("All done"); - } - - public void writeAllDocx() { - log.info("TODO write docx"); // todo write docx - } - -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/SimpleReportCollector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/SimpleReportCollector.java deleted file mode 100644 index c25db9cd2..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/SimpleReportCollector.java +++ /dev/null @@ -1,11 +0,0 @@ -package ru.spcex.clearing.reports.services; - -import ru.spcex.clearing.reports.reports.AbstractReport; - -@Deprecated -public abstract class SimpleReportCollector extends AbstractReportCollector { - /** - * Подготовка отчета (без входных параметров) - */ - abstract public T collectReport(); -} 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 deleted file mode 100644 index 04e9c6e79..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java +++ /dev/null @@ -1,22 +0,0 @@ -package ru.spcex.clearing.reports.services.builders; - -import ru.spcex.clearing.reports.reports.AbstractReport; - -import java.io.File; -import java.io.IOException; - -@Deprecated -public abstract class FileReportBuilder { - protected final Class reportClass; - - protected FileReportBuilder(Class reportClass) { - this.reportClass = reportClass; - } - - protected String makeFileName(String reportName, String extension) { - 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 deleted file mode 100644 index baafed9b4..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java +++ /dev/null @@ -1,46 +0,0 @@ -package ru.spcex.clearing.reports.services.builders; - -import com.thoughtworks.xstream.XStream; -import com.thoughtworks.xstream.io.naming.NoNameCoder; -import com.thoughtworks.xstream.io.xml.XppDriver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import ru.spcex.clearing.reports.reports.AbstractReport; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.time.LocalDateTime; - -@Deprecated -public class XMLReportBuilder extends FileReportBuilder { - private final Logger log = LoggerFactory.getLogger(getClass()); - protected final XStream xStream; - protected final File outFolder; - - public XMLReportBuilder(Class reportClass, File outFolder) { - super(reportClass); - this.xStream = new XStream(new XppDriver(new NoNameCoder())); - xStream.processAnnotations(reportClass); - this.outFolder = outFolder; - } - - @Override - public File createReport(AbstractReport report) throws IOException { - String reportName = report.getReportName(LocalDateTime.now()); - String reportFileName = makeFileName(reportName, ".xml"); - - File reportFile = new File(outFolder, reportFileName); - if (reportFile.exists()) { - if (reportFile.isFile()) { - log.warn("Файл {} существует и будет перезаписан", reportFileName); - boolean deleteOk = reportFile.delete(); - if (!deleteOk) throw new IOException("Не удалось удалить файл " + reportFileName); - } else throw new IOException(reportFileName + " существует, но не является файлом"); - } - try (FileOutputStream fos = new FileOutputStream(reportFile)) { - xStream.toXML(report, fos); - } - return reportFile; - } -} 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 deleted file mode 100644 index 621868c9b..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/MapUtil.java +++ /dev/null @@ -1,55 +0,0 @@ -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) { - K key = indexFieldExtractor.apply(obj); - V exist = index.put(key, obj); - if (exist != null) { - throw new IllegalStateException(String.format("%s with id=%s,%s has duplicate key=\"%s\"", - exist.getClass().getSimpleName(), exist.getId(), obj.getId(), key - )); - } - } - return index; - } - - public static Map> indexList(Collection from, Function indexFieldExtractor) { - Map> index = new HashMap<>(); - for (V obj : from) { - K key = indexFieldExtractor.apply(obj); - List lst = index.computeIfAbsent(key, (_key_) -> new ArrayList<>()); - lst.add(obj); - } - 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/bt/bt_12_2/ReportPA_B_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_12_2/ReportPA_B_Collector.java deleted file mode 100644 index 89d132aaf..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_12_2/ReportPA_B_Collector.java +++ /dev/null @@ -1,105 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_12_2; - -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.company.ClearingMemberCategory; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_12_2.ReportPA_B; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.platform.enumeration.ClearingCategory; -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.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -@Component -@Deprecated -public class ReportPA_B_Collector extends ReportWithPeriodCollector { - private final Imdg liabilitiesClaimsAssetsImdg; - private final Imdg clearingMemberCategoryImdg; - - public ReportPA_B_Collector(ImdgProvider imdgProvider) { - liabilitiesClaimsAssetsImdg = imdgProvider.getImdg( - IMDGDistributedNames.Map_LiabilitiesClaimsAssets, - LiabilitiesClaimsAssets.class - ); - clearingMemberCategoryImdg = imdgProvider.getImdg( - IMDGDistributedNames.Map_ClearingMemberCategory, - ClearingMemberCategory.class - ); - } - - @Override - public ReportPA_B collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - validateDateRange(startDate, endDate); - - Collection clearingMemberCategories = - clearingMemberCategoryImdg.getCollectionObjectsByFieldValues(Map.of( - "clearingMemberCategory", ClearingCategory.B.getKey() - )); - Set companyIds = clearingMemberCategories.stream() - .map(ClearingMemberCategory::getCompanyId) - .collect(Collectors.toSet()); - - ImdgPredicateBuilder builder = liabilitiesClaimsAssetsImdg.predicateBuilder(); - ImdgPredicate refundDatePredicate = builder.and( - builder.greatEqual("refundDate", (startDate)), - builder.lessEqual("refundDate", (endDate)) - ); - ImdgPredicate companyIdPredicates = builder.in("companyId", companyIds.toArray(new Comparable[0])); - ImdgPredicate finalPredicate = builder.and(refundDatePredicate, companyIdPredicates); - - Collection liabilitiesClaimsAssets = - liabilitiesClaimsAssetsImdg.getCollectionObjectsByPredicate(finalPredicate); - - ReportPA_B report = new ReportPA_B(startDate, endDate); - BigDecimal claimsAmount = BigDecimal.ZERO; - BigDecimal liabilitiesAmount = BigDecimal.ZERO; - BigDecimal paymentAmount = BigDecimal.ZERO; - for (LiabilitiesClaimsAssets liabilitiesClaimsAsset : liabilitiesClaimsAssets) { - ReportPA_B.Info_PA_B infoPAB = new ReportPA_B.Info_PA_B( - toString(liabilitiesClaimsAsset.getId()), - toString(liabilitiesClaimsAsset.getFullName()), - toString(liabilitiesClaimsAsset.getClearingCode()), - toString(liabilitiesClaimsAsset.getSettlementDate()), - toString(liabilitiesClaimsAsset.getRefundDate()), - toString(liabilitiesClaimsAsset.getTradingDate()), - toString(liabilitiesClaimsAsset.getContract()), - toString(liabilitiesClaimsAsset.getLiabilitiesQuantity()), - "", - toString(liabilitiesClaimsAsset.getClaimsQuantity()), - toString(liabilitiesClaimsAsset.getRefundPaymentId()), - toString(liabilitiesClaimsAsset.getClearingStatus()), - toString(liabilitiesClaimsAsset.getComment()) - ); - report.getRows().add(infoPAB); - if (liabilitiesClaimsAsset.getClaimsQuantity() != null) { - claimsAmount = claimsAmount.add(liabilitiesClaimsAsset.getClaimsQuantity()); - paymentAmount = paymentAmount.add(liabilitiesClaimsAsset.getClaimsQuantity()); - } - if (liabilitiesClaimsAsset.getLiabilitiesQuantity() != null) { - liabilitiesAmount = liabilitiesAmount.add(liabilitiesClaimsAsset.getLiabilitiesQuantity()); - paymentAmount = paymentAmount.add(liabilitiesClaimsAsset.getLiabilitiesQuantity().negate()); - } - } - ReportPA_B.Total total = new ReportPA_B.Total( - toString(claimsAmount), - toString(liabilitiesAmount), - toString(paymentAmount)); - report.setTotal(total); - - return report; - } - - @Override - public Class getReportClass() { - return ReportPA_B.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_12_2/ReportPA_IV_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_12_2/ReportPA_IV_Collector.java deleted file mode 100644 index b14a4978e..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_12_2/ReportPA_IV_Collector.java +++ /dev/null @@ -1,109 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_12_2; - -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.company.ClearingMemberCategory; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.clearing.platform.dictionary.ClearingStatusDictionary; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_12_2.ReportPA_IV; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.platform.enumeration.ClearingCategory; -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.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; -import java.util.Set; -import java.util.stream.Collectors; - -@Component -@Deprecated -public class ReportPA_IV_Collector extends ReportWithPeriodCollector { - private final Imdg liabilitiesClaimsAssetsImdg; - private final Imdg clearingStatusDictionaryImdg; - private final Imdg clearingMemberCategoryImdg; - - public ReportPA_IV_Collector(ImdgProvider imdgProvider) { - liabilitiesClaimsAssetsImdg = imdgProvider.getImdg( - IMDGDistributedNames.Map_LiabilitiesClaimsAssets, - LiabilitiesClaimsAssets.class - ); - clearingStatusDictionaryImdg = imdgProvider.getImdg( - IMDGDistributedNames.Map_ClearingStatusDictionary, - ClearingStatusDictionary.class - ); - clearingMemberCategoryImdg = imdgProvider.getImdg( - IMDGDistributedNames.Map_ClearingMemberCategory, - ClearingMemberCategory.class - ); - } - - @Override - public ReportPA_IV collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - validateDateRange(startDate, endDate); - - String clearingMemberCategorySql = "clearingMemberCategory='%s' or clearingMemberCategory='%s'".formatted( - ClearingCategory.I.getKey(), ClearingCategory.V.getKey() - ); - Collection clearingMemberCategories = - clearingMemberCategoryImdg.getCollectionObjectsBySQL(clearingMemberCategorySql); - Set companyIds = clearingMemberCategories.stream() - .map(ClearingMemberCategory::getCompanyId) - .collect(Collectors.toSet()); - - ImdgPredicateBuilder builder = liabilitiesClaimsAssetsImdg.predicateBuilder(); - ImdgPredicate refundDatePredicate = builder.and( - builder.greatEqual("refundDate", (startDate)), - builder.lessEqual("refundDate", (endDate)) - ); - ImdgPredicate companyIdPredicates = builder.in("companyId", companyIds.toArray(new Comparable[0])); - ImdgPredicate finalPredicate = builder.and(refundDatePredicate, companyIdPredicates); - Collection liabilitiesClaimsAssets = - liabilitiesClaimsAssetsImdg.getCollectionObjectsByPredicate(finalPredicate); - - ReportPA_IV report = new ReportPA_IV(startDate, endDate); - BigDecimal claimsAmount = BigDecimal.ZERO; - BigDecimal liabilitiesAmount = BigDecimal.ZERO; - BigDecimal paymentAmount = BigDecimal.ZERO; - for (LiabilitiesClaimsAssets liabilitiesClaimsAsset : liabilitiesClaimsAssets) { - ReportPA_IV.Info_PA_IV row = new ReportPA_IV.Info_PA_IV( - toString(liabilitiesClaimsAsset.getId()), - toString(liabilitiesClaimsAsset.getFullName()), - toString(liabilitiesClaimsAsset.getClearingCode()), - toString(liabilitiesClaimsAsset.getSettlementDate()), - toString(liabilitiesClaimsAsset.getRefundDate()), - toString(liabilitiesClaimsAsset.getTradingDate()), - toString(liabilitiesClaimsAsset.getContract()), - toString(liabilitiesClaimsAsset.getLiabilitiesQuantity()), - "", - toString(liabilitiesClaimsAsset.getClaimsQuantity()), - toString(liabilitiesClaimsAsset.getRefundPaymentId()), - toString(liabilitiesClaimsAsset.getClearingStatus()), - toString(liabilitiesClaimsAsset.getComment())); - report.getRows().add(row); - if (liabilitiesClaimsAsset.getClaimsQuantity() != null) { - claimsAmount = claimsAmount.add(liabilitiesClaimsAsset.getClaimsQuantity()); - paymentAmount = paymentAmount.add(liabilitiesClaimsAsset.getClaimsQuantity()); - } - if (liabilitiesClaimsAsset.getLiabilitiesQuantity() != null) { - liabilitiesAmount = liabilitiesAmount.add(liabilitiesClaimsAsset.getLiabilitiesQuantity()); - paymentAmount = paymentAmount.add(liabilitiesClaimsAsset.getLiabilitiesQuantity().negate()); - } - } - ReportPA_IV.Total total = new ReportPA_IV.Total( - toString(claimsAmount), - toString(liabilitiesAmount), - toString(paymentAmount)); - report.setTotal(total); - - return report; - } - - @Override - public Class getReportClass() { - return ReportPA_IV.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_13/ReportDOCIN_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_13/ReportDOCIN_Collector.java deleted file mode 100644 index 4376a8adf..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_13/ReportDOCIN_Collector.java +++ /dev/null @@ -1,66 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_13; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.journal.InDocumentJournal; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_13.ReportDOCIN; -import ru.spcex.clearing.reports.services.SimpleReportCollector; -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.LocalDate; -import java.time.LocalTime; -import java.util.Collection; - -@Component -@Deprecated -public class ReportDOCIN_Collector extends SimpleReportCollector { - protected final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg inDocumentJournalImdg; - - public ReportDOCIN_Collector(ImdgProvider imdgProvider) { - this.inDocumentJournalImdg = imdgProvider.getImdg( - IMDGDistributedNames.Map_InDocumentJournal, - InDocumentJournal.class - ); - } - - @Override - public ReportDOCIN collectReport() { - LocalDate currentDate = LocalDate.now(); - ImdgPredicateBuilder pb = inDocumentJournalImdg.predicateBuilder(); - ImdgPredicate p = pb.equals("registrationDate", currentDate); - Collection inDocumentsJournal = inDocumentJournalImdg.getCollectionObjectsByPredicate(p); - ReportDOCIN reportDOCIN = new ReportDOCIN(LocalDate.now(), LocalTime.now()); - for (InDocumentJournal inDocumentJournal : inDocumentsJournal) { - ReportDOCIN.Info_DOCIN infoDOCIN = new ReportDOCIN.Info_DOCIN( - toString(inDocumentJournal.getId()), - toString(inDocumentJournal.getRegistrationDate()), - toString(inDocumentJournal.getRegistrationTime()), - toString(inDocumentJournal.getRegistrationNumber()), - toString(inDocumentJournal.getDocumentName()), - toString(inDocumentJournal.getSender()), - toString(inDocumentJournal.getQuantity()), - toString(inDocumentJournal.getClearingCode()), - toString(inDocumentJournal.getCourierType()), - toString(inDocumentJournal.getEmailDate()), - toString(inDocumentJournal.getAmount()), - toString(inDocumentJournal.getDossierNumber()), - toString(inDocumentJournal.getComment()), - toString(inDocumentJournal.getReceiptDate())); - reportDOCIN.getRows().add(infoDOCIN); - } - return reportDOCIN; - } - - @Override - public Class getReportClass() { - return ReportDOCIN.class; - } - -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_13/ReportDOCOUT_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_13/ReportDOCOUT_Collector.java deleted file mode 100644 index 3e613a82d..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_13/ReportDOCOUT_Collector.java +++ /dev/null @@ -1,65 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_13; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.journal.OutDocumentJournal; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_13.ReportDOCOUT; -import ru.spcex.clearing.reports.services.SimpleReportCollector; -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.LocalDate; -import java.time.LocalTime; -import java.util.Collection; - -@Component -@Deprecated -public class ReportDOCOUT_Collector extends SimpleReportCollector { - protected final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg inDocumentJournalImdg; - - public ReportDOCOUT_Collector(ImdgProvider imdgProvider) { - this.inDocumentJournalImdg = imdgProvider.getImdg( - IMDGDistributedNames.Map_OutDocumentJournal, - OutDocumentJournal.class - ); - } - - @Override - public ReportDOCOUT collectReport() { - LocalDate currentDate = LocalDate.now(); - ImdgPredicateBuilder pb = inDocumentJournalImdg.predicateBuilder(); - ImdgPredicate p = pb.equals("registrationDate", currentDate); - Collection outDocumentsJournal = inDocumentJournalImdg.getCollectionObjectsByPredicate(p); - ReportDOCOUT reportDOCOUT = new ReportDOCOUT(LocalDate.now(), LocalTime.now()); - for (OutDocumentJournal outDocumentJournal : outDocumentsJournal) { - ReportDOCOUT.Info_DOCOUT infoDOCOUT = new ReportDOCOUT.Info_DOCOUT( - toString(outDocumentJournal.getId()), - toString(outDocumentJournal.getRegistrationDate()), - toString(outDocumentJournal.getRegistrationTime()), - toString(outDocumentJournal.getRegistrationNumber()), - toString(outDocumentJournal.getDocumentName()), - toString(outDocumentJournal.getAddressee()), - toString(outDocumentJournal.getQuantity()), - toString(outDocumentJournal.getClearingCode()), - toString(outDocumentJournal.getCourierType()), - toString(outDocumentJournal.getEmailDate()), - toString(outDocumentJournal.getAmount()), - toString(outDocumentJournal.getDossierNumber()), - toString(outDocumentJournal.getPostDate())); - reportDOCOUT.getRows().add(infoDOCOUT); - } - return reportDOCOUT; - } - - @Override - public Class getReportClass() { - return ReportDOCOUT.class; - } - -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_16_5/ReportINACCNT_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_16_5/ReportINACCNT_Collector.java deleted file mode 100644 index ef8f26a24..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_16_5/ReportINACCNT_Collector.java +++ /dev/null @@ -1,78 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_16_5; - -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.account.AccountBalance; -import ru.clearing.classes.statics.data.company.Company; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_16_5.ReportINACCNT; -import ru.spcex.clearing.reports.services.ReportForClearingCodeCollector; -import ru.spcex.platform.enumeration.AccountType; -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.LocalDate; -import java.time.LocalTime; -import java.util.Collection; -import java.util.Set; -import java.util.stream.Collectors; - -@Component -@Deprecated -public class ReportINACCNT_Collector extends ReportForClearingCodeCollector { - private final Imdg accountBalanceImdg; - private final Imdg companyImdg; - - public ReportINACCNT_Collector(ImdgProvider imdgProvider) { - accountBalanceImdg = imdgProvider.getImdg( - IMDGDistributedNames.Map_AccountBalance, - AccountBalance.class - ); - companyImdg = imdgProvider.getImdg( - IMDGDistributedNames.Map_Company, - Company.class - ); - } - - @Override - public ReportINACCNT collectReportForClearingCode(String clearingCode) { - ImdgPredicateBuilder builder = companyImdg.predicateBuilder(); - - ImdgPredicate clearingCodePredicate = builder.equals("clearingCode", clearingCode); - Collection companies = companyImdg.getCollectionObjectsByPredicate(clearingCodePredicate); - Set companyIds = companies.stream() - .map(Company::getId) - .collect(Collectors.toSet()); - - ImdgPredicate accountTypePredicate = builder.or( - builder.equals("accountType", AccountType.Clrn.getKey()), - builder.equals("accountType", AccountType.Info.getKey()) - ); - ImdgPredicate companyIdPredicates = builder.in("companyId", companyIds.toArray(new Comparable[0])); - - ImdgPredicate finalPredicate = builder.and(accountTypePredicate, companyIdPredicates); - Collection accountBalances = accountBalanceImdg.getCollectionObjectsByPredicate(finalPredicate); - - ReportINACCNT reportINACCNT = new ReportINACCNT(clearingCode, LocalDate.now(), LocalTime.now()); - for (AccountBalance accountBalance : accountBalances) { - ReportINACCNT.Info_INACCNT infoReport = new ReportINACCNT.Info_INACCNT( - toString(accountBalance.getId()), - toString(accountBalance.getFullName()), - toString(clearingCode), - toString(accountBalance.getAccount()), - toString(accountBalance.getOpenBalanceAmount()), - toString(accountBalance.getDebitAmount()), - toString(accountBalance.getCreditAmount()), - toString(accountBalance.getCloseBalanceAmount())); - reportINACCNT.getRows().add(infoReport); - } - - return reportINACCNT; - } - - @Override - public Class getReportClass() { - return ReportINACCNT.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_1/ReportBR_0420315_P1_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_1/ReportBR_0420315_P1_Collector.java deleted file mode 100644 index 6acb0fb0b..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_1/ReportBR_0420315_P1_Collector.java +++ /dev/null @@ -1,125 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_1; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.company.ClearingMemberCategory; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.clearing.classes.statics.data.misc.Listing; -import ru.clearing.platform.dictionary.ClearingStatusDictionary; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_17_1.ReportBR_0420315_P1; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.clearing.reports.services.collector.MapUtil; -import ru.spcex.platform.enumeration.ClearingCategory; -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 java.math.BigDecimal; -import java.time.LocalDate; -import java.util.*; - -@Component -@Deprecated -public class ReportBR_0420315_P1_Collector extends ReportWithPeriodCollector { - protected static final List ALLOW_CLEARING_MEMBER_CATEGORY = Arrays.asList(ClearingCategory.I.getKey(), ClearingCategory.V.getKey()); - - private Imdg companyImdg; - private Imdg liabilitiesClaimsAssetsImdg; - private Imdg clearingMemberCategoryImdg; - private Imdg clearingStatusDictionaryImdg; - private Imdg

    listingImdg; - - @Autowired - public ReportBR_0420315_P1_Collector(ImdgProvider imdgProvider) { - companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); - clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); - clearingStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingStatusDictionary, ClearingStatusDictionary.class); - listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); - } - - /** - * @param onMarket Market.mkrs.getKey() - * @param securityId liability.getSecurityId() - * @return - */ - protected Listing findListing(Market onMarket, Long securityId) { - Map qParam = new HashMap<>(); - qParam.put("market", onMarket.getKey()); - qParam.put("securityId", securityId); - return listingImdg.getSingleObjectByFieldValues(qParam); - } - - @Override - public ReportBR_0420315_P1 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - validateDateRange(startDate, endDate); - ReportBR_0420315_P1 reportBR_0420315_p1 = new ReportBR_0420315_P1(startDate, endDate); - final Long allowClearingStatusId = MapUtil.getDictionaryIdByCode(clearingStatusDictionaryImdg, ClearingStatus.OK.getKey()); - - Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, startDate, endDate, allowClearingStatusId); - - 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) { - 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; - } - - HashSet onMarket = new HashSet<>(); - - long contractorQty; - BigDecimal liabilitiesAmount = BigDecimal.ZERO; - { - HashSet collectedContract = new HashSet<>(); - HashSet onMarketSecurity = new HashSet<>(); - for (LiabilitiesClaimsAssets lContract : liabilitiesOfCompany) { - if (!onMarketSecurity.contains(lContract.getSecurityId())) { - Listing listing = findListing(Market.mkrs, lContract.getSecurityId()); - if (listing != null) { - onMarket.add(listing.getMarket()); - } - onMarketSecurity.add(lContract.getSecurityId()); - } - if (lContract.getLiabilitiesQuantity() != null && StringUtils.isNotEmpty(lContract.getContract())) { - collectedContract.add(lContract.getContract()); - liabilitiesAmount = liabilitiesAmount.add(lContract.getLiabilitiesQuantity()); - } - } - contractorQty = collectedContract.size(); - } - String onMarketString = StringUtils.join(onMarket, ","); - if (onMarket.size() != 1) { // Сейчас по коду ожидается один listing.market="MKRS" но потом могут быть несколько - log.warn("Market for companyId[{}]: {}", companyId, onMarketString); - } - ReportBR_0420315_P1.Info_0420315_P1 info_0420315_p1 = new ReportBR_0420315_P1.Info_0420315_P1( - company.getId().toString(), - toString(company.getFullName()), - onMarketString, - toString(contractorQty), - toString(liabilitiesAmount)); - reportBR_0420315_p1.getRows().add(info_0420315_p1); - } - } - - return reportBR_0420315_p1; - } - - @Override - public Class getReportClass() { - return ReportBR_0420315_P1.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_1/ReportBR_0420315_P2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_1/ReportBR_0420315_P2_collector.java deleted file mode 100644 index 9085d5c76..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_1/ReportBR_0420315_P2_collector.java +++ /dev/null @@ -1,57 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_1; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_17_1.ReportBR_0420315_P2; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; -import java.util.HashSet; - -@Component -@Deprecated -public class ReportBR_0420315_P2_collector extends ReportWithPeriodCollector { - private Imdg liabilitiesClaimsAssetsImdg; - - @Autowired - public ReportBR_0420315_P2_collector(ImdgProvider imdgProvider) { - liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); - } - - @Override - public ReportBR_0420315_P2 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - validateDateRange(startDate, endDate); - Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, startDate, endDate); - - long liabilitiesAmount; - BigDecimal contractorQty = BigDecimal.ZERO; - { - HashSet collectedToSumm = new HashSet<>(); - for (LiabilitiesClaimsAssets lContract : liabilities) { - if (lContract.getLiabilitiesQuantity() != null && StringUtils.isNotEmpty(lContract.getContract())) { - collectedToSumm.add(lContract.getContract()); - contractorQty = contractorQty.add(lContract.getLiabilitiesQuantity()); - } - } - liabilitiesAmount = collectedToSumm.size(); - } - - ReportBR_0420315_P2 reportBR_0420315_p2 = new ReportBR_0420315_P2(startDate, endDate); - reportBR_0420315_p2.setRows(new ReportBR_0420315_P2.Info_0420315_P2(toString(contractorQty), - toString(liabilitiesAmount))); - - return reportBR_0420315_p2; - } - - @Override - public Class getReportClass() { - return ReportBR_0420315_P2.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_2/ReportBR_0420317_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_2/ReportBR_0420317_Collector.java deleted file mode 100644 index 383fe89f4..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_2/ReportBR_0420317_Collector.java +++ /dev/null @@ -1,83 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_2; - -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.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_17_2.ReportBR_0420317; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -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.Map; - -@Component -@Deprecated -public class ReportBR_0420317_Collector extends ReportWithPeriodCollector { - private Imdg companyImdg; - private Imdg relationImdg; - private Imdg companySymbolsImdg; - - @Autowired - public ReportBR_0420317_Collector(ImdgProvider imdgProvider) { - companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); - companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); - } - - Collection searchRelation(LocalDate startDate, LocalDate endDate, String service) { - ImdgPredicateBuilder pb = relationImdg.predicateBuilder(); - Instant dateTimeLo = toInstantStartDay(startDate); - Instant dateTimeHi = toInstantEndDay(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); - - Collection relations = searchRelation(startDate, endDate, "MKR"); - - ReportBR_0420317 reportBR_0420317 = new ReportBR_0420317(startDate, endDate); - for (Relation relation: relations) { - Company company = relation.getConsumerId() == null ? null : companyImdg.getSingleObjectByID(relation.getConsumerId()); - if (company == null) { - log.warn("Company.id={} not found for relation.id={}", relation.getConsumerId(), relation.getId()); - continue; - } - CompanySymbols companySymbol = companySymbolsImdg.getSingleObjectByFieldValues(Map.of( - "companySymbol", DocumentTypes.inn.getKey(),// ИНН или TIN участника клиринга - "companyId", company.getId() - )); - ReportBR_0420317.Info_0420317 info_0420317 = new ReportBR_0420317.Info_0420317( - toString(company.getClearingCode()), - toString(toString(relation.getSupplierId())), - toString(relation.getService()), - toString(relation.getServiceStatus()), - toString(relation.getUpdated()), - toString(company.getFullName()), - companySymbol == null ? "" : toString(companySymbol.getCompanySymbolValue()), - toString(company.getProfile().getCountryCode()), - toString(relation.getComment())); - reportBR_0420317.getRows().add(info_0420317); - } - - return reportBR_0420317; - } - - @Override - public Class getReportClass() { - return ReportBR_0420317.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_3/ReportBR_0420318_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_3/ReportBR_0420318_Collector.java deleted file mode 100644 index 2ef561446..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_3/ReportBR_0420318_Collector.java +++ /dev/null @@ -1,117 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_3; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.company.ClearingMemberCategory; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsMoney; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_17_3.ReportBR_0420318; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.clearing.reports.services.collector.MapUtil; -import ru.spcex.platform.enumeration.ClearingCategory; -import ru.spcex.platform.enumeration.DocumentTypes; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -@Component -@Deprecated -public class ReportBR_0420318_Collector extends ReportWithPeriodCollector { - - private Imdg liabilitiesClaimsAssetsImdg; - private Imdg liabilitiesClaimsMoneyImdg; - - private Imdg companyImdg; - private Imdg companySymbolsImdg; - private Imdg clearingMemberCategoryImdg; - - @Autowired - public ReportBR_0420318_Collector(ImdgProvider imdgProvider) { - liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); - liabilitiesClaimsMoneyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsMoney, LiabilitiesClaimsMoney.class); - clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); - companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); - } - - protected CompanySymbols findSymbol(DocumentTypes docType, Long companyId) { - CompanySymbols companySymbol = companySymbolsImdg.getSingleObjectByFieldValues(Map.of( - "companySymbol", docType.getKey(), - "companyId", companyId - )); - return companySymbol; - } - - @Override - public ReportBR_0420318 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - validateDateRange(startDate, endDate); - Collection allLiabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, startDate, endDate); - - ReportBR_0420318 reportBR_0420318 = new ReportBR_0420318(startDate, endDate); - - Map> indexByCompany = MapUtil.indexList(allLiabilities, LiabilitiesClaimsAssets::getCompanyId); - - for (Map.Entry> liabilitiesByCompanyE : indexByCompany.entrySet()) { - final Long companyId = liabilitiesByCompanyE.getKey(); - final List liabilitiesByCompany = liabilitiesByCompanyE.getValue(); - - Company company = companyImdg.getSingleObjectByID(companyId); - CompanySymbols companySymbolINN = findSymbol(DocumentTypes.inn, company.getId()); - - Collection cmcLst = clearingMemberCategoryImdg.getCollectionObjectsByFieldValues(Map.of("companyId", companyId)); - - boolean checkCategoryB = cmcLst.stream().anyMatch(cmc -> ClearingCategory.B.equalsByKey(cmc.getClearingMemberCategory())); - boolean checkCategoryIV = cmcLst.stream().anyMatch(cmc -> ClearingCategory.I.equalsByKey(cmc.getClearingMemberCategory()) || ClearingCategory.V.equalsByKey(cmc.getClearingMemberCategory())); - - for (LiabilitiesClaimsAssets liability : liabilitiesByCompany) { - final String currencyCode = liability.getCurrency(); - - LocalDate liabilitiesClaimsAssets_settlementDate = null; - if (checkCategoryB) { - liabilitiesClaimsAssets_settlementDate = liability.getRefundDate(); - } - if (checkCategoryIV) { - liabilitiesClaimsAssets_settlementDate = liability.getSettlementDate(); - } - - BigDecimal liabilitiesClaimsAssets_liabilitiesQuantity = liability.getLiabilitiesQuantity(); - - LiabilitiesClaimsMoney liabilitiesClaimsMoney = liabilitiesClaimsMoneyImdg.getSingleObjectByFieldValues(Map.of("currency", currencyCode)); - - BigDecimal liabilitiesCount = liability.getClaimsQuantity(); - - ReportBR_0420318.Info_0420318 info_0420318 = new ReportBR_0420318.Info_0420318( - toString(liability.getFullName()), - toString(companySymbolINN == null ? null : companySymbolINN.getCompanySymbolValue()), - toString(company.getProfile().getCountryCode()), - toString(liabilitiesClaimsAssets_settlementDate), - toString(liability.getContract()), - toString(currencyCode), - toString(liabilitiesClaimsAssets_liabilitiesQuantity), - liabilitiesClaimsMoney == null ? "" : toString(liabilitiesClaimsMoney.getFullName()), - toString(liabilitiesCount), - toString(liability.getComment()), - companySymbolINN == null ? "" : toString(companySymbolINN.getCompanySymbolValue()), - toString(liability.getFullName()) - ); - reportBR_0420318.getRows().add(info_0420318); - } - } - - - return reportBR_0420318; - } - - @Override - public Class getReportClass() { - return ReportBR_0420318.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_4/ReportBR_0420314_P1_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_4/ReportBR_0420314_P1_Collector.java deleted file mode 100644 index bf4022354..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_4/ReportBR_0420314_P1_Collector.java +++ /dev/null @@ -1,101 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_4; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.company.ClearingMemberCategory; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.clearing.platform.dictionary.ClearingStatusDictionary; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_17_4.ReportBR_0420314_P1; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.clearing.reports.services.collector.MapUtil; -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 java.time.LocalDate; -import java.util.Collection; -import java.util.Map; - -/** - * accountTransactionLiabilities - */ -@Component -@Deprecated -public class ReportBR_0420314_P1_Collector extends ReportWithPeriodCollector { - 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 ReportBR_0420314_P1_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" - - Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, 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)); - 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( - toString(company.getClearingCode()), - toString(companySymbolCntr == null? null : companySymbolCntr.getId()), - toString(company.getFullName()), - toString(companySymbolINN == null ? null : companySymbolINN.getCompanySymbolValue()), - toString(companySymbolOGRN == null? null : companySymbolOGRN.getCompanySymbolValue()), - toString(cleanMemberCategories), // может быть несколько, тогда через запятую перечислить - toString(liability.getRefundPaymentId()), - toString(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/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_4/ReportBR_0420314_P2_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_4/ReportBR_0420314_P2_Collector.java deleted file mode 100644 index 14ce6e0bf..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_4/ReportBR_0420314_P2_Collector.java +++ /dev/null @@ -1,131 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_4; - -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.bt_17_4.ReportBR_0420314_P2; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.clearing.reports.services.collector.MapUtil; -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.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -/** - * accountTransactionLiabilities - */ -@Component -@Deprecated -public class ReportBR_0420314_P2_Collector extends ReportWithPeriodCollector { - private Imdg companyImdg; - private Imdg paymentInstructionImdg; - private Imdg accountBalanceImdg; - private Imdg profileDocumentImdg; - - @Autowired - public ReportBR_0420314_P2_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); - } - - Collection searchPaymentInstruction(LocalDate startDate, LocalDate endDate) { - ImdgPredicateBuilder pb = paymentInstructionImdg.predicateBuilder(); - Instant dateTimeLo = toInstantStartDay(startDate); - Instant dateTimeHi = toInstantEndDay(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); - - ReportBR_0420314_P2 reportBR_0420312P2 = new ReportBR_0420314_P2(startDate, endDate, - "", "BR" - ); - - Collection paymentInstructionsAll = searchPaymentInstruction(startDate, endDate); - - 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); - if (company == null) { - log.warn("Company not found, id={}", companyId); - continue; - } - 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()); - } - } - - BigDecimal paymentInstruction_creditLeg_amount = paymentInstructionsByCompany.stream() - .map(PaymentInstruction::getCreditLeg_amount) - .filter(Objects::nonNull) - .reduce(BigDecimal::add) - .orElse(BigDecimal.ZERO); - BigDecimal paymentInstructiont_debitLeg_amount = paymentInstructionsByCompany.stream() - .map(PaymentInstruction::getDebitLeg_amount) - .filter(Objects::nonNull) - .reduce(BigDecimal::add) - .orElse(BigDecimal.ZERO); - - - ReportBR_0420314_P2.Info_0420314_P2 info_0420314P2 = new ReportBR_0420314_P2.Info_0420314_P2( - toString(company.getClearingCode()), - toString(documentTypeStr), - toString(accountBalance == null ? null : accountBalance.getOpenBalanceAmount()), - toString(paymentInstruction_creditLeg_amount), - toString(paymentInstructiont_debitLeg_amount), - toString(accountBalance == null ? null : 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/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P10_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P10_Collector.java deleted file mode 100644 index c2c39feb3..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P10_Collector.java +++ /dev/null @@ -1,49 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_5; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_17_5.ReportBR_0420312_P10; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; -import java.util.Objects; - -@Component -@Deprecated -public class ReportBR_0420312_P10_Collector extends ReportWithPeriodCollector { - private Imdg liabilitiesClaimsAssetsImdg; - - @Autowired - public ReportBR_0420312_P10_Collector(ImdgProvider imdgProvider) { - liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); - } - - @Override - public ReportBR_0420312_P10 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - validateDateRange(startDate, endDate); - - Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, startDate, endDate); - - BigDecimal liabilitiesQuantitySum = liabilities.stream() - .map(LiabilitiesClaimsAssets::getLiabilitiesQuantity) - .filter(Objects::nonNull) - .reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - - ReportBR_0420312_P10 reportBR_0420312P10 = new ReportBR_0420312_P10(startDate, endDate); - ReportBR_0420312_P10.Info_0420312_P10 reportInfo = new ReportBR_0420312_P10.Info_0420312_P10(toString(liabilitiesQuantitySum)); - reportBR_0420312P10.getRows().add(reportInfo); - - return reportBR_0420312P10; - } - - @Override - public Class getReportClass() { - return ReportBR_0420312_P10.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P1_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P1_Collector.java deleted file mode 100644 index a71ff3df7..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P1_Collector.java +++ /dev/null @@ -1,85 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_5; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.company.ClearingMemberCategory; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_17_5.ReportBR_0420312_P1; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.clearing.reports.services.collector.MapUtil; -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; - -@Component -@Deprecated -public class ReportBR_0420312_P1_Collector extends ReportWithPeriodCollector { - private final Imdg companyImdg; - private final Imdg companySymbolsImdg; - private final Imdg clearingMemberCategoryImdg; - private final Imdg liabilitiesClaimsAssetsImdg; - - @Autowired - public ReportBR_0420312_P1_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); - } - - 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) { - validateDateRange(startDate, endDate); - - ReportBR_0420312_P1 reportBR_0420312P1 = new ReportBR_0420312_P1(startDate, endDate, "BR"); - - Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, 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)); - String clearingMemberCategory = cmc == null ? null : cmc.getClearingMemberCategory(); - ReportBR_0420312_P1.Info_0420312_P1 info_0420312_p1 = new ReportBR_0420312_P1.Info_0420312_P1( - toString(company.getClearingCode()), - toString(companyId), - toString(company.getFullName()), - companySymbolINN == null ? null : toString(companySymbolINN.getCompanySymbolValue()), - companySymbolOGRN == null ? null : toString(companySymbolOGRN.getCompanySymbolValue()), - toString(company.getProfile().getCountryCode()), - toString(clearingMemberCategory)); - reportBR_0420312P1.getRows().add(info_0420312_p1); - } - - return reportBR_0420312P1; - } - - - @Override - public Class getReportClass() { - return ReportBR_0420312_P1.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P2_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P2_Collector.java deleted file mode 100644 index dbae68ea5..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P2_Collector.java +++ /dev/null @@ -1,63 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_5; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_17_5.ReportBR_0420312_P2; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.clearing.reports.services.collector.MapUtil; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -@Component -@Deprecated -public class ReportBR_0420312_P2_Collector extends ReportWithPeriodCollector { - private Imdg liabilitiesClaimsAssetsImdg; - - @Autowired - public ReportBR_0420312_P2_Collector(ImdgProvider imdgProvider) { - liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); - } - - @Override - public ReportBR_0420312_P2 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - validateDateRange(startDate, endDate); - - ReportBR_0420312_P2 reportBR_0420312P1 = new ReportBR_0420312_P2(startDate, endDate, "BR"); - - Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, startDate, endDate); - Map> indexByCompany = MapUtil.indexList(liabilities, LiabilitiesClaimsAssets::getCompanyId); - - for (Map.Entry> companyEntry : indexByCompany.entrySet()) { - final Long companyId = companyEntry.getKey(); - List companyLiabilities=companyEntry.getValue(); - - BigDecimal liabilitiesQuantitySum = companyLiabilities.stream() - .map(LiabilitiesClaimsAssets::getLiabilitiesQuantity) - .filter(Objects::nonNull) - .reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - - ReportBR_0420312_P2.Info_0420312_P2 info_0420312_p2 = new ReportBR_0420312_P2.Info_0420312_P2( - toString(companyId), - toString(liabilitiesQuantitySum) - ); - reportBR_0420312P1.getRows().add(info_0420312_p2); - } - - return reportBR_0420312P1; - } - - - @Override - public Class getReportClass() { - return ReportBR_0420312_P2.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P3_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P3_Collector.java deleted file mode 100644 index 64a0256c5..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P3_Collector.java +++ /dev/null @@ -1,63 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_5; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_17_5.ReportBR_0420312_P3; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.clearing.reports.services.collector.MapUtil; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -@Component -@Deprecated -public class ReportBR_0420312_P3_Collector extends ReportWithPeriodCollector { - private Imdg liabilitiesClaimsAssetsImdg; - - @Autowired - public ReportBR_0420312_P3_Collector(ImdgProvider imdgProvider) { - liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); - } - - @Override - public ReportBR_0420312_P3 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - validateDateRange(startDate, endDate); - - ReportBR_0420312_P3 reportBR_0420312P1 = new ReportBR_0420312_P3(startDate, endDate, "BR"); - - Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, startDate, endDate); - Map> indexByCompany = MapUtil.indexList(liabilities, LiabilitiesClaimsAssets::getCompanyId); - - for (Map.Entry> companyEntry : indexByCompany.entrySet()) { - final Long companyId = companyEntry.getKey(); - List companyLiabilities=companyEntry.getValue(); - - BigDecimal liabilitiesQuantitySum = companyLiabilities.stream() - .map(LiabilitiesClaimsAssets::getLiabilitiesQuantity) - .filter(Objects::nonNull) - .reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - - // расчёт похож на ReportBR_0420312_P2 - ReportBR_0420312_P3.Info_0420312_P3 info_0420312_p3 = new ReportBR_0420312_P3.Info_0420312_P3( - toString(companyId), - toString(liabilitiesQuantitySum) - ); - reportBR_0420312P1.getRows().add(info_0420312_p3); - } - - return reportBR_0420312P1; - } - - @Override - public Class getReportClass() { - return ReportBR_0420312_P3.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P4_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P4_Collector.java deleted file mode 100644 index 9a16262ef..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P4_Collector.java +++ /dev/null @@ -1,49 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_5; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_17_5.ReportBR_0420312_P4; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; -import java.util.Objects; - -@Component -@Deprecated -public class ReportBR_0420312_P4_Collector extends ReportWithPeriodCollector { - private Imdg liabilitiesClaimsAssetsImdg; - - @Autowired - public ReportBR_0420312_P4_Collector(ImdgProvider imdgProvider) { - liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); - } - - @Override - public ReportBR_0420312_P4 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - validateDateRange(startDate, endDate); - - Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, startDate, endDate); - - BigDecimal liabilitiesQuantitySum = liabilities.stream() - .map(LiabilitiesClaimsAssets::getLiabilitiesQuantity) - .filter(Objects::nonNull) - .reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - - ReportBR_0420312_P4 reportBR_0420312P4 = new ReportBR_0420312_P4(startDate, endDate); - ReportBR_0420312_P4.Info_0420312_P4 reportInfo = new ReportBR_0420312_P4.Info_0420312_P4(toString(liabilitiesQuantitySum)); - reportBR_0420312P4.getRows().add(reportInfo); - - return reportBR_0420312P4; - } - - @Override - public Class getReportClass() { - return ReportBR_0420312_P4.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P5_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P5_Collector.java deleted file mode 100644 index 5d247cdce..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P5_Collector.java +++ /dev/null @@ -1,49 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_5; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_17_5.ReportBR_0420312_P5; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; -import java.util.Objects; - -@Component -@Deprecated -public class ReportBR_0420312_P5_Collector extends ReportWithPeriodCollector { - private Imdg liabilitiesClaimsAssetsImdg; - - @Autowired - public ReportBR_0420312_P5_Collector(ImdgProvider imdgProvider) { - liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); - } - - @Override - public ReportBR_0420312_P5 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - validateDateRange(startDate, endDate); - - Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, startDate, endDate); - - BigDecimal liabilitiesQuantitySum = liabilities.stream() - .map(LiabilitiesClaimsAssets::getLiabilitiesQuantity) - .filter(Objects::nonNull) - .reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - - ReportBR_0420312_P5 reportBR_0420312P5 = new ReportBR_0420312_P5(startDate, endDate); - ReportBR_0420312_P5.Info_0420312_P5 reportInfo = new ReportBR_0420312_P5.Info_0420312_P5(toString(liabilitiesQuantitySum)); - reportBR_0420312P5.getRows().add(reportInfo); - - return reportBR_0420312P5; - } - - @Override - public Class getReportClass() { - return ReportBR_0420312_P5.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P6_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P6_Collector.java deleted file mode 100644 index 0a38c56d8..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P6_Collector.java +++ /dev/null @@ -1,49 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_5; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_17_5.ReportBR_0420312_P6; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; -import java.util.Objects; - -@Component -@Deprecated -public class ReportBR_0420312_P6_Collector extends ReportWithPeriodCollector { - private Imdg liabilitiesClaimsAssetsImdg; - - @Autowired - public ReportBR_0420312_P6_Collector(ImdgProvider imdgProvider) { - liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); - } - - @Override - public ReportBR_0420312_P6 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - validateDateRange(startDate, endDate); - - Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, startDate, endDate); - - BigDecimal liabilitiesQuantitySum = liabilities.stream() - .map(LiabilitiesClaimsAssets::getLiabilitiesQuantity) - .filter(Objects::nonNull) - .reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - - ReportBR_0420312_P6 reportBR_0420312P5 = new ReportBR_0420312_P6(startDate, endDate); - ReportBR_0420312_P6.Info_0420312_P6 reportInfo = new ReportBR_0420312_P6.Info_0420312_P6(toString(liabilitiesQuantitySum)); - reportBR_0420312P5.getRows().add(reportInfo); - - return reportBR_0420312P5; - } - - @Override - public Class getReportClass() { - return ReportBR_0420312_P6.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P7_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P7_Collector.java deleted file mode 100644 index b4bea17d7..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P7_Collector.java +++ /dev/null @@ -1,49 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_5; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_17_5.ReportBR_0420312_P7; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; -import java.util.Objects; - -@Component -@Deprecated -public class ReportBR_0420312_P7_Collector extends ReportWithPeriodCollector { - private Imdg liabilitiesClaimsAssetsImdg; - - @Autowired - public ReportBR_0420312_P7_Collector(ImdgProvider imdgProvider) { - liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); - } - - @Override - public ReportBR_0420312_P7 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - validateDateRange(startDate, endDate); - - Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, startDate, endDate); - - BigDecimal liabilitiesQuantitySum = liabilities.stream() - .map(LiabilitiesClaimsAssets::getLiabilitiesQuantity) - .filter(Objects::nonNull) - .reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - - ReportBR_0420312_P7 reportBR_0420312P5 = new ReportBR_0420312_P7(startDate, endDate); - ReportBR_0420312_P7.Info_0420312_P7 reportInfo = new ReportBR_0420312_P7.Info_0420312_P7(toString(liabilitiesQuantitySum)); - reportBR_0420312P5.getRows().add(reportInfo); - - return reportBR_0420312P5; - } - - @Override - public Class getReportClass() { - return ReportBR_0420312_P7.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P8_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P8_Collector.java deleted file mode 100644 index 82fd2e196..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P8_Collector.java +++ /dev/null @@ -1,100 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_5; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.company.ClearingMemberCategory; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets; -import ru.clearing.platform.dictionary.CurrencyCodeDictionary; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_17_5.ReportBR_0420312_P8; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.clearing.reports.services.collector.MapUtil; -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; - -@Component -@Deprecated -public class ReportBR_0420312_P8_Collector extends ReportWithPeriodCollector { - private Imdg companyImdg; - private Imdg companySymbolsImdg; - private Imdg clearingMemberCategoryImdg; - private Imdg liabilitiesClaimsAssetsImdg; - private Imdg currencyCodeDictionaryImdg; - - @Autowired - public ReportBR_0420312_P8_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); - currencyCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.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_P8 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - validateDateRange(startDate, endDate); - - ReportBR_0420312_P8 reportBR_0420312P8 = new ReportBR_0420312_P8(startDate, endDate); - - Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, 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)); - String clearingMemberCategory = cmc == null ? null : cmc.getClearingMemberCategory(); - - - List companyLiabilities = companyEntry.getValue(); - Map> indexByCurrency = MapUtil.indexList(companyLiabilities, LiabilitiesClaimsAssets::getCurrency); - for (Map.Entry> currencyEntry : indexByCurrency.entrySet()) { - String currencyCode = currencyEntry.getKey(); - Long currencyId = MapUtil.getDictionaryIdByCode(currencyCodeDictionaryImdg, currencyCode); - if (currencyId == null) { - log.warn("No currency found for code \"{}\"", currencyEntry.getKey()); - } - ReportBR_0420312_P8.Info_0420312_P8 info_0420312_p8 = new ReportBR_0420312_P8.Info_0420312_P8( - toString(currencyId), - toString(companyId), - toString(company.getFullName()), - companySymbolINN == null ? null : toString(companySymbolINN.getCompanySymbolValue()), - companySymbolOGRN == null ? null : toString(companySymbolOGRN.getCompanySymbolValue()), - toString(company.getProfile().getCountryCode()), - toString(clearingMemberCategory) - ); - reportBR_0420312P8.getRows().add(info_0420312_p8); - } - } - - return reportBR_0420312P8; - } - - - @Override - public Class getReportClass() { - return ReportBR_0420312_P8.class; - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P9_Collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P9_Collector.java deleted file mode 100644 index a9dcb279d..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_5/ReportBR_0420312_P9_Collector.java +++ /dev/null @@ -1,82 +0,0 @@ -package ru.spcex.clearing.reports.services.collector.bt.bt_17_5; - -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.liabilities.LiabilitiesClaimsAssets; -import ru.clearing.platform.dictionary.CurrencyCodeDictionary; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt.bt_17_5.ReportBR_0420312_P9; -import ru.spcex.clearing.reports.services.ReportWithPeriodCollector; -import ru.spcex.clearing.reports.services.collector.MapUtil; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -@Component -@Deprecated -public class ReportBR_0420312_P9_Collector extends ReportWithPeriodCollector { - private Imdg companyImdg; - private Imdg liabilitiesClaimsAssetsImdg; - private Imdg currencyCodeDictionaryImdg; - - @Autowired - public ReportBR_0420312_P9_Collector(ImdgProvider imdgProvider) { - companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); - currencyCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class); - } - - @Override - public ReportBR_0420312_P9 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - validateDateRange(startDate, endDate); - - ReportBR_0420312_P9 reportBR_0420312P9 = new ReportBR_0420312_P9(startDate, endDate); - - Collection liabilities = searchLiabilitiesClaimsAssets(liabilitiesClaimsAssetsImdg, 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; - } - List companyLiabilities = companyEntry.getValue(); - Map> indexByCurrency = MapUtil.indexList(companyLiabilities, LiabilitiesClaimsAssets::getCurrency); - for (Map.Entry> currencyEntry : indexByCurrency.entrySet()) { - String currencyCode = currencyEntry.getKey(); - Long currencyId = MapUtil.getDictionaryIdByCode(currencyCodeDictionaryImdg, currencyCode); - if (currencyId == null) { - log.warn("No currency found for code \"{}\"", currencyEntry.getKey()); - } - BigDecimal sumOfLiabilities = currencyEntry.getValue().stream() - .map(LiabilitiesClaimsAssets::getLiabilitiesQuantity) - .filter(Objects::nonNull) - .reduce(BigDecimal::add) - .orElse(BigDecimal.ZERO); - ReportBR_0420312_P9.Info_0420312_P9 info_0420312_p9 = new ReportBR_0420312_P9.Info_0420312_P9( - toString(currencyId), - toString(companyId), - toString(currencyCode), - toString(sumOfLiabilities) - ); - reportBR_0420312P9.getRows().add(info_0420312_p9); - } - } - - return reportBR_0420312P9; - } - - @Override - public Class getReportClass() { - return ReportBR_0420312_P9.class; - } -} diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/AbstractReportCollectorTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/AbstractReportCollectorTest.java index 275a02798..9cf088939 100644 --- a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/AbstractReportCollectorTest.java +++ b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/AbstractReportCollectorTest.java @@ -1,7 +1,6 @@ package ru.spcex.clearing.reports.services; import org.junit.jupiter.api.Test; -import ru.spcex.clearing.reports.reports.AbstractReport; import java.math.BigDecimal; import java.time.Instant; 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 2cfff9e9d..de0a45094 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 @@ -1,6 +1,7 @@ package ru.spcex.clearing.reports.services; import org.junit.jupiter.api.Test; +import ru.spcex.clearing.reports.notifications.DOCXService; import java.io.File; import java.util.HashMap;