From 2b038a3b04a9f9c9a10da4565ed4a8de4d8e44f8 Mon Sep 17 00:00:00 2001 From: psemenkov Date: Thu, 18 May 2023 12:22:09 +0300 Subject: [PATCH 01/62] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-313?= =?UTF-8?q?=20=D0=9F=D1=80=D0=B8=D0=B2=D0=B5=D0=BB=20=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D1=83=D0=BB=D1=8C=20=D0=B2=20=D1=81=D0=BE=D0=BE=D1=82=D0=B2?= =?UTF-8?q?=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B8=D0=B5=20=D1=81=20=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D1=8B=D0=BC=20=D0=A2=D0=97.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clearing-parent/dbf-exporter/pom.xml | 4 - .../exporter/config/DBFExporterConfig.java | 2 + .../exporter/config/KafkaSenderConfig.java | 4 +- .../controller/ExporterController.java | 37 ------ .../exporter/logic/data/ResultContainer.java | 19 +++ .../logic/data/enums/FilenameTemplate.java | 105 ++++++++++++++++ .../dbf/exporter/logic/data/enums/Table.java | 12 +- .../logic/stages/ExportFromHazelcast.java | 55 +++++---- .../dbf/exporter/logic/stages/Journal.java | 40 +++--- .../exporter/logic/stages/PrepareDBFFile.java | 71 +++-------- .../dbf/exporter/services/CommandService.java | 22 +++- .../exporter/services/DBFExportService.java | 40 ------ .../services/converters/DFConverter.java | 11 ++ .../services/converters/S_DF02_Converter.java | 2 +- .../services/converters/S_DF03_Converter.java | 54 ++++---- .../services/converters/S_DF05_Converter.java | 35 ++++++ ...7_Converter.java => S_DF07_Converter.java} | 22 ++-- .../services/converters/S_DF10_Converter.java | 39 ------ .../services/converters/S_DF11_Converter.java | 115 ------------------ ...8_Converter.java => S_DF51_Converter.java} | 17 +-- ...8_Converter.java => S_DF53_Converter.java} | 6 +- .../services/converters/S_DF54_Converter.java | 105 ++++++++++++++++ .../services/converters/S_DF56_Converter.java | 35 ++++++ .../src/main/resources/application.properties | 11 +- .../platform/messaging/domain/Consts.java | 9 +- 25 files changed, 474 insertions(+), 398 deletions(-) delete mode 100644 clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/controller/ExporterController.java create mode 100644 clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java delete mode 100644 clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/DBFExportService.java create mode 100644 clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF05_Converter.java rename clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/{S_DF17_Converter.java => S_DF07_Converter.java} (74%) delete mode 100644 clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF10_Converter.java delete mode 100644 clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF11_Converter.java rename clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/{S_DF08_Converter.java => S_DF51_Converter.java} (64%) rename clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/{S_DF18_Converter.java => S_DF53_Converter.java} (88%) create mode 100644 clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java create mode 100644 clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF56_Converter.java diff --git a/clearing-parent/dbf-exporter/pom.xml b/clearing-parent/dbf-exporter/pom.xml index fc2108169..249e0f012 100644 --- a/clearing-parent/dbf-exporter/pom.xml +++ b/clearing-parent/dbf-exporter/pom.xml @@ -21,10 +21,6 @@ org.springframework.boot spring-boot-starter - - org.springframework.boot - spring-boot-starter-web - org.springframework.boot spring-boot-autoconfigure diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java index 10261ad81..183e5148c 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java @@ -9,6 +9,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings; import ru.spcex.clearing.dbf.exporter.logic.stages.ExportFromHazelcast; +import ru.spcex.clearing.dbf.exporter.logic.stages.Journal; import ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile; import ru.spcex.clearing.dbf.exporter.logic.stages.Stage; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -50,6 +51,7 @@ public class DBFExporterConfig { pipeline.add(context.getBean(PrepareDBFFile.class)); pipeline.add(context.getBean(ExportFromHazelcast.class)); + pipeline.add(context.getBean(Journal.class)); return pipeline; } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java index 5f0a59e40..04b8b3431 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java @@ -38,7 +38,7 @@ public class KafkaSenderConfig { return KafkaProducerFactory.producerFactory(kafkaSettings); } - @Autowired(required = false) +// @Autowired(required = false) @Bean("kafkaTemplate") public KafkaTemplate kafkaTemplate(ProducerFactory pf) { if (pf == null) { @@ -47,7 +47,7 @@ public class KafkaSenderConfig { return new KafkaTemplate<>(pf); } - @Autowired(required = false) +// @Autowired(required = false) @Bean public KafkaSender kafkaSender(KafkaTemplate kafkaTemplate, ImdgProvider imdgProvider) { diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/controller/ExporterController.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/controller/ExporterController.java deleted file mode 100644 index a82bd0f32..000000000 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/controller/ExporterController.java +++ /dev/null @@ -1,37 +0,0 @@ -package ru.spcex.clearing.dbf.exporter.controller; - - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import ru.spcex.clearing.dbf.exporter.services.DBFExportService; - -@Controller("/") -public class ExporterController implements InitializingBean { - private final Logger log = LoggerFactory.getLogger(getClass()); - private final DBFExportService dbfExportService; - - public ExporterController(@Qualifier("dbfExportService") DBFExportService dbfExportService) { - this.dbfExportService = dbfExportService; - } - - @RequestMapping(method = RequestMethod.GET, path = "/export", produces = MediaType.TEXT_PLAIN_VALUE) - @ResponseBody - public String exportTables() { - log.info("Call export method for exporter controller"); - dbfExportService.run(); - return "export done"; - } - - @Override - public void afterPropertiesSet() throws Exception { - log.info("controller started"); - - } -} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/ResultContainer.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/ResultContainer.java index a84f3a8cb..82b5a7559 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/ResultContainer.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/ResultContainer.java @@ -4,6 +4,7 @@ import ru.spcex.clearing.dbf.exporter.logic.data.enums.StageResult; import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; import java.io.File; +import java.time.LocalDateTime; import java.util.UUID; /** @@ -15,6 +16,8 @@ public class ResultContainer { private File fileForExport; private Long groupId; private StageResult lastStageResult; + private LocalDateTime registrationDateTime; + private String mamberCode; protected ResultContainer() {} @@ -64,4 +67,20 @@ public class ResultContainer { public void setLastStageResult(StageResult lastStageResult) { this.lastStageResult = lastStageResult; } + + public LocalDateTime getRegistrationDateTime() { + return registrationDateTime; + } + + public void setRegistrationDateTime(LocalDateTime registrationDateTime) { + this.registrationDateTime = registrationDateTime; + } + + public String getMamberCode() { + return mamberCode; + } + + public void setMamberCode(String mamberCode) { + this.mamberCode = mamberCode; + } } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java new file mode 100644 index 000000000..457c83e7d --- /dev/null +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java @@ -0,0 +1,105 @@ +package ru.spcex.clearing.dbf.exporter.logic.data.enums; + +import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer; + +import java.io.File; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Locale; +import java.util.Objects; + +import static ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile.SECTION; +import static ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile.outDir; + +public enum FilenameTemplate { + df_section_dateTime { + @Override + public String getFileName(ResultContainer resultContainer) { + return appendSection(resultContainer) + .append(dateTime(resultContainer)) + .append(".DBF").toString(); + } + }, + df_section_dateTime_counter { + @Override + public String getFileName(ResultContainer resultContainer) { + return appendSection(resultContainer) + .append(dateTime(resultContainer)) + .append(counter(resultContainer)) + .append(".DBF").toString(); + } + }, + df_section_dateTime_counter_mamberCode { + @Override + public String getFileName(ResultContainer resultContainer) { + return appendSection(resultContainer) + .append(dateTime(resultContainer)) + .append(counter(resultContainer)) + .append(mamberCode(resultContainer)) + .append(".DBF").toString(); + } + }; + + protected StringBuilder appendSection(ResultContainer resultContainer) { + StringBuilder result = new StringBuilder(); + result.append(outDir); + result.append(File.separator); + result.append(resultContainer.getTableForExport().getFilePrefix().toUpperCase(Locale.ROOT)); + result.append('_'); + result.append(SECTION); + return result; + } + + protected StringBuilder dateTime(ResultContainer resultContainer) { + StringBuilder result = new StringBuilder(); + result.append('_'); + result.append("PRC"); + result.append(tsFormatter.format(resultContainer.getRegistrationDateTime())); + return result; + } + + protected StringBuilder counter(ResultContainer resultContainer) { + StringBuilder result = new StringBuilder(); + result.append('_'); + result.append(countSameFilesInDir(resultContainer.getTableForExport().getFilePrefix(), outDir) + 1); + return result; + } + + protected StringBuilder mamberCode(ResultContainer resultContainer) { + StringBuilder result = new StringBuilder(); + result.append('_'); + result.append(resultContainer.getMamberCode()); + return result; + } + + protected Integer countSameFilesInDir(String prefixOfTable, String outDir) { + int res = 0; + File directory = new File(outDir); + String timestampNow = utilFormatter.format(LocalDateTime.now()); + if (directory.exists()) { + for (File file : Objects.requireNonNull(directory.listFiles())) { + String name = file.getName(); + String[] splitName = name.split("_"); + String prefix = splitName[0]; + String timestamp = splitName[2]; + + if (prefix.equalsIgnoreCase(prefixOfTable) && timestamp.contains(timestampNow)) { + String counter = splitName[3]; + int positionOfDot = counter.indexOf('.'); + if (positionOfDot != -1) { + counter = counter.substring(0, positionOfDot); + } + res = Integer.max(res, Integer.parseInt(counter)); + } + } + } + return res; + } + + private static final DateTimeFormatter tsFormatter = DateTimeFormatter.ofPattern("yyMMddHHmm"); + private static final DateTimeFormatter utilFormatter = DateTimeFormatter.ofPattern("yyMMdd"); + + public String getFileName(ResultContainer resultContainer) { + return null; + } +} \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/Table.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/Table.java index 52f7d87cd..24ae62a8e 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/Table.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/Table.java @@ -7,11 +7,13 @@ import ru.spcex.platform.classes.base.SpcexObjectBase; public enum Table { S_DF02("DF-02", IMDGDistributedNames.Map_SDf02, SDf02.class), S_DF03("DF-03", IMDGDistributedNames.Map_SDf03, SDf03.class), - S_DF08("DF-08", IMDGDistributedNames.Map_SDf08, SDf08.class), - S_DF11("DF-11", IMDGDistributedNames.Map_SDf11, SDf11.class), - S_DF18("DF-18", IMDGDistributedNames.Map_SDf18, SDf18.class), - S_DF10("DF-10", IMDGDistributedNames.Map_SDf10, SDf10.class), - S_DF17("DF-17", IMDGDistributedNames.Map_SDf17, SDf17.class); + S_DF05("DF-05", IMDGDistributedNames.Map_SDf05, SDf05.class), + S_DF07("DF-07", IMDGDistributedNames.Map_SDf07, SDf07.class), + S_DF51("DF-51", IMDGDistributedNames.Map_SDf51, SDf51.class), + S_DF53("DF-53", IMDGDistributedNames.Map_SDf53, SDf53.class), + S_DF54("DF-54", IMDGDistributedNames.Map_SDf54, SDf54.class), + S_DF56("DF-56", IMDGDistributedNames.Map_SDf56, SDf56.class); + /** * Префикс имени файла для экспорта diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java index a2bebeafc..b9c819c40 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java @@ -33,11 +33,12 @@ public class ExportFromHazelcast extends Stage implements InitializingBean { private final S_DF02_Converter s_df02_converter; private final S_DF03_Converter s_df03_converter; - private final S_DF08_Converter s_df08_converter; - private final S_DF11_Converter s_df11_converter; - private final S_DF18_Converter s_df18_converter; - private final S_DF10_Converter s_df10_converter; - private final S_DF17_Converter s_df17_converter; + private final S_DF05_Converter s_df05_converter; + private final S_DF07_Converter s_df07_converter; + private final S_DF51_Converter s_df51_converter; + private final S_DF53_Converter s_df53_converter; + private final S_DF54_Converter s_df54_converter; + private final S_DF56_Converter s_df56_converter; private final Map dbfFieldsForTable = new HashMap<>(); private Charset dbfCharset; @@ -46,20 +47,22 @@ public class ExportFromHazelcast extends Stage implements InitializingBean { @Qualifier("imdgProvider") ImdgProvider imdgProvider, S_DF02_Converter s_df02_converter, S_DF03_Converter s_df03_converter, - S_DF08_Converter s_df08_converter, - S_DF11_Converter s_df11_converter, - S_DF18_Converter s_df18_converter, - S_DF10_Converter s_df10_converter, - S_DF17_Converter s_df17_converter) { + S_DF07_Converter s_df07_converter, + S_DF05_Converter s_df05_converter, + S_DF51_Converter s_df51_converter, + S_DF54_Converter s_df54_converter, + S_DF53_Converter s_df53_converter, + S_DF56_Converter s_df56_converter) { this.settings = settings; this.imdgProvider = imdgProvider; this.s_df02_converter = s_df02_converter; this.s_df03_converter = s_df03_converter; - this.s_df08_converter = s_df08_converter; - this.s_df11_converter = s_df11_converter; - this.s_df18_converter = s_df18_converter; - this.s_df10_converter = s_df10_converter; - this.s_df17_converter = s_df17_converter; + this.s_df07_converter = s_df07_converter; + this.s_df05_converter = s_df05_converter; + this.s_df51_converter = s_df51_converter; + this.s_df54_converter = s_df54_converter; + this.s_df53_converter = s_df53_converter; + this.s_df56_converter = s_df56_converter; } @Override @@ -89,11 +92,12 @@ public class ExportFromHazelcast extends Stage implements InitializingBean { Object[] values; if (value instanceof SDf02 sDf02Value) values = s_df02_converter.toObjectArray(sDf02Value); else if (value instanceof SDf03 sDf03Value) values = s_df03_converter.toObjectArray(sDf03Value); - else if (value instanceof SDf08 sDf08Value) values = s_df08_converter.toObjectArray(sDf08Value); - else if (value instanceof SDf11 sDf11Value) values = s_df11_converter.toObjectArray(sDf11Value); - else if (value instanceof SDf18 sDf18Value) values = s_df18_converter.toObjectArray(sDf18Value); - else if (value instanceof SDf10 sDf10Value) values = s_df10_converter.toObjectArray(sDf10Value); - else if (value instanceof SDf17 sDf17Value) values = s_df17_converter.toObjectArray(sDf17Value); + else if (value instanceof SDf05 sDf05Value) values = s_df05_converter.toObjectArray(sDf05Value); + else if (value instanceof SDf07 sDf07Value) values = s_df07_converter.toObjectArray(sDf07Value); + else if (value instanceof SDf51 sDf51Value) values = s_df51_converter.toObjectArray(sDf51Value); + else if (value instanceof SDf53 sDf53Value) values = s_df53_converter.toObjectArray(sDf53Value); + else if (value instanceof SDf54 sDf54Value) values = s_df54_converter.toObjectArray(sDf54Value); + else if (value instanceof SDf56 sDf56Value) values = s_df56_converter.toObjectArray(sDf56Value); else throw new Exception("Get unknown object from imdg. Class: " + value.getClass().getSimpleName()); dbfWriter.addRecord(values); } @@ -131,11 +135,12 @@ public class ExportFromHazelcast extends Stage implements InitializingBean { private void initExportFileStructure() { dbfFieldsForTable.put(Table.S_DF02, s_df02_converter.getDBFHeaders()); dbfFieldsForTable.put(Table.S_DF03, s_df03_converter.getDBFHeaders()); - dbfFieldsForTable.put(Table.S_DF08, s_df08_converter.getDBFHeaders()); - dbfFieldsForTable.put(Table.S_DF18, s_df18_converter.getDBFHeaders()); - dbfFieldsForTable.put(Table.S_DF10, s_df10_converter.getDBFHeaders()); - dbfFieldsForTable.put(Table.S_DF11, s_df11_converter.getDBFHeaders()); - dbfFieldsForTable.put(Table.S_DF17, s_df17_converter.getDBFHeaders()); + dbfFieldsForTable.put(Table.S_DF05, s_df05_converter.getDBFHeaders()); + dbfFieldsForTable.put(Table.S_DF07, s_df07_converter.getDBFHeaders()); + dbfFieldsForTable.put(Table.S_DF51, s_df51_converter.getDBFHeaders()); + dbfFieldsForTable.put(Table.S_DF53, s_df53_converter.getDBFHeaders()); + dbfFieldsForTable.put(Table.S_DF54, s_df54_converter.getDBFHeaders()); + dbfFieldsForTable.put(Table.S_DF56, s_df56_converter.getDBFHeaders()); } private void initDBFCharset() { diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/Journal.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/Journal.java index 957862fa5..025a1819f 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/Journal.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/Journal.java @@ -11,25 +11,21 @@ import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; import ru.spcex.clearing.platform.messaging.domain.cud.system.JournalSdf; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; -import java.time.LocalDate; -import java.time.LocalTime; import java.util.EnumMap; import java.util.Map; +import static ru.spcex.clearing.platform.messaging.domain.Consts.EXPORT_COMPLETED; + @Component public class Journal extends Stage implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final KafkaSender kafkaSender; - @Autowired(required = false) + @Autowired public Journal(KafkaSender kafkaSender) { this.kafkaSender = kafkaSender; } - public Journal() { - this.kafkaSender = null; - } - @Override public boolean skipCompleted() { return false; @@ -43,13 +39,13 @@ public class Journal extends Stage implements InitializingBean { } JournalSdf journalSdf = new JournalSdf(); //todo read file attibutes - journalSdf.setRegistrationDate(LocalDate.now()); - journalSdf.setRegistrationTime(LocalTime.now()); + journalSdf.setRegistrationDate(resultContainer.getRegistrationDateTime().toLocalDate()); + journalSdf.setRegistrationTime(resultContainer.getRegistrationDateTime().toLocalTime()); journalSdf.setRegistrationNumber(resultContainer.getGroupId()); journalSdf.setDocumentName(documentNames.get(resultContainer.getTableForExport())); journalSdf.setDossierNumber(dossierNumber.get(resultContainer.getTableForExport())); journalSdf.setResultStatus(StageResult.ERROR.equals(resultContainer.getLastStageResult()) ? "NACK" : "ACK"); -// kafkaSender.sendRequestToQueue(); + kafkaSender.sendRequestToQueue(EXPORT_COMPLETED, journalSdf); return StageResult.COMPLETE; } @@ -61,23 +57,23 @@ public class Journal extends Stage implements InitializingBean { static { documentNames.put(Table.S_DF02, "Уведомлений об исполнении операции загрузки денежных средств или уведомление об ошибке"); documentNames.put(Table.S_DF03, "Сводное платёжное поручение по итогу проведения расчетов, направляемое в РО"); - //documentNames.put(Table.S_DF05, "Уведомление о завершении расчетов в секции"); - documentNames.put(Table.S_DF08, "Запрос остатков по всем счетам, направляемый в РО"); - documentNames.put(Table.S_DF10, "Подтверждение о загрузке по поступлению на клиринговый счет"); - documentNames.put(Table.S_DF11, "Распоряжение на списание с ТБС УК на Клиринговый счет (по итогам проведения расчетов по возврату депозита) / Распоряжение на списание с ТБС УК на Корреспонденский счет УК"); - //documentNames.put(Table.S_DF13, "Распоряжение на списание денежных средств УК категории В (с клирингового счета)"); - documentNames.put(Table.S_DF17, "Подтверждение о загрузке Уведомления о возврате ден.ср. по договору депозита"); + documentNames.put(Table.S_DF05, "Уведомление о завершении расчетов в секции"); + documentNames.put(Table.S_DF07, "Подтверждение о загрузке Уведомления о возврате ден.ср. по договору депозита"); + documentNames.put(Table.S_DF51, "Запрос остатков по всем счетам, направляемый в РО"); + documentNames.put(Table.S_DF53, ""); + documentNames.put(Table.S_DF54, "Распоряжение на списание денежных средств УК категории В (с клирингового счета)"); + documentNames.put(Table.S_DF56, ""); } private static final Map dossierNumber = new EnumMap<>(Table.class); static { dossierNumber.put(Table.S_DF02, "07-50"); dossierNumber.put(Table.S_DF03, "07-51"); - //dossierNumber.put(Table.S_DF05, "07-53"); - dossierNumber.put(Table.S_DF08, "07-55"); - dossierNumber.put(Table.S_DF10, "07-56"); - dossierNumber.put(Table.S_DF11, "07-36"); - //dossierNumber.put(Table.S_DF13, "07-48"); - dossierNumber.put(Table.S_DF17, "07-58"); + dossierNumber.put(Table.S_DF05, "07-53"); + dossierNumber.put(Table.S_DF07, "07-58"); + dossierNumber.put(Table.S_DF51, "07-55"); + dossierNumber.put(Table.S_DF53, ""); + dossierNumber.put(Table.S_DF54, "07-48"); + dossierNumber.put(Table.S_DF56, ""); } } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java index a0743322c..f62dca17c 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java @@ -4,6 +4,7 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings; import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer; +import ru.spcex.clearing.dbf.exporter.logic.data.enums.FilenameTemplate; import ru.spcex.clearing.dbf.exporter.logic.data.enums.StageResult; import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; @@ -12,8 +13,8 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Locale; +import java.util.EnumMap; +import java.util.Map; import java.util.Objects; /** @@ -21,12 +22,10 @@ import java.util.Objects; */ @Component public class PrepareDBFFile extends Stage implements InitializingBean { - private static final String SECTION = "U"; - private static final String CODE_OF_MEMBER = null; - private static final DateTimeFormatter tsFormatter = DateTimeFormatter.ofPattern("yyMMddHHmm"); - private static final DateTimeFormatter utilFormatter = DateTimeFormatter.ofPattern("yyMMdd"); + public static final String SECTION = "U"; + public static final String CODE_OF_MEMBER = null; private final ExportDBFServiceSettings settings; - private String outDir; + public static String outDir; public PrepareDBFFile(ExportDBFServiceSettings settings) { this.settings = settings; @@ -37,7 +36,9 @@ public class PrepareDBFFile extends Stage implements InitializingBean { Objects.requireNonNull(resultContainer.getTableForExport()); Table table = resultContainer.getTableForExport(); - File dbfFile = new File(prepareFilename(table, SECTION, CODE_OF_MEMBER, outDir)); + LocalDateTime currentDateTime = LocalDateTime.now(); + resultContainer.setRegistrationDateTime(currentDateTime); + File dbfFile = new File(nameTemplates.get(table).getFileName(resultContainer)); try { Path dbfFilePath = dbfFile.toPath(); Files.deleteIfExists(dbfFilePath); @@ -61,50 +62,16 @@ public class PrepareDBFFile extends Stage implements InitializingBean { this.outDir = outDirPath; } - private String prepareFilename(Table table, String section, String codeOfMember, String outDir) { - StringBuilder result = new StringBuilder(); - String prefixOfTable = table.getFilePrefix(); - String time = "PRC" + tsFormatter.format(LocalDateTime.now()); + private static final Map nameTemplates = new EnumMap<>(Table.class); - result.append(outDir); - result.append(File.separator); - result.append(prefixOfTable.toUpperCase(Locale.ROOT)); - result.append('_'); - result.append(section); - result.append('_'); - result.append(time); - result.append('_'); - result.append(countSameFilesInDir(prefixOfTable, outDir) + 1); - if (codeOfMember != null) { - result.append('_'); - result.append(codeOfMember); - } - result.append(".DBF"); - return result.toString(); - } - - private Integer countSameFilesInDir(String prefixOfTable, String outDir) { - int res = 0; - File directory = new File(outDir); - if (directory.exists()) { - for (File file : Objects.requireNonNull(directory.listFiles())) { - String name = file.getName(); - String[] splitName = name.split("_"); - String prefix = splitName[0]; - String timestamp = splitName[2]; - String timestampNow = utilFormatter.format(LocalDateTime.now()); - - if (prefix.equalsIgnoreCase(prefixOfTable) && timestamp.contains(timestampNow)) { - String counter = splitName[3]; - int positionOfDot = counter.indexOf('.'); - if (positionOfDot != -1) { - counter = counter.substring(0, positionOfDot); - } - res = Integer.max(res, Integer.parseInt(counter)); - - } - } - } - return res; + static { + nameTemplates.put(Table.S_DF02, FilenameTemplate.df_section_dateTime); + nameTemplates.put(Table.S_DF03, FilenameTemplate.df_section_dateTime_counter_mamberCode); + nameTemplates.put(Table.S_DF05, FilenameTemplate.df_section_dateTime); + nameTemplates.put(Table.S_DF07, FilenameTemplate.df_section_dateTime_counter); + nameTemplates.put(Table.S_DF51, FilenameTemplate.df_section_dateTime_counter); + nameTemplates.put(Table.S_DF53, FilenameTemplate.df_section_dateTime_counter); + nameTemplates.put(Table.S_DF54, FilenameTemplate.df_section_dateTime_counter); + nameTemplates.put(Table.S_DF56, FilenameTemplate.df_section_dateTime_counter); } } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/CommandService.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/CommandService.java index 8689559f0..2c3acd3f1 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/CommandService.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/CommandService.java @@ -35,12 +35,30 @@ public class CommandService extends QueueConsumer implements InitializingBean { callback(ExportToFileRequest.class) .setConsumer(this::process) .forDestination(Consts.EXPORT_PROCESS, callbacks::put); + callback(SdfClearingRequest.class) + .setConsumer(r -> processSpecial(Table.S_DF02, r)) + .forDestination(Consts.SDF02_PROCESS, callbacks::put); callback(SdfClearingRequest.class) .setConsumer(r -> processSpecial(Table.S_DF03, r)) // todo необходимо в отдельную папку: "в отдельную директорию SettlementHouse_Fail (чтобы не отдавать такие файлы в ПРЦ" .forDestination(Consts.SDF03_PROCESS, callbacks::put); callback(SdfClearingRequest.class) - .setConsumer(r -> processSpecial(Table.S_DF11, r)) - .forDestination(Consts.SDF11_PROCESS, callbacks::put); + .setConsumer(r -> processSpecial(Table.S_DF05, r)) + .forDestination(Consts.SDF05_PROCESS, callbacks::put); + callback(SdfClearingRequest.class) + .setConsumer(r -> processSpecial(Table.S_DF07, r)) + .forDestination(Consts.SDF07_PROCESS, callbacks::put); + callback(SdfClearingRequest.class) + .setConsumer(r -> processSpecial(Table.S_DF51, r)) + .forDestination(Consts.SDF51_PROCESS, callbacks::put); + callback(SdfClearingRequest.class) + .setConsumer(r -> processSpecial(Table.S_DF53, r)) + .forDestination(Consts.SDF53_PROCESS, callbacks::put); + callback(SdfClearingRequest.class) + .setConsumer(r -> processSpecial(Table.S_DF54, r)) + .forDestination(Consts.SDF54_PROCESS, callbacks::put); + callback(SdfClearingRequest.class) + .setConsumer(r -> processSpecial(Table.S_DF56, r)) + .forDestination(Consts.SDF56_PROCESS, callbacks::put); init(); } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/DBFExportService.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/DBFExportService.java deleted file mode 100644 index 3371e1c72..000000000 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/DBFExportService.java +++ /dev/null @@ -1,40 +0,0 @@ -package ru.spcex.clearing.dbf.exporter.services; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import org.springframework.stereotype.Service; -import ru.spcex.clearing.dbf.exporter.logic.Processor; -import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer; -import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.util.Arrays; - -@Service("dbfExportService") -public class DBFExportService { - Logger log = LoggerFactory.getLogger(getClass()); - private final ThreadPoolTaskExecutor executor; - private final Processor processor; - protected final ImdgProvider imdgProvider; - - public DBFExportService(@Qualifier("executor") ThreadPoolTaskExecutor executor, - @Qualifier("processor") Processor processor, - ImdgProvider imdgProvider) { - this.executor = executor; - this.processor = processor; - this.imdgProvider = imdgProvider; - log.debug("Check IMDG..."); - imdgProvider.waitAvailable(); - log.debug("IMDG ready..."); - } - - public void run() { - log.debug("Do export for all: {}", Arrays.toString(Table.values())); - for (Table tableForExport : Table.values()) { - executor.submit(() -> processor.process(ResultContainer.createNewTask(tableForExport))); - } - } - -} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/DFConverter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/DFConverter.java index 34ade61a5..c8c15f2ad 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/DFConverter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/DFConverter.java @@ -3,6 +3,7 @@ package ru.spcex.clearing.dbf.exporter.services.converters; import com.linuxense.javadbf.DBFField; import ru.spcex.platform.classes.base.SpcexObjectBase; +import java.math.BigDecimal; import java.sql.Date; import java.sql.Time; import java.sql.Timestamp; @@ -25,4 +26,14 @@ public abstract class DFConverter { if (src instanceof LocalTime srcLocalTime) return Time.valueOf(srcLocalTime); return src; } + + protected Long convertStrToLong(String s) { + if (s == null) return null; + return Long.valueOf(s); + } + + protected BigDecimal convertStrToBigDecimal(String s) { + if (s == null) return null; + return new BigDecimal(s).setScale(0); + } } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF02_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF02_Converter.java index b5c99f71e..5626235e0 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF02_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF02_Converter.java @@ -43,7 +43,7 @@ public class S_DF02_Converter extends DFConverter { dbfFields.add(new DBFField("ACC_TYPE", DBFDataType.CHARACTER, 2)); dbfFields.add(new DBFField("SUMENGAGE", DBFDataType.CHARACTER, 22)); dbfFields.add(new DBFField("SUMUNBLOCK", DBFDataType.CHARACTER, 22)); - dbfFields.add(new DBFField("FILE_TYPE", DBFDataType.CHARACTER, 22)); + dbfFields.add(new DBFField("FILE_TYPE", DBFDataType.CHARACTER, 1)); dbfFields.add(new DBFField("RESULT", DBFDataType.CHARACTER, 3)); return dbfFields.toArray(DBFField[]::new); } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF03_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF03_Converter.java index 9505abaf5..854ba7aa0 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF03_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF03_Converter.java @@ -69,15 +69,15 @@ public class S_DF03_Converter extends DFConverter { dbfFields.add(new DBFField("DOC_TYPE", DBFDataType.CHARACTER, 4)); dbfFields.add(new DBFField("DOCNM_REF", DBFDataType.CHARACTER, 16)); dbfFields.add(new DBFField("DOCNMPREV", DBFDataType.CHARACTER, 16)); - dbfFields.add(new DBFField("PRIORITY", DBFDataType.CHARACTER, 1)); - dbfFields.add(new DBFField("SBANKCODE", DBFDataType.CHARACTER, 12)); +// dbfFields.add(new DBFField("PRIORITY", DBFDataType.CHARACTER, 1)); +// dbfFields.add(new DBFField("SBANKCODE", DBFDataType.CHARACTER, 12)); dbfFields.add(new DBFField("C_ACC_DEB", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("SBANKNAM1", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("SBANKNAM2", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("SBANKNAM3", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("SBANKNAM4", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("SBANKNAM5", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("RBANKCODE", DBFDataType.CHARACTER, 12)); +// dbfFields.add(new DBFField("RBANKCODE", DBFDataType.CHARACTER, 12)); dbfFields.add(new DBFField("C_ACC_CRED", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("RBANKNAM1", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("RBANKNAM2", DBFDataType.CHARACTER, 35)); @@ -85,31 +85,31 @@ public class S_DF03_Converter extends DFConverter { dbfFields.add(new DBFField("RBANKNAM4", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("RBANKNAM5", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("PAY_DATE", DBFDataType.CHARACTER, 8)); - dbfFields.add(new DBFField("EXT_DATE", DBFDataType.CHARACTER, 8)); - dbfFields.add(new DBFField("PAY_VAL", DBFDataType.CHARACTER, 12)); +// dbfFields.add(new DBFField("EXT_DATE", DBFDataType.CHARACTER, 8)); +// dbfFields.add(new DBFField("PAY_VAL", DBFDataType.CHARACTER, 12)); dbfFields.add(new DBFField("SUM_DEB", DBFDataType.CHARACTER, 22)); - dbfFields.add(new DBFField("SCLIENTN1", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SCLIENTN2", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SCLIENTN3", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SCLIENTN4", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SC_CODE", DBFDataType.CHARACTER, 12)); - dbfFields.add(new DBFField("ACC_DEB", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("RCLIENTN1", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("RCLIENTN2", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("RCLIENTN3", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("RCLIENTN4", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("ACC_KR_1", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("ACC_KR_2", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SP_CODE", DBFDataType.CHARACTER, 2)); - dbfFields.add(new DBFField("SPECIF_1", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SPECIF_2", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SPECIF_3", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SPECIF_4", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SPECIF_5", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SPECIF_6", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SEND_TYPE", DBFDataType.CHARACTER, 10)); - dbfFields.add(new DBFField("SERVDATE", DBFDataType.CHARACTER, 8)); - dbfFields.add(new DBFField("DOC_RESULT", DBFDataType.CHARACTER, 2)); +// dbfFields.add(new DBFField("SCLIENTN1", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("SCLIENTN2", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("SCLIENTN3", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("SCLIENTN4", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("SC_CODE", DBFDataType.CHARACTER, 12)); +// dbfFields.add(new DBFField("ACC_DEB", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("RCLIENTN1", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("RCLIENTN2", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("RCLIENTN3", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("RCLIENTN4", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("ACC_KR_1", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("ACC_KR_2", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("SP_CODE", DBFDataType.CHARACTER, 2)); + dbfFields.add(new DBFField("SPECIF_1", DBFDataType.CHARACTER, 255)); +// dbfFields.add(new DBFField("SPECIF_2", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("SPECIF_3", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("SPECIF_4", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("SPECIF_5", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("SPECIF_6", DBFDataType.CHARACTER, 35)); +// dbfFields.add(new DBFField("SEND_TYPE", DBFDataType.CHARACTER, 10)); +// dbfFields.add(new DBFField("SERVDATE", DBFDataType.CHARACTER, 8)); +// dbfFields.add(new DBFField("DOC_RESULT", DBFDataType.CHARACTER, 2)); dbfFields.add(new DBFField("IMP_RESULT", DBFDataType.CHARACTER, 3)); return dbfFields.toArray(DBFField[]::new); } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF05_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF05_Converter.java new file mode 100644 index 000000000..9b9a7d181 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF05_Converter.java @@ -0,0 +1,35 @@ +package ru.spcex.clearing.dbf.exporter.services.converters; + +import com.linuxense.javadbf.DBFDataType; +import com.linuxense.javadbf.DBFField; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.sdf.SDf05; + +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +@Service +public class S_DF05_Converter extends DFConverter { + @Override + public Object[] toObjectArray(SDf05 entity) { + List values = new LinkedList<>(); + values.add(typeMatch(entity.getTp())); + values.add(typeMatch(entity.getDt())); + values.add(typeMatch(entity.getTm())); + values.add(typeMatch(entity.getPr())); + return values.toArray(Object[]::new); + } + + @Override + public DBFField[] getDBFHeaders() { + List dbfFields = new LinkedList<>(); + Date date = new Date(); + dbfFields.add(new DBFField("TP", DBFDataType.NUMERIC, 72, 18)); + dbfFields.add(new DBFField("DT", DBFDataType.DATE)); + dbfFields.add(new DBFField("TM", DBFDataType.DATE)); + dbfFields.add(new DBFField("PR", DBFDataType.CHARACTER, 1)); + return dbfFields.toArray(DBFField[]::new); + } + +} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF17_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF07_Converter.java similarity index 74% rename from clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF17_Converter.java rename to clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF07_Converter.java index 0b00658b2..aaa5f7f76 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF17_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF07_Converter.java @@ -3,20 +3,22 @@ package ru.spcex.clearing.dbf.exporter.services.converters; import com.linuxense.javadbf.DBFDataType; import com.linuxense.javadbf.DBFField; import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.sdf.SDf17; +import ru.clearing.classes.statics.data.sdf.SDf07; import java.util.LinkedList; import java.util.List; @Service -public class S_DF17_Converter extends DFConverter { +public class S_DF07_Converter extends DFConverter { @Override - public Object[] toObjectArray(SDf17 entity) { + public Object[] toObjectArray(SDf07 entity) { List values = new LinkedList<>(); values.add(typeMatch(entity.getAccount())); values.add(typeMatch(entity.getSum())); values.add(typeMatch(entity.getMarket())); values.add(typeMatch(entity.getType())); + values.add(typeMatch(entity.getDeal())); + values.add(typeMatch(entity.getClientN())); values.add(typeMatch(entity.getInn())); values.add(typeMatch(entity.getBic())); values.add(typeMatch(entity.getSpec())); @@ -29,14 +31,16 @@ public class S_DF17_Converter extends DFConverter { public DBFField[] getDBFHeaders() { List dbfFields = new LinkedList<>(); dbfFields.add(new DBFField("ACCOUNT", DBFDataType.CHARACTER, 20)); - dbfFields.add(new DBFField("SUM", DBFDataType.NUMERIC, 32, 18)); + dbfFields.add(new DBFField("SUM", DBFDataType.NUMERIC, 72, 18)); dbfFields.add(new DBFField("MARKET", DBFDataType.CHARACTER, 1)); dbfFields.add(new DBFField("TYPE", DBFDataType.CHARACTER, 1)); - dbfFields.add(new DBFField("_I_N_N", DBFDataType.NUMERIC, 32, 18)); - dbfFields.add(new DBFField("_B_I_C", DBFDataType.NUMERIC, 32, 18)); - dbfFields.add(new DBFField("_S_P_E_C", DBFDataType.CHARACTER, 254)); - dbfFields.add(new DBFField("NUMBER", DBFDataType.NUMERIC, 32, 18)); - dbfFields.add(new DBFField("RESULT", DBFDataType.NUMERIC, 1)); + dbfFields.add(new DBFField("DEAL", DBFDataType.CHARACTER, 10)); + dbfFields.add(new DBFField("CLIENT_N", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("_I_N_N", DBFDataType.NUMERIC, 72, 18)); + dbfFields.add(new DBFField("_B_I_C", DBFDataType.NUMERIC, 72, 18)); + dbfFields.add(new DBFField("_S_P_E_C", DBFDataType.CHARACTER, 255)); + dbfFields.add(new DBFField("NUMBER", DBFDataType.NUMERIC, 72, 18)); + dbfFields.add(new DBFField("RESULT", DBFDataType.NUMERIC, 72, 18)); return dbfFields.toArray(DBFField[]::new); } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF10_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF10_Converter.java deleted file mode 100644 index c4ae987de..000000000 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF10_Converter.java +++ /dev/null @@ -1,39 +0,0 @@ -package ru.spcex.clearing.dbf.exporter.services.converters; - -import com.linuxense.javadbf.DBFDataType; -import com.linuxense.javadbf.DBFField; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.sdf.SDf10; - -import java.util.LinkedList; -import java.util.List; - -@Service -public class S_DF10_Converter extends DFConverter { - @Override - public Object[] toObjectArray(SDf10 entity) { - List values = new LinkedList<>(); -// values.add(typeMatch(entity.getAccount())); -// values.add(typeMatch(entity.getSum())); -// values.add(typeMatch(entity.getMarket())); -// values.add(typeMatch(entity.getType())); -// values.add(typeMatch(entity.getNumber())); -// values.add(typeMatch(entity.getInn())); -// values.add(typeMatch(entity.getResult())); - return values.toArray(Object[]::new); - } - - @Override - public DBFField[] getDBFHeaders() { - List dbfFields = new LinkedList<>(); - dbfFields.add(new DBFField("ACCOUNT", DBFDataType.CHARACTER, 20)); - dbfFields.add(new DBFField("SUM", DBFDataType.NUMERIC, 32, 18)); - dbfFields.add(new DBFField("MARKET", DBFDataType.CHARACTER, 1)); - dbfFields.add(new DBFField("TYPE", DBFDataType.CHARACTER, 1)); - dbfFields.add(new DBFField("NUMBER", DBFDataType.NUMERIC, 32, 18)); - dbfFields.add(new DBFField("_I_N_N", DBFDataType.NUMERIC, 32, 18)); - dbfFields.add(new DBFField("RESULT", DBFDataType.CHARACTER, 3)); - return dbfFields.toArray(DBFField[]::new); - } - -} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF11_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF11_Converter.java deleted file mode 100644 index 8325b4d13..000000000 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF11_Converter.java +++ /dev/null @@ -1,115 +0,0 @@ -package ru.spcex.clearing.dbf.exporter.services.converters; - -import com.linuxense.javadbf.DBFDataType; -import com.linuxense.javadbf.DBFField; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.sdf.SDf11; - -import java.util.LinkedList; -import java.util.List; - -@Service -public class S_DF11_Converter extends DFConverter { - @Override - public Object[] toObjectArray(SDf11 entity) { - List values = new LinkedList<>(); -// values.add(typeMatch(entity.getSeg_type())); -// values.add(typeMatch(entity.getDoc_type())); -// values.add(typeMatch(entity.getDocnm_ref())); -// values.add(typeMatch(entity.getDocnmprev())); -// values.add(typeMatch(entity.getPriority())); -// values.add(typeMatch(entity.getSbankcode())); -// values.add(typeMatch(entity.getC_acc_deb())); -// values.add(typeMatch(entity.getSbanknam1())); -// values.add(typeMatch(entity.getSbanknam2())); -// values.add(typeMatch(entity.getSbanknam3())); -// values.add(typeMatch(entity.getSbanknam4())); -// values.add(typeMatch(entity.getSbanknam5())); -// values.add(typeMatch(entity.getRbankcode())); -// values.add(typeMatch(entity.getC_acc_cred())); -// values.add(typeMatch(entity.getRbanknam1())); -// values.add(typeMatch(entity.getRbanknam2())); -// values.add(typeMatch(entity.getRbanknam3())); -// values.add(typeMatch(entity.getRbanknam4())); -// values.add(typeMatch(entity.getRbanknam5())); -// values.add(typeMatch(entity.getPay_date())); -// values.add(typeMatch(entity.getExt_date())); -// values.add(typeMatch(entity.getPay_val())); -// values.add(typeMatch(entity.getSum_deb())); -// values.add(typeMatch(entity.getSclientn1())); -// values.add(typeMatch(entity.getSclientn2())); -// values.add(typeMatch(entity.getSclientn3())); -// values.add(typeMatch(entity.getSclientn4())); -// values.add(typeMatch(entity.getSc_code())); -// values.add(typeMatch(entity.getAcc_deb())); -// values.add(typeMatch(entity.getRclientn1())); -// values.add(typeMatch(entity.getRclientn2())); -// values.add(typeMatch(entity.getRclientn3())); -// values.add(typeMatch(entity.getRclientn4())); -// values.add(typeMatch(entity.getAcc_kr_1())); -// values.add(typeMatch(entity.getAcc_kr_2())); -// values.add(typeMatch(entity.getSp_code())); -// values.add(typeMatch(entity.getSpecif_1())); -// values.add(typeMatch(entity.getSpecif_2())); -// values.add(typeMatch(entity.getSpecif_3())); -// values.add(typeMatch(entity.getSpecif_4())); -// values.add(typeMatch(entity.getSpecif_5())); -// values.add(typeMatch(entity.getSpecif_6())); -// values.add(typeMatch(entity.getSend_type())); -// values.add(typeMatch(entity.getServdate())); -// values.add(typeMatch(entity.getDoc_result())); - return values.toArray(Object[]::new); - } - - @Override - public DBFField[] getDBFHeaders() { - List dbfFields = new LinkedList<>(); - dbfFields.add(new DBFField("SEG_TYPE", DBFDataType.CHARACTER, 1)); - dbfFields.add(new DBFField("DOC_TYPE", DBFDataType.CHARACTER, 4)); - dbfFields.add(new DBFField("DOCNM_REF", DBFDataType.CHARACTER, 16)); - dbfFields.add(new DBFField("DOCNMPREV", DBFDataType.CHARACTER, 16)); - dbfFields.add(new DBFField("PRIORITY", DBFDataType.CHARACTER, 1)); - dbfFields.add(new DBFField("SBANKCODE", DBFDataType.CHARACTER, 12)); - dbfFields.add(new DBFField("C_ACC_DEB", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SBANKNAM1", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SBANKNAM2", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SBANKNAM3", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SBANKNAM4", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SBANKNAM5", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("RBANKCODE", DBFDataType.CHARACTER, 12)); - dbfFields.add(new DBFField("C_ACC_CRED", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("RBANKNAM1", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("RBANKNAM2", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("RBANKNAM3", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("RBANKNAM4", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("RBANKNAM5", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("PAY_DATE", DBFDataType.CHARACTER, 8)); - dbfFields.add(new DBFField("EXT_DATE", DBFDataType.CHARACTER, 8)); - dbfFields.add(new DBFField("PAY_VAL", DBFDataType.CHARACTER, 12)); - dbfFields.add(new DBFField("SUM_DEB", DBFDataType.CHARACTER, 22)); - dbfFields.add(new DBFField("SCLIENTN1", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SCLIENTN2", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SCLIENTN3", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SCLIENTN4", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SC_CODE", DBFDataType.CHARACTER, 12)); - dbfFields.add(new DBFField("ACC_DEB", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("RCLIENTN1", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("RCLIENTN2", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("RCLIENTN3", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("RCLIENTN4", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("ACC_KR_1", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("ACC_KR_2", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SP_CODE", DBFDataType.CHARACTER, 2)); - dbfFields.add(new DBFField("SPECIF_1", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SPECIF_2", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SPECIF_3", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SPECIF_4", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SPECIF_5", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SPECIF_6", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SEND_TYPE", DBFDataType.CHARACTER, 10)); - dbfFields.add(new DBFField("SERVDATE", DBFDataType.CHARACTER, 8)); - dbfFields.add(new DBFField("DOC_RESULT", DBFDataType.CHARACTER, 2)); - return dbfFields.toArray(DBFField[]::new); - } - -} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF51_Converter.java similarity index 64% rename from clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_Converter.java rename to clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF51_Converter.java index 86c92ec10..41587938f 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF08_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF51_Converter.java @@ -3,35 +3,30 @@ package ru.spcex.clearing.dbf.exporter.services.converters; import com.linuxense.javadbf.DBFDataType; import com.linuxense.javadbf.DBFField; import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.sdf.SDf08; +import ru.clearing.classes.statics.data.sdf.SDf51; import java.time.format.DateTimeFormatter; import java.util.LinkedList; import java.util.List; @Service -public class S_DF08_Converter extends DFConverter { +public class S_DF51_Converter extends DFConverter { @Override - public Object[] toObjectArray(SDf08 entity) { + public Object[] toObjectArray(SDf51 entity) { List values = new LinkedList<>(); -// values.add(convertStrToLong(entity.getNumber())); -// values.add(typeMatch(convertStrToLong(entity.getDatetime()))); // UNIX TIME + values.add(typeMatch(entity.getNumber())); + values.add(typeMatch(convertStrToLong(entity.getDatetime()))); // UNIX TIME return values.toArray(Object[]::new); } @Override public DBFField[] getDBFHeaders() { List dbfFields = new LinkedList<>(); - dbfFields.add(new DBFField("NUMBER", DBFDataType.NUMERIC, 10)); + dbfFields.add(new DBFField("NUMBER", DBFDataType.CHARACTER, 10)); dbfFields.add(new DBFField("DATETIME", DBFDataType.NUMERIC, 13)); // UNIX TIME return dbfFields.toArray(DBFField[]::new); } - Long convertStrToLong(String s) { - if (s == null) return null; - return Long.valueOf(s); - } - private static final DateTimeFormatter DATE_FMT = DateTimeFormatter.ofPattern("dd.MM.yyyy"); private static final DateTimeFormatter DATE_TIME_FMT = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"); diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF18_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF53_Converter.java similarity index 88% rename from clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF18_Converter.java rename to clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF53_Converter.java index c8fd9773d..e78e4362b 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF18_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF53_Converter.java @@ -3,15 +3,15 @@ package ru.spcex.clearing.dbf.exporter.services.converters; import com.linuxense.javadbf.DBFDataType; import com.linuxense.javadbf.DBFField; import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.sdf.SDf18; +import ru.clearing.classes.statics.data.sdf.SDf53; import java.util.LinkedList; import java.util.List; @Service -public class S_DF18_Converter extends DFConverter { +public class S_DF53_Converter extends DFConverter { @Override - public Object[] toObjectArray(SDf18 entity) { + public Object[] toObjectArray(SDf53 entity) { List values = new LinkedList<>(); values.add(typeMatch(entity.getAccount())); values.add(typeMatch(entity.getDeal())); diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java new file mode 100644 index 000000000..314a443a3 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java @@ -0,0 +1,105 @@ +package ru.spcex.clearing.dbf.exporter.services.converters; + +import com.linuxense.javadbf.DBFDataType; +import com.linuxense.javadbf.DBFField; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.sdf.SDf54; + +import java.util.LinkedList; +import java.util.List; + +@Service +public class S_DF54_Converter extends DFConverter { + @Override + public Object[] toObjectArray(SDf54 entity) { + List values = new LinkedList<>(); + values.add(typeMatch(entity.getSeg_type())); + values.add(typeMatch(entity.getDoc_type())); + values.add(typeMatch(entity.getDocnm_ref())); + values.add(typeMatch(entity.getDocnmprev())); + values.add(typeMatch(entity.getSbankcode())); + values.add(typeMatch(entity.getC_acc_deb())); + values.add(typeMatch(entity.getSbanknam1())); + values.add(typeMatch(entity.getSbanknam2())); + values.add(typeMatch(entity.getSbanknam3())); + values.add(typeMatch(entity.getSbanknam4())); + values.add(typeMatch(entity.getSbanknam5())); + values.add(typeMatch(entity.getRbankcode())); + values.add(typeMatch(entity.getC_acc_cred())); + values.add(typeMatch(entity.getRbanknam1())); + values.add(typeMatch(entity.getRbanknam2())); + values.add(typeMatch(entity.getRbanknam3())); + values.add(typeMatch(entity.getRbanknam4())); + values.add(typeMatch(entity.getRbanknam5())); + values.add(typeMatch(entity.getOp_type())); + values.add(typeMatch(entity.getOp_order())); + values.add(typeMatch(entity.getPay_date())); + values.add(typeMatch(entity.getPay_val())); + values.add(typeMatch(entity.getSum_deb())); + values.add(typeMatch(entity.getSclientn1())); + values.add(typeMatch(entity.getSclientn2())); + values.add(typeMatch(entity.getSclientn3())); + values.add(typeMatch(entity.getSclientn4())); + values.add(typeMatch(entity.getInn_deb())); + values.add(typeMatch(entity.getKpp_deb())); + values.add(typeMatch(entity.getAcc_deb())); + values.add(typeMatch(entity.getRclientn1())); + values.add(typeMatch(entity.getRclientn2())); + values.add(typeMatch(entity.getRclientn3())); + values.add(typeMatch(entity.getRclientn4())); + values.add(typeMatch(entity.getInn_cred())); + values.add(typeMatch(entity.getKpp_cred())); + values.add(typeMatch(entity.getAcc_kr_1())); + values.add(typeMatch(entity.getSpecif_1())); + values.add(typeMatch(entity.getSend_type())); + values.add(typeMatch(entity.getDoc_result())); + return values.toArray(Object[]::new); + } + + @Override + public DBFField[] getDBFHeaders() { + List dbfFields = new LinkedList<>(); + dbfFields.add(new DBFField("SEG_TYPE", DBFDataType.CHARACTER, 1)); + dbfFields.add(new DBFField("DOC_TYPE", DBFDataType.CHARACTER, 13)); + dbfFields.add(new DBFField("DOCNM_REF", DBFDataType.CHARACTER, 16)); + dbfFields.add(new DBFField("DOCNMPREV", DBFDataType.CHARACTER, 16)); + dbfFields.add(new DBFField("SBANKCODE", DBFDataType.CHARACTER, 12)); + dbfFields.add(new DBFField("C_ACC_DEB", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("SBANKNAM1", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("SBANKNAM2", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("SBANKNAM3", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("SBANKNAM4", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("SBANKNAM5", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("RBANKCODE", DBFDataType.CHARACTER, 12)); + dbfFields.add(new DBFField("C_ACC_CRED", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("RBANKNAM1", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("RBANKNAM2", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("RBANKNAM3", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("RBANKNAM4", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("RBANKNAM5", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("OP_TYPE", DBFDataType.CHARACTER, 2)); + dbfFields.add(new DBFField("OP_ORDER", DBFDataType.CHARACTER, 1)); + dbfFields.add(new DBFField("PAY_DATE", DBFDataType.CHARACTER, 8)); + dbfFields.add(new DBFField("PAY_VAL", DBFDataType.CHARACTER, 12)); + dbfFields.add(new DBFField("SUM_DEB", DBFDataType.CHARACTER, 22)); + dbfFields.add(new DBFField("SCLIENTN1", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("SCLIENTN2", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("SCLIENTN3", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("SCLIENTN4", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("INN_DEB", DBFDataType.CHARACTER, 12)); + dbfFields.add(new DBFField("KPP_DEB", DBFDataType.CHARACTER, 9)); + dbfFields.add(new DBFField("ACC_DEB", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("RCLIENTN1", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("RCLIENTN2", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("RCLIENTN3", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("RCLIENTN4", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("INN_CRED", DBFDataType.CHARACTER, 12)); + dbfFields.add(new DBFField("KPP_CRED", DBFDataType.CHARACTER, 9)); + dbfFields.add(new DBFField("ACC_KR1", DBFDataType.CHARACTER, 35)); + dbfFields.add(new DBFField("SPECIF1", DBFDataType.CHARACTER, 255)); + dbfFields.add(new DBFField("SEND_TYPE", DBFDataType.CHARACTER, 10)); + dbfFields.add(new DBFField("DOC_RESULT", DBFDataType.CHARACTER, 2)); + return dbfFields.toArray(DBFField[]::new); + } + +} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF56_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF56_Converter.java new file mode 100644 index 000000000..a0bcde368 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF56_Converter.java @@ -0,0 +1,35 @@ +package ru.spcex.clearing.dbf.exporter.services.converters; + +import com.linuxense.javadbf.DBFDataType; +import com.linuxense.javadbf.DBFField; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.sdf.SDf56; + +import java.util.LinkedList; +import java.util.List; + +@Service +public class S_DF56_Converter extends DFConverter { + @Override + public Object[] toObjectArray(SDf56 entity) { + List values = new LinkedList<>(); + values.add(typeMatch(entity.getNumber())); + values.add(convertStrToBigDecimal(entity.getStart_datetime())); // UNIX DATE TIME + values.add(convertStrToBigDecimal(entity.getEnd_datetime())); // UNIX DATE TIME + values.add(typeMatch(entity.getAccount())); + values.add(typeMatch(entity.getDeal())); + return values.toArray(Object[]::new); + } + + @Override + public DBFField[] getDBFHeaders() { + List dbfFields = new LinkedList<>(); + dbfFields.add(new DBFField("NUMBER", DBFDataType.CHARACTER, 10)); + dbfFields.add(new DBFField("START_DATETIME", DBFDataType.NUMERIC, 10)); + dbfFields.add(new DBFField("END_DATETIME", DBFDataType.NUMERIC, 10)); + dbfFields.add(new DBFField("ACCOUNT", DBFDataType.CHARACTER, 25)); + dbfFields.add(new DBFField("DEAL", DBFDataType.CHARACTER, 4)); + return dbfFields.toArray(DBFField[]::new); + } + +} diff --git a/clearing-parent/dbf-exporter/src/main/resources/application.properties b/clearing-parent/dbf-exporter/src/main/resources/application.properties index 9deff00b5..4fd39eab5 100644 --- a/clearing-parent/dbf-exporter/src/main/resources/application.properties +++ b/clearing-parent/dbf-exporter/src/main/resources/application.properties @@ -1,6 +1,4 @@ -server.port=8080 -server.servlet.context-path=/exporter -spring.main.web-application-type=servlet +spring.main.web-application-type=none export-dbf-service.hazelcast.cluster-members=10.200.200.181:5701 export-dbf-service.hazelcast.login=dev @@ -18,3 +16,10 @@ export-dbf-service.kafka-consumer.session-timeout-ms=30000 export-dbf-service.kafka-consumer.auto-offset-reset=latest export-dbf-service.kafka-consumer.linger-ms=1 export-dbf-service.kafka-consumer.buffer-memory=33554432 + +export-dbf-service.kafka-producer.bootstrap-servers=localhost:9092 +export-dbf-service.kafka-producer.acks=all +export-dbf-service.kafka-producer.retries=0 +export-dbf-service.kafka-producer.batch-size=16384 +export-dbf-service.kafka-producer.linger-ms=1 +export-dbf-service.kafka-producer.buffer-memory=33554432 diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index 81efc6be3..a6bcf628e 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -100,12 +100,19 @@ public interface Consts { String USER_SETTINGS_UPDATE = "user-settings-update"; String STATEMENT_PROCESS = "statement-process"; - String SDF04_PROCESS = "sdf04-process"; + String SDF02_PROCESS = "sdf02-process"; String SDF03_PROCESS = "sdf03-process"; + String SDF04_PROCESS = "sdf04-process"; + String SDF05_PROCESS = "sdf05-process"; + String SDF07_PROCESS = "sdf07-process"; String SDF11_PROCESS = "sdf11-process"; + String SDF51_PROCESS = "sdf51-process"; + String SDF53_PROCESS = "sdf53-process"; + String SDF54_PROCESS = "sdf54-process"; String SDF56_PROCESS = "sdf56-process"; String SDF57_PROCESS = "sdf57-process"; String EXPORT_PROCESS = "export-process"; + String EXPORT_COMPLETED = "export_completed"; String S_TRADES_IMPORTED = "s_trades-imported"; String LIM_EXPORTED = "lim_exported"; String ACCOUNT_TERMINATION = "account-termination"; From 0d296dac740f44fbfe19017700a3ac43f1c1ae6c Mon Sep 17 00:00:00 2001 From: etreshenkov Date: Thu, 18 May 2023 15:17:08 +0300 Subject: [PATCH 02/62] add RegistryCodeSqlBuilder --- .../queue/AbstractControllerTest.java | 3 +- .../spcex/clearing/models/RegistryInfo.java | 16 --- .../models/RegistryTradingParams.java | 14 ++ .../clearing/service/RegistryService.java | 26 ++-- .../builder/sql/RegistryCodeSqlBuilder.java | 58 ++++++++ .../stage/impl/FormingPaymentInstruction.java | 127 ++++++++++++++++++ .../sql/RegistryCodeSqlBuilderTest.java | 54 ++++++++ 7 files changed, 267 insertions(+), 31 deletions(-) delete mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryInfo.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryTradingParams.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilder.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstruction.java create mode 100644 clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilderTest.java diff --git a/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/AbstractControllerTest.java b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/AbstractControllerTest.java index 367f97bff..e28e28add 100644 --- a/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/AbstractControllerTest.java +++ b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/AbstractControllerTest.java @@ -26,7 +26,6 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.filter.CharacterEncodingFilter; -import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.user.User; import ru.spcex.clearing.backendapi.controller.config.*; import ru.spcex.clearing.backendapi.controller.queue.account.*; @@ -60,7 +59,6 @@ import ru.spcex.clearing.test.TestUtils; import ru.spcex.clearing.test.json.MatcherFactoryWithJson; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.iml.hazelcast.adapter.ImdgHazelcast; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; import ru.spcex.platform.utils.enumeration.IMessageResolver; @@ -158,6 +156,7 @@ import static ru.spcex.clearing.test.json.MatcherFactoryWithJson.usingIgnoringFi WebSecurityTestConfigurer.class, MessagesTestConfig.class, Jackson2HttpConverterTestConfig.class}) +//todo может быть указать пакедж а не список контроллеров @ExtendWith(SpringExtension.class) @WebMvcTest //@TestPropertySource(properties = "spring.config.location=D:/repo/mfd/clearing/clearing-parent/backend-api/src/main/resources/") diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryInfo.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryInfo.java deleted file mode 100644 index 1c618492f..000000000 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryInfo.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.spcex.clearing.models; - -import ru.spcex.platform.enumeration.RegistryCapacity; -import ru.spcex.platform.enumeration.RegistryDesignation; -import ru.spcex.platform.enumeration.RegistryInstrumentType; -import ru.spcex.platform.enumeration.RegistryUnit; - -public record RegistryInfo(RegistryDesignation registryDesignation, - RegistryInstrumentType registryInstrumentType, - RegistryCapacity registryCapacity, - RegistryUnit registryUnit) { - - public String buildSqlCondition(){ - return ""; - } -} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryTradingParams.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryTradingParams.java new file mode 100644 index 000000000..240ae96da --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryTradingParams.java @@ -0,0 +1,14 @@ +package ru.spcex.clearing.models; + +import ru.spcex.platform.enumeration.RegistryCapacity; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryInstrumentType; +import ru.spcex.platform.enumeration.RegistryUnit; + +public record RegistryTradingParams(RegistryDesignation registryDesignation, + RegistryInstrumentType registryInstrumentType, + RegistryCapacity registryCapacity, + RegistryUnit registryUnit) { + + +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java index f6ab3915f..c9b5e79cc 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java @@ -6,7 +6,7 @@ import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.models.RegistryInfo; +import ru.spcex.clearing.models.RegistryTradingParams; import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest; import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; @@ -42,7 +42,7 @@ public class RegistryService { log.trace("Found tradingClearingRegistry with id: {}", tcrByCompanyId.getId()); Registry registry = new Registry(); tcrByCompanyId.getTradingClearingRegistryType(); - RegistryInfo registryInfo = createRegistryInfoByType(tcrByCompanyId.getTradingClearingRegistryType()); + RegistryTradingParams registryInfo = createRegistryInfoByType(tcrByCompanyId.getTradingClearingRegistryType()); registry.setRegistryDesignation(registryInfo.registryDesignation().getKey()); registry.setRegistryInstrumentType(registryInfo.registryInstrumentType().getKey()); registry.setRegistryCapacity(registryInfo.registryCapacity().getKey()); @@ -55,20 +55,20 @@ public class RegistryService { } - private RegistryInfo createRegistryInfoByType(String type){ + private RegistryTradingParams createRegistryInfoByType(String type){ TradingClearingRegistryType registryType = IEnumKey.getEnumByKey(TradingClearingRegistryType.class, type); - RegistryInfo registryInfo = null; + RegistryTradingParams registryInfo = null; //todo спросить про дубль C и T switch (registryType){ - case Owner_A -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.M, RegistryCapacity.A, RegistryUnit.T); - case Client_B -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.T); - case Trustee_C, DepoOfShares_T -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.T); - case TrusteeManager_D -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.A); - case Issuer_E -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.E, RegistryUnit.R); - case ToThePlacementOrRedeem_Z -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.Z, RegistryUnit.R); - case DepoBond_H -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.R); - case DepoOfTrustedBond_N -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.C, RegistryUnit.R); - case DepoOfTrustedShares_S -> registryInfo = new RegistryInfo(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.C, RegistryUnit.T); + case Owner_A -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.M, RegistryCapacity.A, RegistryUnit.T); + case Client_B -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.T); + case Trustee_C, DepoOfShares_T -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.T); + case TrusteeManager_D -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.A); + case Issuer_E -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.E, RegistryUnit.R); + case ToThePlacementOrRedeem_Z -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.Z, RegistryUnit.R); + case DepoBond_H -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.R); + case DepoOfTrustedBond_N -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.C, RegistryUnit.R); + case DepoOfTrustedShares_S -> registryInfo = new RegistryTradingParams(RegistryDesignation.A, RegistryInstrumentType.S, RegistryCapacity.C, RegistryUnit.T); } return registryInfo; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilder.java new file mode 100644 index 000000000..bf7fd8567 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilder.java @@ -0,0 +1,58 @@ +package ru.spcex.clearing.service.builder.sql; + +import ru.spcex.clearing.models.RegistryTradingParams; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class RegistryCodeSqlBuilder { + + private List registryTradingParams = new ArrayList<>(); + + public static RegistryCodeSqlBuilder getInstance(RegistryTradingParams... tradingParams) { + return new RegistryCodeSqlBuilder(Arrays.asList(tradingParams)); + } + + private RegistryCodeSqlBuilder(List tradingParams) { + this.registryTradingParams = tradingParams; + } + + public String build() { + List conditions = new ArrayList<>(); + for (RegistryTradingParams tradingParams : this.registryTradingParams) { + StringBuilder condition = new StringBuilder(); + boolean wasAddedCondition = false; + if (tradingParams.registryDesignation() != null) { + condition.append(String.format("registryDesignation = '%s'", tradingParams.registryDesignation().getKey())); + wasAddedCondition = true; + } + if (wasAddedCondition) { + condition.append(" and "); + wasAddedCondition = false; + } + if (tradingParams.registryInstrumentType() != null) { + condition.append(String.format("registryInstrumentType = '%s'", tradingParams.registryInstrumentType().getKey())); + wasAddedCondition = true; + } + if (wasAddedCondition) { + condition.append(" and "); + wasAddedCondition = false; + } + if (tradingParams.registryCapacity() != null) { + condition.append(String.format("registryCapacity = '%s'", tradingParams.registryCapacity().getKey())); + wasAddedCondition = true; + } + if (wasAddedCondition) { + condition.append(" and "); + wasAddedCondition = false; + } + if (tradingParams.registryUnit() != null) { + condition.append(String.format("registryUnit = '%s'", tradingParams.registryUnit().getKey())); + } + conditions.add(condition); + } + return conditions.stream().collect(Collectors.joining(") or (", "(", ")")); + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstruction.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstruction.java new file mode 100644 index 000000000..70b47b67f --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstruction.java @@ -0,0 +1,127 @@ +package ru.spcex.clearing.session.stage.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.payment.PaymentInstruction; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.error.ClearingError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.clearing.session.stage.ISessionStage; +import ru.spcex.clearing.session.stage.StageResult; +import ru.spcex.clearing.session.stage.Task; +import ru.spcex.clearing.session.stage.task.InspectionPoolPayload; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryInstrumentType; +import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgId; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IEnumKey; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class FormingPaymentInstruction implements ISessionStage { + private final Logger log = LoggerFactory.getLogger(getClass()); + //todo remove (set all in single method setImdg(provider -> setImdg1();setIdGenerator();...) + private ImdgProvider imdgProvider; + private ImdgId idGenerator; + private Imdg registryImdg; + private Imdg paymentInstructionImdg; + private KafkaSender kafkaSender; + private final IMessageResolver msgResolver = new SimpleMessageResolver(); + + @Autowired + public FormingPaymentInstruction(ImdgProvider imdgProvider) { + this.imdgProvider = imdgProvider; + this.idGenerator = imdgProvider.getImdgIdGenerator(); + this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + this.paymentInstructionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); + } + + @Override + public StageResult submit(Task task) { + InspectionPoolPayload payload = (InspectionPoolPayload) task.getData(); + switch (task.getTaskType()) { + case InclusionToPool -> { + return inspectionPool(payload.getProcessedCompanyId()); + } + default -> { + throw new IllegalStateException("Unknown task type: " + task.getTaskType()); + } + } + } + + + private StageResult inspectionPool(Long processedCompanyId) { + String sqlCondition = String.format("registryDesignation in ('%s', '%s') and " + + "registryInstrumentType in ('%s', '%s') and " + + "registryUnit = '%s' and " + + "registryStatus = '%s' and " + + "settlementDate = '%s'", + RegistryDesignation.O.getKey(), RegistryDesignation.T.getKey(), + RegistryInstrumentType.S.getKey(), RegistryInstrumentType.M.getKey(), + RegistryUnit.T.getKey(), + "POOL"); + + Collection obligations = registryImdg.getCollectionObjectsBySQL(sqlCondition); + Map>> registryByGroupIdAndCompanyId = obligations.stream(). + collect(Collectors.groupingBy(Registry::getGroupId, Collectors.groupingBy(Registry::getCompanyId))); + + List insecurityGroups = new ArrayList<>(); + for (Registry currentRegistry : obligations) { + if (insecurityGroups.contains(currentRegistry.getGroupId())) { + log.debug("Skip insecurity groupId: {}", currentRegistry.getGroupId()); + continue; + } + if (IEnumKey.getEnumByKey(RegistryDesignation.class, currentRegistry.getRegistryDesignation()) == RegistryDesignation.A) { + String sqlCounterRegistryCondition = String.format("registryDesignation = '%s' and " + + "registryInstrumentType in ('%s', '%s') and " + + "registryUnit = '%s' and " + + "tradingClearingRegistryId = '%s' and " + + "companyId = '%s' and ", + RegistryDesignation.A, + RegistryInstrumentType.S.getKey(), RegistryInstrumentType.M.getKey(), + RegistryUnit.F.getKey(), + currentRegistry.getTradingClearingRegistryId(), + currentRegistry.getCompanyId()); + Registry counterRegistry = registryImdg.getSingleObjectBySQL(sqlCounterRegistryCondition); + if (currentRegistry.getBalance().compareTo(counterRegistry.getBalance()) > 0) { + log.warn("{}", msgResolver.resolve(new EnumMessage(ClearingError.InsecurityObligation, currentRegistry.getCompanyId()))); + insecurityGroups.add(currentRegistry.getGroupId()); + break; + } + currentRegistry.setRegistryStatus("OK"); + registryImdg.update(counterRegistry); + } + } + + for (Long insecuritiesGroupId : insecurityGroups) { + for (Map.Entry> entrySet : registryByGroupIdAndCompanyId.get(insecuritiesGroupId).entrySet()) { + if (entrySet.getKey().equals(processedCompanyId)) { + for (Registry registry : entrySet.getValue()) { + registry.setRegistryStatus("UNCV"); + registryImdg.update(registry); + } + } else { + for (Registry registry : entrySet.getValue()) { + registry.setRegistryStatus("FAIL"); + registryImdg.update(registry); + } + } + } + } + + return new StageResult(null, true); + } +} diff --git a/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilderTest.java b/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilderTest.java new file mode 100644 index 000000000..ca1c7b68c --- /dev/null +++ b/clearing-parent/clearing-service/src/test/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilderTest.java @@ -0,0 +1,54 @@ +package ru.spcex.clearing.service.builder.sql; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import ru.spcex.clearing.models.RegistryTradingParams; +import ru.spcex.platform.enumeration.RegistryCapacity; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryInstrumentType; +import ru.spcex.platform.enumeration.RegistryUnit; + +public class RegistryCodeSqlBuilderTest { + + @Test + public void testBuildByOneObject() { + RegistryTradingParams registryTradingParams = new RegistryTradingParams(RegistryDesignation.C, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R); + RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams); + String sql = registryCodeSqlBuilder.build(); + Assertions.assertEquals("(registryDesignation = 'C' and registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R')", sql); + + registryTradingParams = new RegistryTradingParams(null, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R); + registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams); + sql = registryCodeSqlBuilder.build(); + Assertions.assertEquals("(registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R')", sql); + + registryTradingParams = new RegistryTradingParams(RegistryDesignation.C, null, null, RegistryUnit.R); + registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams); + sql = registryCodeSqlBuilder.build(); + Assertions.assertEquals("(registryDesignation = 'C' and registryUnit = 'R')", sql); + } + + @Test + public void testBuildByFewObjects() { + RegistryTradingParams registryTradingParams_first = new RegistryTradingParams(RegistryDesignation.C, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R); + RegistryTradingParams registryTradingParams_second = new RegistryTradingParams(RegistryDesignation.O, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.F); + RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams_first, registryTradingParams_second); + String sql = registryCodeSqlBuilder.build(); + Assertions.assertEquals("(registryDesignation = 'C' and registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R')" + + " or (registryDesignation = 'O' and registryInstrumentType = 'S' and registryCapacity = 'A' and registryUnit = 'F')", sql); + + registryTradingParams_first = new RegistryTradingParams(null, RegistryInstrumentType.M, RegistryCapacity.B, RegistryUnit.R); + registryTradingParams_second = new RegistryTradingParams(null, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.F); + registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams_first, registryTradingParams_second); + sql = registryCodeSqlBuilder.build(); + Assertions.assertEquals("(registryInstrumentType = 'M' and registryCapacity = 'B' and registryUnit = 'R') or " + + "(registryInstrumentType = 'S' and registryCapacity = 'A' and registryUnit = 'F')", sql); + + registryTradingParams_first = new RegistryTradingParams(RegistryDesignation.C, null, null, RegistryUnit.R); + registryTradingParams_second = new RegistryTradingParams(null, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.F); + registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParams_first, registryTradingParams_second); + sql = registryCodeSqlBuilder.build(); + Assertions.assertEquals("(registryDesignation = 'C' and registryUnit = 'R') or " + + "(registryInstrumentType = 'S' and registryCapacity = 'A' and registryUnit = 'F')", sql); + } +} From 715328e4c9b65ea35db31228e96d65f18767600c Mon Sep 17 00:00:00 2001 From: etreshenkov Date: Thu, 18 May 2023 17:46:28 +0300 Subject: [PATCH 03/62] http://jira.mfd.msk:8088/browse/CLS-290 stage 7 --- .../models/RegistryTradingParams.java | 9 + .../builder/sql/RegistryCodeSqlBuilder.java | 2 +- .../stage/impl/FormingPaymentInstruction.java | 178 ++++++++++++------ .../stage/impl/InclusionObligations.java | 1 - 4 files changed, 134 insertions(+), 56 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryTradingParams.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryTradingParams.java index 240ae96da..ce5760087 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryTradingParams.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/models/RegistryTradingParams.java @@ -1,14 +1,23 @@ package ru.spcex.clearing.models; +import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.platform.enumeration.RegistryCapacity; import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.utils.enumeration.IEnumKey; public record RegistryTradingParams(RegistryDesignation registryDesignation, RegistryInstrumentType registryInstrumentType, RegistryCapacity registryCapacity, RegistryUnit registryUnit) { + public boolean equalByRegistry(Registry registry) { + boolean isEqualDesignation = this.registryDesignation == null || IEnumKey.getEnumByKey(RegistryDesignation.class, registry.getRegistryDesignation()) == this.registryDesignation; + boolean isEqualInstrumentType = this.registryInstrumentType == null || IEnumKey.getEnumByKey(RegistryInstrumentType.class, registry.getRegistryInstrumentType()) == this.registryInstrumentType; + boolean isEqualCapacity = this.registryCapacity == null || IEnumKey.getEnumByKey(RegistryCapacity.class, registry.getRegistryCapacity()) == this.registryCapacity; + boolean isEqualUnit = this.registryUnit == null || IEnumKey.getEnumByKey(RegistryUnit.class, registry.getRegistryUnit()) == this.registryUnit; + return isEqualDesignation && isEqualInstrumentType && isEqualCapacity && isEqualUnit; + } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilder.java index bf7fd8567..4dd315001 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilder.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/sql/RegistryCodeSqlBuilder.java @@ -9,7 +9,7 @@ import java.util.stream.Collectors; public class RegistryCodeSqlBuilder { - private List registryTradingParams = new ArrayList<>(); + private List registryTradingParams; public static RegistryCodeSqlBuilder getInstance(RegistryTradingParams... tradingParams) { return new RegistryCodeSqlBuilder(Arrays.asList(tradingParams)); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstruction.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstruction.java index 70b47b67f..92bac77ab 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstruction.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstruction.java @@ -6,9 +6,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.payment.PaymentInstruction; import ru.clearing.classes.statics.data.registry.Registry; -import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.models.RegistryTradingParams; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.clearing.service.builder.sql.RegistryCodeSqlBuilder; import ru.spcex.clearing.session.stage.ISessionStage; import ru.spcex.clearing.session.stage.StageResult; import ru.spcex.clearing.session.stage.Task; @@ -19,16 +20,12 @@ import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.EnumMessage; -import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; -import java.util.ArrayList; +import java.math.BigDecimal; import java.util.Collection; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; @Service public class FormingPaymentInstruction implements ISessionStage { @@ -64,64 +61,137 @@ public class FormingPaymentInstruction implements ISessionStage { private StageResult inspectionPool(Long processedCompanyId) { - String sqlCondition = String.format("registryDesignation in ('%s', '%s') and " + - "registryInstrumentType in ('%s', '%s') and " + - "registryUnit = '%s' and " + - "registryStatus = '%s' and " + - "settlementDate = '%s'", - RegistryDesignation.O.getKey(), RegistryDesignation.T.getKey(), - RegistryInstrumentType.S.getKey(), RegistryInstrumentType.M.getKey(), - RegistryUnit.T.getKey(), - "POOL"); + RegistryTradingParams registryTradingParamsL = new RegistryTradingParams(RegistryDesignation.L, + RegistryInstrumentType.S, null, RegistryUnit.T); + RegistryTradingParams registryTradingParamsC = new RegistryTradingParams(RegistryDesignation.C, + RegistryInstrumentType.M, null, null); + RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(registryTradingParamsL, registryTradingParamsC); + String registryCodeCondition = registryCodeSqlBuilder.build(); - Collection obligations = registryImdg.getCollectionObjectsBySQL(sqlCondition); - Map>> registryByGroupIdAndCompanyId = obligations.stream(). - collect(Collectors.groupingBy(Registry::getGroupId, Collectors.groupingBy(Registry::getCompanyId))); + Collection obligations = registryImdg.getCollectionObjectsBySQL(registryCodeCondition); - List insecurityGroups = new ArrayList<>(); - for (Registry currentRegistry : obligations) { - if (insecurityGroups.contains(currentRegistry.getGroupId())) { - log.debug("Skip insecurity groupId: {}", currentRegistry.getGroupId()); - continue; - } - if (IEnumKey.getEnumByKey(RegistryDesignation.class, currentRegistry.getRegistryDesignation()) == RegistryDesignation.A) { - String sqlCounterRegistryCondition = String.format("registryDesignation = '%s' and " + - "registryInstrumentType in ('%s', '%s') and " + - "registryUnit = '%s' and " + - "tradingClearingRegistryId = '%s' and " + - "companyId = '%s' and ", - RegistryDesignation.A, - RegistryInstrumentType.S.getKey(), RegistryInstrumentType.M.getKey(), - RegistryUnit.F.getKey(), - currentRegistry.getTradingClearingRegistryId(), - currentRegistry.getCompanyId()); - Registry counterRegistry = registryImdg.getSingleObjectBySQL(sqlCounterRegistryCondition); - if (currentRegistry.getBalance().compareTo(counterRegistry.getBalance()) > 0) { - log.warn("{}", msgResolver.resolve(new EnumMessage(ClearingError.InsecurityObligation, currentRegistry.getCompanyId()))); - insecurityGroups.add(currentRegistry.getGroupId()); - break; + List obligationsByMoney = obligations.stream().filter(registry -> + new RegistryTradingParams(RegistryDesignation.L, RegistryInstrumentType.M, null, RegistryUnit.T).equalByRegistry(registry)) + .toList(); + + for (Registry obligationByMoney : obligationsByMoney) { + String sql = String.format("tradingClearingRegistryId = %s and companyId = %s", + obligationByMoney.getTradingClearingRegistryId(), obligationByMoney.getCompanyId()); + Collection relatedRegistries = registryImdg.getCollectionObjectsBySQL(sql); + + RegistryTradingParams registryTradingParamsF = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.M, null, RegistryUnit.F); + RegistryTradingParams registryTradingParamsT = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.M, null, RegistryUnit.T); + RegistryTradingParams registryTradingParamsB = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.M, null, RegistryUnit.B); + + for (Registry relatedRegistry : relatedRegistries) { + if (registryTradingParamsF.equalByRegistry(relatedRegistry)) { + relatedRegistry.setBalance(relatedRegistry.getBalance().subtract(obligationByMoney.getBalance())); + } else if (registryTradingParamsT.equalByRegistry(relatedRegistry)) { + relatedRegistry.setSettledDebit(relatedRegistry.getSettledDebit().add(obligationByMoney.getBalance())); + } else if (registryTradingParamsB.equalByRegistry(relatedRegistry)) { + relatedRegistry.setBalance(relatedRegistry.getBalance().add(obligationByMoney.getBalance())); } - currentRegistry.setRegistryStatus("OK"); - registryImdg.update(counterRegistry); + registryImdg.update(relatedRegistry); } } - for (Long insecuritiesGroupId : insecurityGroups) { - for (Map.Entry> entrySet : registryByGroupIdAndCompanyId.get(insecuritiesGroupId).entrySet()) { - if (entrySet.getKey().equals(processedCompanyId)) { - for (Registry registry : entrySet.getValue()) { - registry.setRegistryStatus("UNCV"); - registryImdg.update(registry); - } - } else { - for (Registry registry : entrySet.getValue()) { - registry.setRegistryStatus("FAIL"); - registryImdg.update(registry); - } + List requirementsByIssue = obligations.stream().filter(registry -> + new RegistryTradingParams(RegistryDesignation.C, RegistryInstrumentType.S, null, RegistryUnit.T).equalByRegistry(registry)) + .toList(); + + for (Registry requirementByIssue : requirementsByIssue) { + String sql = String.format("tradingClearingRegistryId = %s and companyId = %s", + requirementByIssue.getTradingClearingRegistryId(), requirementByIssue.getCompanyId()); + Collection relatedRegistries = registryImdg.getCollectionObjectsBySQL(sql); + + RegistryTradingParams registryTradingParamsA = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.S, null, RegistryUnit.T); + + for (Registry relatedRegistry : relatedRegistries) { + if (registryTradingParamsA.equalByRegistry(relatedRegistry)) { + relatedRegistry.setSettledDebit(relatedRegistry.getSettledDebit().add(requirementByIssue.getBalance())); } + registryImdg.update(relatedRegistry); } } + List requirementsByMoney = obligations.stream().filter(registry -> + new RegistryTradingParams(RegistryDesignation.C, RegistryInstrumentType.M, null, RegistryUnit.T).equalByRegistry(registry)) + .toList(); + + for (Registry requirementByMoney : requirementsByMoney) { + String sql = String.format("tradingClearingRegistryId = %s and companyId = %s", + requirementByMoney.getTradingClearingRegistryId(), requirementByMoney.getCompanyId()); + Collection relatedRegistries = registryImdg.getCollectionObjectsBySQL(sql); + + RegistryTradingParams registryTradingParamsA = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.M, null, RegistryUnit.T); + + for (Registry relatedRegistry : relatedRegistries) { + if (registryTradingParamsA.equalByRegistry(relatedRegistry)) { + relatedRegistry.setSettledDebit(relatedRegistry.getSettledDebit().add(requirementByMoney.getBalance())); + } + registryImdg.update(relatedRegistry); + } + } + + List obligationsByIssue = obligations.stream().filter(registry -> + new RegistryTradingParams(RegistryDesignation.L, RegistryInstrumentType.S, null, RegistryUnit.T).equalByRegistry(registry)) + .toList(); + + for (Registry obligationByIssue : obligationsByIssue) { + String sql = String.format("tradingClearingRegistryId = %s and companyId = %s", + obligationByIssue.getTradingClearingRegistryId(), obligationByIssue.getCompanyId()); + Collection relatedRegistries = registryImdg.getCollectionObjectsBySQL(sql); + + RegistryTradingParams registryTradingParamsF = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.S, null, RegistryUnit.F); + RegistryTradingParams registryTradingParamsT = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.S, null, RegistryUnit.T); + RegistryTradingParams registryTradingParamsB = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.S, null, RegistryUnit.B); + + for (Registry relatedRegistry : relatedRegistries) { + if (registryTradingParamsF.equalByRegistry(relatedRegistry)) { + relatedRegistry.setBalance(relatedRegistry.getBalance().subtract(obligationByIssue.getBalance())); + } else if (registryTradingParamsT.equalByRegistry(relatedRegistry)) { + relatedRegistry.setSettledDebit(relatedRegistry.getSettledDebit().add(obligationByIssue.getBalance())); + } else if (registryTradingParamsB.equalByRegistry(relatedRegistry)) { + relatedRegistry.setBalance(relatedRegistry.getBalance().add(obligationByIssue.getBalance())); + } + registryImdg.update(relatedRegistry); + } + } + + for (Registry obligation : obligations) { + RegistryTradingParams registryTradingParamsLT = new RegistryTradingParams(RegistryDesignation.L, + null, null, RegistryUnit.T); + registryCodeCondition = RegistryCodeSqlBuilder.getInstance(registryTradingParamsLT).build(); + String sqlCondition = String.format("(%s) and securityId = %s and tradingClearingRegistryId = %s and companyId = %s and counterPartyId = %s", + registryCodeCondition, obligation.getSecurityId(), obligation.getTradingClearingRegistryId(), obligation.getCompanyId(), obligation.getCounterPartyId()); + Collection registries = registryImdg.getCollectionObjectsBySQL(registryCodeCondition); + + BigDecimal sumBalance = registries.stream().map(Registry::getBalance).reduce(BigDecimal.ZERO, BigDecimal::add); + PaymentInstruction paymentInstruction = createPaymentInstruction(obligation, sumBalance); + paymentInstructionImdg.insert(paymentInstruction); + obligation.setPaymentId(paymentInstruction.getId()); + registryImdg.update(obligation); + } + + + //todo send message to queue for forming sDf03 and sDf12? + return new StageResult(null, true); } + + private PaymentInstruction createPaymentInstruction(Registry registry, BigDecimal balance){ + PaymentInstruction paymentInstruction = new PaymentInstruction(); + paymentInstruction.setSenderId(registry.getCompanyId()); + paymentInstruction.setAddresseeId(registry.getCounterPartyId()); + //todo add builder for paymentInstruction + return paymentInstruction; + } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java index eea004140..b3aae427f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java @@ -67,7 +67,6 @@ public class InclusionObligations implements ISessionStage { sessionType); Collection obligations = registryImdg.getCollectionObjectsBySQL(sqlCondition); Map> registryByGroupId = obligations.stream(). - filter(registry -> registry.getCompanyId().equals(counterPartyId)). collect(Collectors.groupingBy(Registry::getGroupId)); for (Map.Entry> entrySet : registryByGroupId.entrySet()) { From df63b37e3c34500dbc61287c1ffa43e6064089a0 Mon Sep 17 00:00:00 2001 From: etreshenkov Date: Thu, 18 May 2023 17:49:14 +0300 Subject: [PATCH 04/62] http://jira.mfd.msk:8088/browse/CLS-290 stage 7 --- .../java/ru/spcex/clearing/session/stage/TaskType.java | 4 ++++ .../session/stage/impl/FormingPaymentInstruction.java | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java index e25a6d371..72a2f42e8 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java @@ -24,6 +24,10 @@ public enum TaskType { * Step 6: forming Registry on Obligations and Settlement requirements */ FormingRegistersOnOS, + /** + * step 7 + */ + FormingPaymentInstruction, /** diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstruction.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstruction.java index 92bac77ab..0867d22af 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstruction.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstruction.java @@ -50,8 +50,8 @@ public class FormingPaymentInstruction implements ISessionStage { public StageResult submit(Task task) { InspectionPoolPayload payload = (InspectionPoolPayload) task.getData(); switch (task.getTaskType()) { - case InclusionToPool -> { - return inspectionPool(payload.getProcessedCompanyId()); + case FormingPaymentInstruction -> { + return formingPaymentInstruction(payload.getProcessedCompanyId()); } default -> { throw new IllegalStateException("Unknown task type: " + task.getTaskType()); @@ -60,7 +60,7 @@ public class FormingPaymentInstruction implements ISessionStage { } - private StageResult inspectionPool(Long processedCompanyId) { + private StageResult formingPaymentInstruction(Long processedCompanyId) { RegistryTradingParams registryTradingParamsL = new RegistryTradingParams(RegistryDesignation.L, RegistryInstrumentType.S, null, RegistryUnit.T); RegistryTradingParams registryTradingParamsC = new RegistryTradingParams(RegistryDesignation.C, @@ -172,7 +172,7 @@ public class FormingPaymentInstruction implements ISessionStage { registryCodeCondition = RegistryCodeSqlBuilder.getInstance(registryTradingParamsLT).build(); String sqlCondition = String.format("(%s) and securityId = %s and tradingClearingRegistryId = %s and companyId = %s and counterPartyId = %s", registryCodeCondition, obligation.getSecurityId(), obligation.getTradingClearingRegistryId(), obligation.getCompanyId(), obligation.getCounterPartyId()); - Collection registries = registryImdg.getCollectionObjectsBySQL(registryCodeCondition); + Collection registries = registryImdg.getCollectionObjectsBySQL(sqlCondition); BigDecimal sumBalance = registries.stream().map(Registry::getBalance).reduce(BigDecimal.ZERO, BigDecimal::add); PaymentInstruction paymentInstruction = createPaymentInstruction(obligation, sumBalance); From e220d147bb89f92502b8cc8589f13fe237afec32 Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 18 May 2023 18:12:11 +0300 Subject: [PATCH 05/62] fix report tests --- .../ru/spcex/clearing/reports/config/KafkaConfig.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java index cd3b73821..3a7f95b94 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java @@ -20,9 +20,9 @@ public class KafkaConfig { return KafkaConsumerFactory.consumer(settings.getKafkaConsumer()); } -// @Autowired -// @Bean -// public Producer createProducer(ReportsServiceSettings settings) { -// return KafkaProducerFactory.producer(settings.getKafkaProducer()); -// } + @Autowired + @Bean + public Producer createProducer(ReportsServiceSettings settings) { + return KafkaProducerFactory.producer(settings.getKafkaProducer()); + } } From 8e5421900ed2b94e8590efcbb1ee5acc94f5b869 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Thu, 18 May 2023 18:52:12 +0300 Subject: [PATCH 06/62] =?UTF-8?q?backend-api=20meta=20java=20generator=20-?= =?UTF-8?q?=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=81=D1=8B=D1=80=D0=BE=D0=B3=D0=BE=20=D0=BA=D0=BE=D0=B4=D0=B0?= =?UTF-8?q?=20java=20=D0=B4=D0=BB=D1=8F=20=D1=83=D0=BF=D1=80=D0=BE=D1=89?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clearing-parent/backend-api/pom.xml | 25 + .../src/main/resources/meta/xsl/java.xsl | 467 ++++++++++++++++++ 2 files changed, 492 insertions(+) create mode 100644 clearing-parent/backend-api/src/main/resources/meta/xsl/java.xsl diff --git a/clearing-parent/backend-api/pom.xml b/clearing-parent/backend-api/pom.xml index ba7ad975c..f3b247036 100644 --- a/clearing-parent/backend-api/pom.xml +++ b/clearing-parent/backend-api/pom.xml @@ -323,6 +323,31 @@ + + + java + + transform + + + + + src/main/resources/meta + + meta.xml + + src/main/resources/meta/xsl/java.xsl + + + java_classes.java + + + + + + diff --git a/clearing-parent/backend-api/src/main/resources/meta/xsl/java.xsl b/clearing-parent/backend-api/src/main/resources/meta/xsl/java.xsl new file mode 100644 index 000000000..0b4c78501 --- /dev/null +++ b/clearing-parent/backend-api/src/main/resources/meta/xsl/java.xsl @@ -0,0 +1,467 @@ + + + + +abcdefghijklmnopqrstuvwxyz +ABCDEFGHIJKLMNOPQRSTUVWXYZ +_0123456789 + + + +// JAVA classes for DB version: + + + +/* Dictionaries */ + + + + +/* Business objects */ + + + + + // Data types + + + + + // . : - + , + + + +// ----------------- - + + + +package ru.clearing.platform.dictionary; + + +/** + * + * + * Dictionary DB table: + **/ +public class Dictionary extends AbstractDictionary { + private static final long serialVersionUID = ConstDictionarySerializable.serialVersionUID; + + + + +} + + +// -- mapstore -- +package ru.spcex.clearing.imdg.dictionary; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; +import ru.clearing.platform.dictionary.Dictionary; +import ru.spcex.clearing.imdg.base.DictionaryTMapStore; +import ru.spcex.clearing.imdg.IMDGDistributedNames; + +@Component +public class DictionaryMapStore extends DictionaryTMapStore<Dictionary> { + + public DictionaryMapStore(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate); + } + + @Override + public String getMapName() { + return IMDGDistributedNames.Map_Dictionary; + } + + @Override + public String getTableName() { + return ""; + } + + @Override + public Dictionary getDictionaryObject() { + return new Dictionary(); + } + +} + + + + + + + + + + + !! Нестандартное поле !! // FIXME Нестандартный словарь! Требуется писать код вручную. + + + + + +// ------------------ - + + +package ; + +import ru.clearing.classes.ConstSerializable; +import ru.spcex.platform.classes.base.SpcexObjectBase; +/** + * + * + * DB table: + **/ +public class extends SpcexObjectBase { + private static final long serialVersionUID = ConstSerializable.serialVersionUID; + + + +} + + +//mapstore + +// -- mapstore -- +package ru.spcex.clearing.imdg.object; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ; +import ru.spcex.clearing.imdg.base.TemplateMapStore; +import ru.spcex.platform.utils.time.TimeUtil; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; + +@Component +public class MapStore extends TemplateMapStore<> { + + public MapStore(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate); + } + + @Override + public String getMapName() { + return IMDGDistributedNames.Map_; + } + + @Override + public String getTableName() { + return ""; + } + + @Override + public String[] getFields() { + return new String[]{ + + }; + } + + @Override + public objectReader(ResultSet resultSet) throws SQLException { + object = new (); + return object; + } + + @Override + public Object[] objectToField( object) { + Object[] args = new Object[]{ + }; + return args; + } + +} + +// todo добавить класс History +package ; + +import ru.clearing.classes.ConstSerializable; +import ru.clearing.classes.objects.BusinessEvent; +import java.io.Serial; +/** + * Изменение состояния объекта + * + * DB table: _HISTORY + **/ +public class History extends BusinessEvent<> { + @Serial + private static final long serialVersionUID = ConstSerializable.serialVersionUID; + + private object; + + @Override + public getObject() { + return object; + } + + @Override + public void setObject( object) { + this.object = object; + } +} + +// -- History mapstore для журналирования -- +package ru.spcex.clearing.imdg.businessevent; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ; +import History; +import ru.spcex.clearing.imdg.base.TemplateEventMapStore; +import ru.spcex.platform.utils.time.TimeUtil; + +@Component +public class HistoryMapStore extends TemplateEventMapStore<History> { + + public HistoryMapStore(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate); + } + + @Override + public String getMapName() { + return IMDGDistributedNames.Map_History; + } + + @Override + public String getTableName() { + return "_HISTORY"; + } + + @Override + public String[] getFields() { + return new String[]{"ID","EVENT_TIME", "EVENT_USER_ID", "EVENT_TYPE", + _ + }; + } + + @Override + public Object[] objectToField(History historyLog) { + object=historyLog.getObject(); + Object[] args = new Object[]{ + historyLog.getId(), + TimeUtil.toDateFromInstant(historyLog.getEventTime()), + historyLog.getUserId(), + historyLog.getEventType(), + + }; + return args; + } + +} + + +, " + + +" + + + + +object.set(getInstantFromTimestamp(resultSet, " + + +")) + +object.set(getLocalDateFromSqlDate(resultSet, " + + +")) + +object.set(getLocalTimeFromSqlTime(resultSet, " + + +")) + +object.set(resultSet.getObject(" + + +", .class)) +; + +, + + + + +TimeUtil.toDateFromInstant(object.get()) + +TimeUtil.toDateFromLocalDate(object.get()) + +TimeUtil.toDateFromLocalTime(object.get()) + +object.get() + + + + + + + + + + // (in parent) private ; + + // DB field: + + + + + + + + + + + + + + + + + + + private ; + + // DB field: + + + // (linked to ) + + + + + + + + + + + + + + public get() { + return ; + } + public void set( value) { + this.=value; + } + + + + + + + + + + + public get() { + return ; + } + public void set( value) { + this.=value; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + upper + + + + + + + + + + + + + + + + + + + + + + + _ + + + + + + + + + + + + + + + + + + + + + From de42098a8e17a1c9e7f6690e72ad68c30e3b7e36 Mon Sep 17 00:00:00 2001 From: akulikov Date: Fri, 19 May 2023 13:02:23 +0300 Subject: [PATCH 07/62] todo for FieldRequiredRule --- .../clearing/validation/common/rules/FieldRequiredRule.java | 1 + 1 file changed, 1 insertion(+) diff --git a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java index 43c6e0e0a..f73172da4 100644 --- a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java +++ b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/FieldRequiredRule.java @@ -65,6 +65,7 @@ public record FieldRequiredRule( } @Override + // todo replace for error fieldName to fieldValue public Optional validate(ImdgValidationContext context) { R validatedObject = context.getValidatedObject(); V value = getter.apply(validatedObject); From 181291c42e8c2a80ed40146ee742c64ca424ab12 Mon Sep 17 00:00:00 2001 From: psemenkov Date: Fri, 19 May 2023 16:08:23 +0300 Subject: [PATCH 08/62] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-313?= =?UTF-8?q?=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BE?= =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BA=D0=B8,=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D1=83=20=D0=BF=D0=BE=20sFTP.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clearing-parent/dbf-exporter/pom.xml | 23 +++++ .../exporter/config/DBFExporterConfig.java | 71 -------------- .../dbf/exporter/config/ImdgConfig.java | 63 ++++++++++++ .../exporter/config/KafkaSenderConfig.java | 34 ++++--- .../dbf/exporter/config/PipelineConfig.java | 26 +++++ .../dbf/exporter/config/SFTPConfig.java | 95 ++++++++++++++++++ .../dbf/exporter/config/settings/Store.java | 45 +++++++++ .../logic/data/enums/FilenameTemplate.java | 46 +++++---- .../logic/stages/ExportFromHazelcast.java | 8 +- .../dbf/exporter/logic/stages/Journal.java | 18 +++- .../exporter/logic/stages/PrepareDBFFile.java | 20 ++-- .../services/converters/S_DF03_Converter.java | 54 +---------- .../services/converters/S_DF05_Converter.java | 2 +- .../services/converters/S_DF07_Converter.java | 12 +-- .../services/converters/S_DF53_Converter.java | 4 - .../services/converters/S_DF54_Converter.java | 2 +- .../services/converters/S_DF56_Converter.java | 4 +- .../src/main/resources/application.properties | 7 +- .../dbf/exporter/AbstractServiceTest.java | 73 ++++++++++++++ .../config/ExportDBFServiceSettingsTest.java | 24 +++++ .../dbf/exporter/config/SFTPTestConfig.java | 31 ++++++ .../dbf/exporter/services/S_DF02_Test.java | 69 +++++++++++++ .../dbf/exporter/services/S_DF03_Test.java | 77 +++++++++++++++ .../dbf/exporter/services/S_DF05_Test.java | 63 ++++++++++++ .../dbf/exporter/services/S_DF07_Test.java | 68 +++++++++++++ .../dbf/exporter/services/S_DF51_Test.java | 58 +++++++++++ .../dbf/exporter/services/S_DF53_Test.java | 61 ++++++++++++ .../dbf/exporter/services/S_DF54_Test.java | 96 +++++++++++++++++++ .../dbf/exporter/services/S_DF56_Test.java | 61 ++++++++++++ .../lim/exporter/AbstractServiceTest.java | 20 +--- 30 files changed, 1027 insertions(+), 208 deletions(-) create mode 100644 clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/ImdgConfig.java create mode 100644 clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/PipelineConfig.java create mode 100644 clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/SFTPConfig.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/AbstractServiceTest.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/ExportDBFServiceSettingsTest.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/SFTPTestConfig.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF02_Test.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF03_Test.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF05_Test.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF07_Test.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF51_Test.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF53_Test.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF54_Test.java create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF56_Test.java diff --git a/clearing-parent/dbf-exporter/pom.xml b/clearing-parent/dbf-exporter/pom.xml index 249e0f012..12f8fbc23 100644 --- a/clearing-parent/dbf-exporter/pom.xml +++ b/clearing-parent/dbf-exporter/pom.xml @@ -25,6 +25,14 @@ org.springframework.boot spring-boot-autoconfigure + + org.springframework.integration + spring-integration-sftp + + + com.fasterxml.jackson.core + jackson-databind + @@ -45,6 +53,21 @@ ru.spcex.clearing classes + + ru.spcex.clearing + classes + + + + org.springframework.boot + spring-boot-starter-test + test + + + ru.spcex.clearing + test-clearing + test + diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java index 183e5148c..7994454f4 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java @@ -1,82 +1,11 @@ package ru.spcex.clearing.dbf.exporter.config; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings; -import ru.spcex.clearing.dbf.exporter.logic.stages.ExportFromHazelcast; -import ru.spcex.clearing.dbf.exporter.logic.stages.Journal; -import ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile; -import ru.spcex.clearing.dbf.exporter.logic.stages.Stage; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; -import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; - -import java.util.LinkedList; -import java.util.List; @Configuration @EnableConfigurationProperties @ComponentScan(basePackages = {"ru.spcex.clearing.dbf.exporter"}) public class DBFExporterConfig { - - @Bean("taskExecutorHazelcastClientInitializer") - public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() { - return createThreadPoolTaskExecutor(1, true); - } - - @Bean("taskExecutorIdGeneratorAwaiter") - public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() { - return createThreadPoolTaskExecutor(1, false); - } - - @Bean("imdgProvider") - public ImdgProvider imdgProvider(@Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, - @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, - ExportDBFServiceSettings settings) { - HazelcastClientParams params = new HazelcastClientParams(); - params.setClusterMembers(settings.getHazelcast().getClusterMembers()); - params.setLogin(settings.getHazelcast().getLogin()); - params.setPassword(settings.getHazelcast().getPassword()); - return new HazelcastService(taskExecutorHazelcastClientInitializer, taskExecutorIdGeneratorAwaiter, params); - } - - @Bean("pipeline") - public List pipeline(ApplicationContext context) { - List pipeline = new LinkedList<>(); - - pipeline.add(context.getBean(PrepareDBFFile.class)); - pipeline.add(context.getBean(ExportFromHazelcast.class)); - pipeline.add(context.getBean(Journal.class)); - - return pipeline; - } - - @Bean("executor") - public ThreadPoolTaskExecutor executor(ExportDBFServiceSettings settings) { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setMaxPoolSize(settings.getCommon().getThreadsCount()); - executor.setCorePoolSize(settings.getCommon().getThreadsCount()); - executor.setThreadNamePrefix("dbf-exporter"); - executor.setWaitForTasksToCompleteOnShutdown(true); - executor.setAwaitTerminationSeconds(300); - executor.initialize(); - return executor; - } - - private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) { - ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); - if (maxPoolSz > 2) { - pool.setKeepAliveSeconds(60); - pool.setAllowCoreThreadTimeOut(true); - } - pool.setCorePoolSize(maxPoolSz); - pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion); - return pool; - } - } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/ImdgConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/ImdgConfig.java new file mode 100644 index 000000000..bc37887f9 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/ImdgConfig.java @@ -0,0 +1,63 @@ +package ru.spcex.clearing.dbf.exporter.config; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; + +@Configuration +@EnableConfigurationProperties +@ComponentScan(basePackages = {"ru.spcex.clearing.dbf.exporter"}) +public class ImdgConfig { + + @Bean("taskExecutorHazelcastClientInitializer") + public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() { + return createThreadPoolTaskExecutor(1, true); + } + + @Bean("taskExecutorIdGeneratorAwaiter") + public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() { + return createThreadPoolTaskExecutor(1, false); + } + + @Bean("imdgProvider") + public ImdgProvider imdgProvider(@Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, + @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, + ExportDBFServiceSettings settings) { + HazelcastClientParams params = new HazelcastClientParams(); + params.setClusterMembers(settings.getHazelcast().getClusterMembers()); + params.setLogin(settings.getHazelcast().getLogin()); + params.setPassword(settings.getHazelcast().getPassword()); + return new HazelcastService(taskExecutorHazelcastClientInitializer, taskExecutorIdGeneratorAwaiter, params); + } + + @Bean("executor") + public ThreadPoolTaskExecutor executor(ExportDBFServiceSettings settings) { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setMaxPoolSize(settings.getCommon().getThreadsCount()); + executor.setCorePoolSize(settings.getCommon().getThreadsCount()); + executor.setThreadNamePrefix("dbf-exporter"); + executor.setWaitForTasksToCompleteOnShutdown(true); + executor.setAwaitTerminationSeconds(300); + executor.initialize(); + return executor; + } + + private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) { + ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); + if (maxPoolSz > 2) { + pool.setKeepAliveSeconds(60); + pool.setAllowCoreThreadTimeOut(true); + } + pool.setCorePoolSize(maxPoolSz); + pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion); + return pool; + } + +} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java index 04b8b3431..687b73447 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java @@ -17,6 +17,8 @@ import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; +import java.util.function.Supplier; + //отдельный конфиг для sender чтобы сделать required false @Configuration public class KafkaSenderConfig { @@ -48,22 +50,18 @@ public class KafkaSenderConfig { } // @Autowired(required = false) - @Bean - public KafkaSender kafkaSender(KafkaTemplate kafkaTemplate, - ImdgProvider imdgProvider) { - if (kafkaTemplate == null) { - log.info("Can not create KafkaSender: no kafka-producer settings"); - return null; - } - ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator(); - return KafkaSender - .setup() - .setKafkaTemplate(kafkaTemplate) - .idGenerator(imdgIdGenerator::nextId) - .imdgProvider(s -> { - Imdg imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); - return imdg::insert; - }) - .build(); - } +@Bean +public Supplier kafkaSenderSupplier(KafkaTemplate kafkaTemplate, + ImdgProvider imdgProvider) { + ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator(); + return () -> KafkaSender + .setup() + .setKafkaTemplate(kafkaTemplate) + .idGenerator(imdgIdGenerator::nextId) + .imdgProvider(s -> { + Imdg imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); + return imdg::insert; + }) + .build(); +} } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/PipelineConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/PipelineConfig.java new file mode 100644 index 000000000..bccca7609 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/PipelineConfig.java @@ -0,0 +1,26 @@ +package ru.spcex.clearing.dbf.exporter.config; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.spcex.clearing.dbf.exporter.logic.stages.ExportFromHazelcast; +import ru.spcex.clearing.dbf.exporter.logic.stages.Journal; +import ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile; +import ru.spcex.clearing.dbf.exporter.logic.stages.Stage; + +import java.util.LinkedList; +import java.util.List; + +@Configuration +public class PipelineConfig { + @Bean("pipeline") + public List pipeline(ApplicationContext context) { + List pipeline = new LinkedList<>(); + + pipeline.add(context.getBean(PrepareDBFFile.class)); + pipeline.add(context.getBean(ExportFromHazelcast.class)); + pipeline.add(context.getBean(Journal.class)); + + return pipeline; + } +} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/SFTPConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/SFTPConfig.java new file mode 100644 index 000000000..5f07a6eac --- /dev/null +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/SFTPConfig.java @@ -0,0 +1,95 @@ +package ru.spcex.clearing.dbf.exporter.config; + +import com.jcraft.jsch.ChannelSftp; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.expression.common.LiteralExpression; +import org.springframework.integration.annotation.Gateway; +import org.springframework.integration.annotation.MessagingGateway; +import org.springframework.integration.annotation.ServiceActivator; +import org.springframework.integration.channel.DirectChannel; +import org.springframework.integration.dsl.IntegrationFlow; +import org.springframework.integration.dsl.IntegrationFlows; +import org.springframework.integration.file.remote.session.CachingSessionFactory; +import org.springframework.integration.file.remote.session.SessionFactory; +import org.springframework.integration.sftp.gateway.SftpOutboundGateway; +import org.springframework.integration.sftp.outbound.SftpMessageHandler; +import org.springframework.integration.sftp.session.DefaultSftpSessionFactory; +import org.springframework.integration.sftp.session.SftpFileInfo; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.MessageHandler; +import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings; + +import java.io.File; +import java.util.List; + +import static org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway.Command.LS; + +@Configuration +public class SFTPConfig { + + @Bean + public SessionFactory sftpSessionFactory(ExportDBFServiceSettings settings) { + DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true); + factory.setHost(settings.getStore().getServerIp()); + factory.setPort(settings.getStore().getServerPort()); + factory.setUser(settings.getStore().getUser()); + factory.setPassword(settings.getStore().getPassword()); + factory.setAllowUnknownKeys(true); + return new CachingSessionFactory<>(factory); + } + + @Bean + @ServiceActivator(inputChannel = "toSftpChannel") + public MessageHandler handler(SessionFactory sessionFactory, ExportDBFServiceSettings settings) { + SftpMessageHandler handler = new SftpMessageHandler(sessionFactory); + handler.setRemoteDirectoryExpression(new LiteralExpression(settings.getStore().getOutDir())); + handler.setAutoCreateDirectory(true); + handler.setFileNameGenerator(message -> { + if (message.getPayload() instanceof File) { + return ((File) message.getPayload()).getName(); + }else { + throw new IllegalArgumentException("File must expected as payload."); + } + }); + return handler; + } + + @MessagingGateway + public interface DbfGateway { + @Gateway(requestChannel = "toSftpChannel") + void sendToSftp(File file); + + @Gateway(requestChannel = "listSftpChannel") + List listFiles(String dir); + } + + @Bean + public MessageChannel listSftpChannel(SessionFactory sessionFactory, ExportDBFServiceSettings settings) { + DirectChannel dc = new DirectChannel(); + dc.subscribe(handlerList(sessionFactory, settings)); + return dc; + } + + @Bean + public MessageChannel toSftpChannel(SessionFactory sessionFactory, ExportDBFServiceSettings settings) { + DirectChannel dc = new DirectChannel(); + dc.subscribe(handler(sessionFactory, settings)); + return dc; + } + + @Bean + @ServiceActivator(inputChannel = "listSftpChannel") + public MessageHandler handlerList(SessionFactory sessionFactory, ExportDBFServiceSettings settings) { + String expression = "'/%s'".formatted(settings.getStore().getOutDir()); + SftpOutboundGateway sftpOutboundGateway = new SftpOutboundGateway(sessionFactory, LS.getCommand(), expression); + return sftpOutboundGateway; + } + + @Bean + public IntegrationFlow sftpOutboundListFlow(SessionFactory sessionFactory, ExportDBFServiceSettings settings) { + return IntegrationFlows.from("listSftpChannel") + .handle(new SftpOutboundGateway(sessionFactory, "ls", "payload") + ).get(); + } +} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Store.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Store.java index e1430418a..74b55277c 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Store.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Store.java @@ -3,6 +3,43 @@ package ru.spcex.clearing.dbf.exporter.config.settings; public class Store { private String outDir; + private String localTempDir; + private String user; + private String password; + private String serverIp; + private int serverPort; + + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getServerIp() { + return serverIp; + } + + public void setServerIp(String serverIp) { + this.serverIp = serverIp; + } + + public int getServerPort() { + return serverPort; + } + + public void setServerPort(int serverPort) { + this.serverPort = serverPort; + } public String getOutDir() { return outDir; @@ -11,4 +48,12 @@ public class Store { public void setOutDir(String outDir) { this.outDir = outDir; } + + public String getLocalTempDir() { + return localTempDir; + } + + public void setLocalTempDir(String localTempDir) { + this.localTempDir = localTempDir; + } } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java index 457c83e7d..03327e824 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java @@ -1,12 +1,13 @@ package ru.spcex.clearing.dbf.exporter.logic.data.enums; +import org.springframework.integration.sftp.session.SftpFileInfo; import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer; import java.io.File; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.List; import java.util.Locale; -import java.util.Objects; import static ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile.SECTION; import static ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile.outDir; @@ -14,7 +15,7 @@ import static ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile.outDir; public enum FilenameTemplate { df_section_dateTime { @Override - public String getFileName(ResultContainer resultContainer) { + public String getFileName(ResultContainer resultContainer, List files) { return appendSection(resultContainer) .append(dateTime(resultContainer)) .append(".DBF").toString(); @@ -22,19 +23,19 @@ public enum FilenameTemplate { }, df_section_dateTime_counter { @Override - public String getFileName(ResultContainer resultContainer) { + public String getFileName(ResultContainer resultContainer, List files) { return appendSection(resultContainer) .append(dateTime(resultContainer)) - .append(counter(resultContainer)) + .append(counter(resultContainer, files)) .append(".DBF").toString(); } }, df_section_dateTime_counter_mamberCode { @Override - public String getFileName(ResultContainer resultContainer) { + public String getFileName(ResultContainer resultContainer, List files) { return appendSection(resultContainer) .append(dateTime(resultContainer)) - .append(counter(resultContainer)) + .append(counter(resultContainer, files)) .append(mamberCode(resultContainer)) .append(".DBF").toString(); } @@ -58,10 +59,10 @@ public enum FilenameTemplate { return result; } - protected StringBuilder counter(ResultContainer resultContainer) { + protected StringBuilder counter(ResultContainer resultContainer, List files) { StringBuilder result = new StringBuilder(); result.append('_'); - result.append(countSameFilesInDir(resultContainer.getTableForExport().getFilePrefix(), outDir) + 1); + result.append(countSameFilesInDir(resultContainer.getTableForExport().getFilePrefix(), files) + 1); return result; } @@ -72,25 +73,22 @@ public enum FilenameTemplate { return result; } - protected Integer countSameFilesInDir(String prefixOfTable, String outDir) { + protected Integer countSameFilesInDir(String prefixOfTable, List files) { int res = 0; - File directory = new File(outDir); String timestampNow = utilFormatter.format(LocalDateTime.now()); - if (directory.exists()) { - for (File file : Objects.requireNonNull(directory.listFiles())) { - String name = file.getName(); - String[] splitName = name.split("_"); - String prefix = splitName[0]; - String timestamp = splitName[2]; + for (SftpFileInfo file : files) { + String name = file.getFilename(); + String[] splitName = name.split("_"); + String prefix = splitName[0]; + String timestamp = splitName[2]; - if (prefix.equalsIgnoreCase(prefixOfTable) && timestamp.contains(timestampNow)) { - String counter = splitName[3]; - int positionOfDot = counter.indexOf('.'); - if (positionOfDot != -1) { - counter = counter.substring(0, positionOfDot); - } - res = Integer.max(res, Integer.parseInt(counter)); + if (prefix.equalsIgnoreCase(prefixOfTable) && timestamp.contains(timestampNow)) { + String counter = splitName[3]; + int positionOfDot = counter.indexOf('.'); + if (positionOfDot != -1) { + counter = counter.substring(0, positionOfDot); } + res = Integer.max(res, Integer.parseInt(counter)); } } return res; @@ -99,7 +97,7 @@ public enum FilenameTemplate { private static final DateTimeFormatter tsFormatter = DateTimeFormatter.ofPattern("yyMMddHHmm"); private static final DateTimeFormatter utilFormatter = DateTimeFormatter.ofPattern("yyMMdd"); - public String getFileName(ResultContainer resultContainer) { + public String getFileName(ResultContainer resultContainer, List files) { return null; } } \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java index b9c819c40..e322e6e8a 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java @@ -3,9 +3,9 @@ package ru.spcex.clearing.dbf.exporter.logic.stages; import com.linuxense.javadbf.DBFField; import com.linuxense.javadbf.DBFWriter; import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.sdf.*; +import ru.spcex.clearing.dbf.exporter.config.SFTPConfig; import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings; import ru.spcex.clearing.dbf.exporter.exceptions.ConfigException; import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer; @@ -30,6 +30,7 @@ import java.util.Objects; public class ExportFromHazelcast extends Stage implements InitializingBean { private final ExportDBFServiceSettings settings; private final ImdgProvider imdgProvider; + private final SFTPConfig.DbfGateway gateway; private final S_DF02_Converter s_df02_converter; private final S_DF03_Converter s_df03_converter; @@ -44,7 +45,8 @@ public class ExportFromHazelcast extends Stage implements InitializingBean { private Charset dbfCharset; public ExportFromHazelcast(ExportDBFServiceSettings settings, - @Qualifier("imdgProvider") ImdgProvider imdgProvider, + ImdgProvider imdgProvider, + SFTPConfig.DbfGateway gateway, S_DF02_Converter s_df02_converter, S_DF03_Converter s_df03_converter, S_DF07_Converter s_df07_converter, @@ -55,6 +57,7 @@ public class ExportFromHazelcast extends Stage implements InitializingBean { S_DF56_Converter s_df56_converter) { this.settings = settings; this.imdgProvider = imdgProvider; + this.gateway = gateway; this.s_df02_converter = s_df02_converter; this.s_df03_converter = s_df03_converter; this.s_df07_converter = s_df07_converter; @@ -100,6 +103,7 @@ public class ExportFromHazelcast extends Stage implements InitializingBean { else if (value instanceof SDf56 sDf56Value) values = s_df56_converter.toObjectArray(sDf56Value); else throw new Exception("Get unknown object from imdg. Class: " + value.getClass().getSimpleName()); dbfWriter.addRecord(values); + gateway.sendToSftp(dbfFile); } writeOk = true; emptyMap = tableRows.isEmpty(); diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/Journal.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/Journal.java index 025a1819f..29a9c8cf9 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/Journal.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/Journal.java @@ -11,18 +11,22 @@ import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; import ru.spcex.clearing.platform.messaging.domain.cud.system.JournalSdf; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; import java.util.EnumMap; import java.util.Map; +import java.util.function.Supplier; import static ru.spcex.clearing.platform.messaging.domain.Consts.EXPORT_COMPLETED; @Component public class Journal extends Stage implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); - private final KafkaSender kafkaSender; + private final Supplier kafkaSender; @Autowired - public Journal(KafkaSender kafkaSender) { + public Journal(Supplier kafkaSender) { this.kafkaSender = kafkaSender; } @@ -45,7 +49,15 @@ public class Journal extends Stage implements InitializingBean { journalSdf.setDocumentName(documentNames.get(resultContainer.getTableForExport())); journalSdf.setDossierNumber(dossierNumber.get(resultContainer.getTableForExport())); journalSdf.setResultStatus(StageResult.ERROR.equals(resultContainer.getLastStageResult()) ? "NACK" : "ACK"); - kafkaSender.sendRequestToQueue(EXPORT_COMPLETED, journalSdf); + kafkaSender.get().sendRequestToQueue(EXPORT_COMPLETED, journalSdf); + + //удалим временный файл + File dbfFile = resultContainer.getFileForExport(); + try { + Files.deleteIfExists(dbfFile.toPath()); + } catch (IOException e) { + throw new RuntimeException(e); + } return StageResult.COMPLETE; } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java index f62dca17c..ff8acaed5 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java @@ -1,7 +1,9 @@ package ru.spcex.clearing.dbf.exporter.logic.stages; import org.springframework.beans.factory.InitializingBean; +import org.springframework.integration.sftp.session.SftpFileInfo; import org.springframework.stereotype.Component; +import ru.spcex.clearing.dbf.exporter.config.SFTPConfig; import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings; import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer; import ru.spcex.clearing.dbf.exporter.logic.data.enums.FilenameTemplate; @@ -14,6 +16,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.time.LocalDateTime; import java.util.EnumMap; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -22,23 +25,24 @@ import java.util.Objects; */ @Component public class PrepareDBFFile extends Stage implements InitializingBean { - public static final String SECTION = "U"; - public static final String CODE_OF_MEMBER = null; + public static final String SECTION = "S"; private final ExportDBFServiceSettings settings; public static String outDir; + private final SFTPConfig.DbfGateway gateway; - public PrepareDBFFile(ExportDBFServiceSettings settings) { + public PrepareDBFFile(ExportDBFServiceSettings settings, SFTPConfig.DbfGateway gateway) { this.settings = settings; + this.gateway = gateway; } @Override public StageResult process(ResultContainer resultContainer) { Objects.requireNonNull(resultContainer.getTableForExport()); - + List files = gateway.listFiles(settings.getStore().getOutDir()); Table table = resultContainer.getTableForExport(); LocalDateTime currentDateTime = LocalDateTime.now(); resultContainer.setRegistrationDateTime(currentDateTime); - File dbfFile = new File(nameTemplates.get(table).getFileName(resultContainer)); + File dbfFile = new File(nameTemplates.get(table).getFileName(resultContainer, files)); try { Path dbfFilePath = dbfFile.toPath(); Files.deleteIfExists(dbfFilePath); @@ -54,7 +58,7 @@ public class PrepareDBFFile extends Stage implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { - String outDirPath = settings.getStore().getOutDir(); + String outDirPath = settings.getStore().getLocalTempDir(); File outDirFile = new File(outDirPath); if (outDirFile.exists() && !outDirFile.isDirectory()) throw new IOException("Output directory " + outDirPath + " is file."); @@ -65,8 +69,8 @@ public class PrepareDBFFile extends Stage implements InitializingBean { private static final Map nameTemplates = new EnumMap<>(Table.class); static { - nameTemplates.put(Table.S_DF02, FilenameTemplate.df_section_dateTime); - nameTemplates.put(Table.S_DF03, FilenameTemplate.df_section_dateTime_counter_mamberCode); + nameTemplates.put(Table.S_DF02, FilenameTemplate.df_section_dateTime_counter); + nameTemplates.put(Table.S_DF03, FilenameTemplate.df_section_dateTime_counter); nameTemplates.put(Table.S_DF05, FilenameTemplate.df_section_dateTime); nameTemplates.put(Table.S_DF07, FilenameTemplate.df_section_dateTime_counter); nameTemplates.put(Table.S_DF51, FilenameTemplate.df_section_dateTime_counter); diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF03_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF03_Converter.java index 854ba7aa0..6eedff436 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF03_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF03_Converter.java @@ -17,15 +17,12 @@ public class S_DF03_Converter extends DFConverter { values.add(typeMatch(entity.getDoc_type())); values.add(typeMatch(entity.getDocnm_ref())); values.add(typeMatch(entity.getDocnmprev())); -// values.add(typeMatch(entity.getPriority())); -// values.add(typeMatch(entity.getSbankcode())); values.add(typeMatch(entity.getC_acc_deb())); values.add(typeMatch(entity.getSbanknam1())); values.add(typeMatch(entity.getSbanknam2())); values.add(typeMatch(entity.getSbanknam3())); values.add(typeMatch(entity.getSbanknam4())); values.add(typeMatch(entity.getSbanknam5())); -// values.add(typeMatch(entity.getRbankcode())); values.add(typeMatch(entity.getC_acc_cred())); values.add(typeMatch(entity.getRbanknam1())); values.add(typeMatch(entity.getRbanknam2())); @@ -33,31 +30,9 @@ public class S_DF03_Converter extends DFConverter { values.add(typeMatch(entity.getRbanknam4())); values.add(typeMatch(entity.getRbanknam5())); values.add(typeMatch(entity.getPay_date())); -// values.add(typeMatch(entity.getExt_date())); values.add(typeMatch(entity.getPay_val())); values.add(typeMatch(entity.getSum_deb())); -// values.add(typeMatch(entity.getSclientn1())); -// values.add(typeMatch(entity.getSclientn2())); -// values.add(typeMatch(entity.getSclientn3())); -// values.add(typeMatch(entity.getSclientn4())); -// values.add(typeMatch(entity.getSc_code())); -// values.add(typeMatch(entity.getAcc_deb())); -// values.add(typeMatch(entity.getRclientn1())); -// values.add(typeMatch(entity.getRclientn2())); -// values.add(typeMatch(entity.getRclientn3())); -// values.add(typeMatch(entity.getRclientn4())); -// values.add(typeMatch(entity.getAcc_kr_1())); -// values.add(typeMatch(entity.getAcc_kr_2())); -// values.add(typeMatch(entity.getSp_code())); values.add(typeMatch(entity.getSpecif_1())); -// values.add(typeMatch(entity.getSpecif_2())); -// values.add(typeMatch(entity.getSpecif_3())); -// values.add(typeMatch(entity.getSpecif_4())); -// values.add(typeMatch(entity.getSpecif_5())); -// values.add(typeMatch(entity.getSpecif_6())); -// values.add(typeMatch(entity.getSend_type())); -// values.add(typeMatch(entity.getServdate())); -// values.add(typeMatch(entity.getDoc_result())); values.add(typeMatch(entity.getImp_result())); return values.toArray(Object[]::new); } @@ -69,15 +44,12 @@ public class S_DF03_Converter extends DFConverter { dbfFields.add(new DBFField("DOC_TYPE", DBFDataType.CHARACTER, 4)); dbfFields.add(new DBFField("DOCNM_REF", DBFDataType.CHARACTER, 16)); dbfFields.add(new DBFField("DOCNMPREV", DBFDataType.CHARACTER, 16)); -// dbfFields.add(new DBFField("PRIORITY", DBFDataType.CHARACTER, 1)); -// dbfFields.add(new DBFField("SBANKCODE", DBFDataType.CHARACTER, 12)); dbfFields.add(new DBFField("C_ACC_DEB", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("SBANKNAM1", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("SBANKNAM2", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("SBANKNAM3", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("SBANKNAM4", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("SBANKNAM5", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("RBANKCODE", DBFDataType.CHARACTER, 12)); dbfFields.add(new DBFField("C_ACC_CRED", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("RBANKNAM1", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("RBANKNAM2", DBFDataType.CHARACTER, 35)); @@ -85,31 +57,9 @@ public class S_DF03_Converter extends DFConverter { dbfFields.add(new DBFField("RBANKNAM4", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("RBANKNAM5", DBFDataType.CHARACTER, 35)); dbfFields.add(new DBFField("PAY_DATE", DBFDataType.CHARACTER, 8)); -// dbfFields.add(new DBFField("EXT_DATE", DBFDataType.CHARACTER, 8)); -// dbfFields.add(new DBFField("PAY_VAL", DBFDataType.CHARACTER, 12)); + dbfFields.add(new DBFField("PAY_VAL", DBFDataType.CHARACTER, 12)); dbfFields.add(new DBFField("SUM_DEB", DBFDataType.CHARACTER, 22)); -// dbfFields.add(new DBFField("SCLIENTN1", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("SCLIENTN2", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("SCLIENTN3", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("SCLIENTN4", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("SC_CODE", DBFDataType.CHARACTER, 12)); -// dbfFields.add(new DBFField("ACC_DEB", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("RCLIENTN1", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("RCLIENTN2", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("RCLIENTN3", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("RCLIENTN4", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("ACC_KR_1", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("ACC_KR_2", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("SP_CODE", DBFDataType.CHARACTER, 2)); - dbfFields.add(new DBFField("SPECIF_1", DBFDataType.CHARACTER, 255)); -// dbfFields.add(new DBFField("SPECIF_2", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("SPECIF_3", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("SPECIF_4", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("SPECIF_5", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("SPECIF_6", DBFDataType.CHARACTER, 35)); -// dbfFields.add(new DBFField("SEND_TYPE", DBFDataType.CHARACTER, 10)); -// dbfFields.add(new DBFField("SERVDATE", DBFDataType.CHARACTER, 8)); -// dbfFields.add(new DBFField("DOC_RESULT", DBFDataType.CHARACTER, 2)); + dbfFields.add(new DBFField("SPECIF_1", DBFDataType.CHARACTER, 254)); dbfFields.add(new DBFField("IMP_RESULT", DBFDataType.CHARACTER, 3)); return dbfFields.toArray(DBFField[]::new); } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF05_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF05_Converter.java index 9b9a7d181..74922f6df 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF05_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF05_Converter.java @@ -25,7 +25,7 @@ public class S_DF05_Converter extends DFConverter { public DBFField[] getDBFHeaders() { List dbfFields = new LinkedList<>(); Date date = new Date(); - dbfFields.add(new DBFField("TP", DBFDataType.NUMERIC, 72, 18)); + dbfFields.add(new DBFField("TP", DBFDataType.NUMERIC, 32, 18)); dbfFields.add(new DBFField("DT", DBFDataType.DATE)); dbfFields.add(new DBFField("TM", DBFDataType.DATE)); dbfFields.add(new DBFField("PR", DBFDataType.CHARACTER, 1)); diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF07_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF07_Converter.java index aaa5f7f76..241fe6af2 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF07_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF07_Converter.java @@ -31,16 +31,16 @@ public class S_DF07_Converter extends DFConverter { public DBFField[] getDBFHeaders() { List dbfFields = new LinkedList<>(); dbfFields.add(new DBFField("ACCOUNT", DBFDataType.CHARACTER, 20)); - dbfFields.add(new DBFField("SUM", DBFDataType.NUMERIC, 72, 18)); + dbfFields.add(new DBFField("SUM", DBFDataType.NUMERIC, 32, 18)); dbfFields.add(new DBFField("MARKET", DBFDataType.CHARACTER, 1)); dbfFields.add(new DBFField("TYPE", DBFDataType.CHARACTER, 1)); dbfFields.add(new DBFField("DEAL", DBFDataType.CHARACTER, 10)); dbfFields.add(new DBFField("CLIENT_N", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("_I_N_N", DBFDataType.NUMERIC, 72, 18)); - dbfFields.add(new DBFField("_B_I_C", DBFDataType.NUMERIC, 72, 18)); - dbfFields.add(new DBFField("_S_P_E_C", DBFDataType.CHARACTER, 255)); - dbfFields.add(new DBFField("NUMBER", DBFDataType.NUMERIC, 72, 18)); - dbfFields.add(new DBFField("RESULT", DBFDataType.NUMERIC, 72, 18)); + dbfFields.add(new DBFField("_I_N_N", DBFDataType.NUMERIC, 32, 18)); + dbfFields.add(new DBFField("_B_I_C", DBFDataType.NUMERIC, 32, 18)); + dbfFields.add(new DBFField("_S_P_E_C", DBFDataType.CHARACTER, 254)); + dbfFields.add(new DBFField("NUMBER", DBFDataType.NUMERIC, 32, 18)); + dbfFields.add(new DBFField("RESULT", DBFDataType.NUMERIC, 32, 18)); return dbfFields.toArray(DBFField[]::new); } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF53_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF53_Converter.java index e78e4362b..b837cb1f9 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF53_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF53_Converter.java @@ -17,8 +17,6 @@ public class S_DF53_Converter extends DFConverter { values.add(typeMatch(entity.getDeal())); values.add(typeMatch(entity.getStatus())); values.add(typeMatch(entity.getResult())); - values.add(typeMatch(entity.getGenerationTime())); - values.add(typeMatch(entity.getGenerationId())); return values.toArray(Object[]::new); } @@ -29,8 +27,6 @@ public class S_DF53_Converter extends DFConverter { dbfFields.add(new DBFField("DEAL", DBFDataType.CHARACTER, 4)); dbfFields.add(new DBFField("STATUS", DBFDataType.NUMERIC, 32, 18)); dbfFields.add(new DBFField("RESULT", DBFDataType.NUMERIC, 32, 18)); - dbfFields.add(new DBFField("GEN_TIME", DBFDataType.DATE)); - dbfFields.add(new DBFField("GEN_ID", DBFDataType.NUMERIC)); return dbfFields.toArray(DBFField[]::new); } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java index 314a443a3..0b9aff09f 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java @@ -96,7 +96,7 @@ public class S_DF54_Converter extends DFConverter { dbfFields.add(new DBFField("INN_CRED", DBFDataType.CHARACTER, 12)); dbfFields.add(new DBFField("KPP_CRED", DBFDataType.CHARACTER, 9)); dbfFields.add(new DBFField("ACC_KR1", DBFDataType.CHARACTER, 35)); - dbfFields.add(new DBFField("SPECIF1", DBFDataType.CHARACTER, 255)); + dbfFields.add(new DBFField("SPECIF1", DBFDataType.CHARACTER, 254)); dbfFields.add(new DBFField("SEND_TYPE", DBFDataType.CHARACTER, 10)); dbfFields.add(new DBFField("DOC_RESULT", DBFDataType.CHARACTER, 2)); return dbfFields.toArray(DBFField[]::new); diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF56_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF56_Converter.java index a0bcde368..a3b29c1a0 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF56_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF56_Converter.java @@ -25,8 +25,8 @@ public class S_DF56_Converter extends DFConverter { public DBFField[] getDBFHeaders() { List dbfFields = new LinkedList<>(); dbfFields.add(new DBFField("NUMBER", DBFDataType.CHARACTER, 10)); - dbfFields.add(new DBFField("START_DATETIME", DBFDataType.NUMERIC, 10)); - dbfFields.add(new DBFField("END_DATETIME", DBFDataType.NUMERIC, 10)); + dbfFields.add(new DBFField("SDATETIME", DBFDataType.NUMERIC, 10)); + dbfFields.add(new DBFField("EDATETIME", DBFDataType.NUMERIC, 10)); dbfFields.add(new DBFField("ACCOUNT", DBFDataType.CHARACTER, 25)); dbfFields.add(new DBFField("DEAL", DBFDataType.CHARACTER, 4)); return dbfFields.toArray(DBFField[]::new); diff --git a/clearing-parent/dbf-exporter/src/main/resources/application.properties b/clearing-parent/dbf-exporter/src/main/resources/application.properties index 4fd39eab5..4a55bf4fd 100644 --- a/clearing-parent/dbf-exporter/src/main/resources/application.properties +++ b/clearing-parent/dbf-exporter/src/main/resources/application.properties @@ -7,7 +7,12 @@ export-dbf-service.hazelcast.password=dev-pass export-dbf-service.common.encoding=cp866 export-dbf-service.common.threads-count=10 -export-dbf-service.store.out-dir=d:\\trash\\clearing\\exporter\\out\\ +export-dbf-service.store.local-temp-dir=D:\\docs and T3\\clearing\\dbf\\ +export-dbf-service.store.out-dir=DocOut +export-dbf-service.store.user:tester +export-dbf-service.store.password=password +export-dbf-service.store.server-ip=10.230.238.53 +export-dbf-service.store.server-port=2222 export-dbf-service.kafka-consumer.bootstrap-servers=localhost:9092 export-dbf-service.kafka-consumer.group-id=dev-group-balance-service diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/AbstractServiceTest.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/AbstractServiceTest.java new file mode 100644 index 000000000..d4e8c0160 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/AbstractServiceTest.java @@ -0,0 +1,73 @@ +package ru.spcex.clearing.dbf.exporter; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.spcex.clearing.dbf.exporter.config.ExportDBFServiceSettingsTest; +import ru.spcex.clearing.dbf.exporter.config.PipelineConfig; +import ru.spcex.clearing.dbf.exporter.config.SFTPTestConfig; +import ru.spcex.clearing.dbf.exporter.logic.Processor; +import ru.spcex.clearing.dbf.exporter.logic.stages.ExportFromHazelcast; +import ru.spcex.clearing.dbf.exporter.logic.stages.Journal; +import ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile; +import ru.spcex.clearing.dbf.exporter.services.CommandService; +import ru.spcex.clearing.dbf.exporter.services.converters.*; +import ru.spcex.clearing.test.config.ImdgTestConfig; +import ru.spcex.clearing.test.config.KafkaTestConfig; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.nio.file.Path; +import java.nio.file.Paths; + +import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + ExportDBFServiceSettingsTest.class, + SFTPTestConfig.class, + PipelineConfig.class, + ExportFromHazelcast.class, + Journal.class, + PrepareDBFFile.class, + Processor.class, + CommandService.class, + S_DF02_Converter.class, + S_DF03_Converter.class, + S_DF05_Converter.class, + S_DF07_Converter.class, + S_DF51_Converter.class, + S_DF53_Converter.class, + S_DF54_Converter.class, + S_DF56_Converter.class, + ImdgTestConfig.class, + KafkaTestConfig.class}) +public abstract class AbstractServiceTest { + protected static final long generationId = 21L; + + @Autowired + @Qualifier("kafkaTestTemplate") + protected KafkaTemplate kafkaTemplate; + + @Autowired + @Qualifier("hazelcastServiceTest") + protected ImdgProvider imdgProvider; + + @Autowired + protected CommandService commandService; + + @BeforeAll + static void setProperty() { + Path path = Paths.get("src", "main", "resources"); + String currentPath = path.toAbsolutePath().toString(); + System.setProperty("spring.config.location", currentPath); +// Hazelcast.shutdownAll(); + } + + protected void init() { + waitAvailableImdgProviderAndAddAdminWithDefaultId(); + } +} diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/ExportDBFServiceSettingsTest.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/ExportDBFServiceSettingsTest.java new file mode 100644 index 000000000..9d3e7c076 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/ExportDBFServiceSettingsTest.java @@ -0,0 +1,24 @@ +package ru.spcex.clearing.dbf.exporter.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.spcex.clearing.dbf.exporter.config.settings.Common; +import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings; +import ru.spcex.clearing.dbf.exporter.config.settings.Store; + +@Configuration +public class ExportDBFServiceSettingsTest { + + @Bean + public ExportDBFServiceSettings settings(){ + ExportDBFServiceSettings settings = new ExportDBFServiceSettings(); + Common common = new Common(); + common.setEncoding("cp866"); + settings.setCommon(common); + Store store = new Store(); + store.setOutDir("DocOut"); + store.setLocalTempDir("D:\\docs and T3\\clearing\\dbf"); + settings.setStore(store); + return settings; + } +} diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/SFTPTestConfig.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/SFTPTestConfig.java new file mode 100644 index 000000000..5692a838a --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/config/SFTPTestConfig.java @@ -0,0 +1,31 @@ +package ru.spcex.clearing.dbf.exporter.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.integration.sftp.session.SftpFileInfo; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +@Configuration +public class SFTPTestConfig { + @Bean + public SFTPConfig.DbfGateway dbfGateway(){ + return new DGateway(); + } + + public static class DGateway implements SFTPConfig.DbfGateway{ + + @Override + public void sendToSftp(File file) { + + } + + @Override + public List listFiles(String dir) { + return new ArrayList<>(); + } + } + +} diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF02_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF02_Test.java new file mode 100644 index 000000000..65ce96a4c --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF02_Test.java @@ -0,0 +1,69 @@ +package ru.spcex.clearing.dbf.exporter.services; + +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import ru.clearing.classes.statics.data.sdf.SDf02; +import ru.spcex.clearing.dbf.exporter.AbstractServiceTest; +import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.system.JournalSdf; +import ru.spcex.platform.imdg.api.Imdg; + +import javax.annotation.PostConstruct; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; +import static ru.spcex.clearing.test.TestUtils.addRecordToKafka; +import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew; +import static ru.spcex.clearing.test.config.KafkaTestConfig.getCaptor; + +class S_DF02_Test extends AbstractServiceTest { + + @PostConstruct + public void init() { + super.init(); + } + + /** + * Тест проверяет создание строк документа DBF .
+ */ + @Test + void cdeateSdf() { + Table table = Table.S_DF02; + Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf02.class); + SDf02 sDf02 = new SDf02(); + sDf02.setGenerationId(generationId); + sDf02.setCurr_code("curr_code"); + sDf02.setAccount("account"); + sDf02.setRemainder("remainder"); + sDf02.setDeal("deal"); + sDf02.setAcc_code("acc_code"); + sDf02.setDat("dat"); + sDf02.setMarket("market"); + sDf02.setAcc_name("acc_name"); + sDf02.setAcc_type("acc_type"); + sDf02.setSumengage("sumengage"); + sDf02.setSumunblock("sumunblock"); + sDf02.setFile_type("file_type"); + sDf02.setResult("result"); + map.insert(sDf02); + SdfClearingRequest sdfClearingRequest = new SdfClearingRequest(); + sdfClearingRequest.setGroupId(generationId); + String request = getJsonStringForNew(sdfClearingRequest, generationId); + addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF02_PROCESS, 0, 0, request); + + //waiting for kafka send message (finale event) + ArgumentCaptor captor = getCaptor(kafkaTemplate); + verify(kafkaTemplate, timeout(30_000L).times(1)) + .send(captor.capture()); + + BaseRequest baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF03_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF03_Test.java new file mode 100644 index 000000000..02185e4a9 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF03_Test.java @@ -0,0 +1,77 @@ +package ru.spcex.clearing.dbf.exporter.services; + +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import ru.clearing.classes.statics.data.sdf.SDf03; +import ru.spcex.clearing.dbf.exporter.AbstractServiceTest; +import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.system.JournalSdf; +import ru.spcex.platform.imdg.api.Imdg; + +import javax.annotation.PostConstruct; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; +import static ru.spcex.clearing.test.TestUtils.addRecordToKafka; +import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew; +import static ru.spcex.clearing.test.config.KafkaTestConfig.getCaptor; + +class S_DF03_Test extends AbstractServiceTest { + + @PostConstruct + public void init() { + super.init(); + } + + /** + * Тест проверяет создание строк документа DBF .
+ */ + @Test + void cdeateSdf() { + Table table = Table.S_DF03; + Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf03.class); + SDf03 sDf03 = new SDf03(); + sDf03.setGenerationId(generationId); + sDf03.setSeg_type("seg_type"); + sDf03.setDoc_type("doc_type"); + sDf03.setDocnm_ref("docnm_ref"); + sDf03.setDocnmprev("docnmprev"); + sDf03.setC_acc_deb("c_acc_deb"); + sDf03.setSbanknam1("sbanknam1"); + sDf03.setSbanknam2("sbanknam2"); + sDf03.setSbanknam3("sbanknam3"); + sDf03.setSbanknam4("sbanknam4"); + sDf03.setSbanknam5("sbanknam5"); + sDf03.setC_acc_cred("c_acc_cred"); + sDf03.setRbanknam1("rbanknam1"); + sDf03.setRbanknam2("rbanknam2"); + sDf03.setRbanknam3("rbanknam3"); + sDf03.setRbanknam4("rbanknam4"); + sDf03.setRbanknam5("rbanknam5"); + sDf03.setPay_date("pay_date"); + sDf03.setPay_val("pay_val"); + sDf03.setSum_deb("sum_deb"); + sDf03.setSpecif_1("specif_1"); + sDf03.setImp_result("imp_result"); + map.insert(sDf03); + SdfClearingRequest sdfClearingRequest = new SdfClearingRequest(); + sdfClearingRequest.setGroupId(generationId); + String request = getJsonStringForNew(sdfClearingRequest, generationId); + addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF03_PROCESS, 0, 0, request); + + //waiting for kafka send message (finale event) + ArgumentCaptor captor = getCaptor(kafkaTemplate); + verify(kafkaTemplate, timeout(30_000L).times(1)) + .send(captor.capture()); + + BaseRequest baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF05_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF05_Test.java new file mode 100644 index 000000000..6f305c0ba --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF05_Test.java @@ -0,0 +1,63 @@ +package ru.spcex.clearing.dbf.exporter.services; + +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import ru.clearing.classes.statics.data.sdf.SDf05; +import ru.spcex.clearing.dbf.exporter.AbstractServiceTest; +import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.system.JournalSdf; +import ru.spcex.platform.imdg.api.Imdg; + +import javax.annotation.PostConstruct; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalTime; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; +import static ru.spcex.clearing.test.TestUtils.addRecordToKafka; +import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew; +import static ru.spcex.clearing.test.config.KafkaTestConfig.getCaptor; + +class S_DF05_Test extends AbstractServiceTest { + + @PostConstruct + public void init() { + super.init(); + } + + /** + * Тест проверяет создание строк документа DBF .
+ */ + @Test + void cdeateSdf() { + Table table = Table.S_DF05; + Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf05.class); + SDf05 sDf05 = new SDf05(); + sDf05.setGenerationId(generationId); + sDf05.setTp(new BigDecimal(32)); + sDf05.setDt(LocalDate.now()); + sDf05.setTm(LocalTime.now()); + sDf05.setPr("deal"); + map.insert(sDf05); + SdfClearingRequest sdfClearingRequest = new SdfClearingRequest(); + sdfClearingRequest.setGroupId(generationId); + String request = getJsonStringForNew(sdfClearingRequest, generationId); + addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF05_PROCESS, 0, 0, request); + + //waiting for kafka send message (finale event) + ArgumentCaptor captor = getCaptor(kafkaTemplate); + verify(kafkaTemplate, timeout(30_000L).times(1)) + .send(captor.capture()); + + BaseRequest baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF07_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF07_Test.java new file mode 100644 index 000000000..80ccdbb32 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF07_Test.java @@ -0,0 +1,68 @@ +package ru.spcex.clearing.dbf.exporter.services; + +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import ru.clearing.classes.statics.data.sdf.SDf07; +import ru.spcex.clearing.dbf.exporter.AbstractServiceTest; +import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.system.JournalSdf; +import ru.spcex.platform.imdg.api.Imdg; + +import javax.annotation.PostConstruct; +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; +import static ru.spcex.clearing.test.TestUtils.addRecordToKafka; +import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew; +import static ru.spcex.clearing.test.config.KafkaTestConfig.getCaptor; + +class S_DF07_Test extends AbstractServiceTest { + + @PostConstruct + public void init() { + super.init(); + } + + /** + * Тест проверяет создание строк документа DBF .
+ */ + @Test + void cdeateSdf() { + Table table = Table.S_DF07; + Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf07.class); + SDf07 sDf07 = new SDf07(); + sDf07.setGenerationId(generationId); + sDf07.setAccount("curr_code"); + sDf07.setSum(new BigDecimal(32)); + sDf07.setMarket("remainder"); + sDf07.setType("deal"); + sDf07.setDeal("acc_code"); + sDf07.setClientN("dat"); + sDf07.setInn(new BigDecimal(2435)); + sDf07.setBic(new BigDecimal(2435)); + sDf07.setSpec("acc_type"); + sDf07.setNumber(new BigDecimal(2435)); + sDf07.setResult(new BigDecimal(2435)); + map.insert(sDf07); + SdfClearingRequest sdfClearingRequest = new SdfClearingRequest(); + sdfClearingRequest.setGroupId(generationId); + String request = getJsonStringForNew(sdfClearingRequest, generationId); + addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF07_PROCESS, 0, 0, request); + + //waiting for kafka send message (finale event) + ArgumentCaptor captor = getCaptor(kafkaTemplate); + verify(kafkaTemplate, timeout(30_000L).times(1)) + .send(captor.capture()); + + BaseRequest baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF51_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF51_Test.java new file mode 100644 index 000000000..ac4aa9048 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF51_Test.java @@ -0,0 +1,58 @@ +package ru.spcex.clearing.dbf.exporter.services; + +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import ru.clearing.classes.statics.data.sdf.SDf51; +import ru.spcex.clearing.dbf.exporter.AbstractServiceTest; +import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.system.JournalSdf; +import ru.spcex.platform.imdg.api.Imdg; + +import javax.annotation.PostConstruct; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; +import static ru.spcex.clearing.test.TestUtils.addRecordToKafka; +import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew; +import static ru.spcex.clearing.test.config.KafkaTestConfig.getCaptor; + +class S_DF51_Test extends AbstractServiceTest { + + @PostConstruct + public void init() { + super.init(); + } + + /** + * Тест проверяет создание строк документа DBF .
+ */ + @Test + void cdeateSdf() { + Table table = Table.S_DF51; + Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf51.class); + SDf51 sDf51 = new SDf51(); + sDf51.setGenerationId(generationId); + sDf51.setNumber("curr_code"); + sDf51.setDatetime("245367"); + map.insert(sDf51); + SdfClearingRequest sdfClearingRequest = new SdfClearingRequest(); + sdfClearingRequest.setGroupId(generationId); + String request = getJsonStringForNew(sdfClearingRequest, generationId); + addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF51_PROCESS, 0, 0, request); + + //waiting for kafka send message (finale event) + ArgumentCaptor captor = getCaptor(kafkaTemplate); + verify(kafkaTemplate, timeout(30_000L).times(1)) + .send(captor.capture()); + + BaseRequest baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF53_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF53_Test.java new file mode 100644 index 000000000..03fac5a52 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF53_Test.java @@ -0,0 +1,61 @@ +package ru.spcex.clearing.dbf.exporter.services; + +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import ru.clearing.classes.statics.data.sdf.SDf53; +import ru.spcex.clearing.dbf.exporter.AbstractServiceTest; +import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.system.JournalSdf; +import ru.spcex.platform.imdg.api.Imdg; + +import javax.annotation.PostConstruct; +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; +import static ru.spcex.clearing.test.TestUtils.addRecordToKafka; +import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew; +import static ru.spcex.clearing.test.config.KafkaTestConfig.getCaptor; + +class S_DF53_Test extends AbstractServiceTest { + + @PostConstruct + public void init() { + super.init(); + } + + /** + * Тест проверяет создание строк документа DBF .
+ */ + @Test + void cdeateSdf() { + Table table = Table.S_DF53; + Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf53.class); + SDf53 sDf53 = new SDf53(); + sDf53.setGenerationId(generationId); + sDf53.setAccount("curr_code"); + sDf53.setDeal("245367"); + sDf53.setStatus(12345L); + sDf53.setResult(new BigDecimal(2345)); + map.insert(sDf53); + SdfClearingRequest sdfClearingRequest = new SdfClearingRequest(); + sdfClearingRequest.setGroupId(generationId); + String request = getJsonStringForNew(sdfClearingRequest, generationId); + addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF53_PROCESS, 0, 0, request); + + //waiting for kafka send message (finale event) + ArgumentCaptor captor = getCaptor(kafkaTemplate); + verify(kafkaTemplate, timeout(30_000L).times(1)) + .send(captor.capture()); + + BaseRequest baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF54_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF54_Test.java new file mode 100644 index 000000000..0491a8c0d --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF54_Test.java @@ -0,0 +1,96 @@ +package ru.spcex.clearing.dbf.exporter.services; + +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import ru.clearing.classes.statics.data.sdf.SDf54; +import ru.spcex.clearing.dbf.exporter.AbstractServiceTest; +import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.system.JournalSdf; +import ru.spcex.platform.imdg.api.Imdg; + +import javax.annotation.PostConstruct; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; +import static ru.spcex.clearing.test.TestUtils.addRecordToKafka; +import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew; +import static ru.spcex.clearing.test.config.KafkaTestConfig.getCaptor; + +class S_DF54_Test extends AbstractServiceTest { + + @PostConstruct + public void init() { + super.init(); + } + + /** + * Тест проверяет создание строк документа DBF .
+ */ + @Test + void cdeateSdf() { + Table table = Table.S_DF54; + Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf54.class); + SDf54 sDf54 = new SDf54(); + sDf54.setGenerationId(generationId); + sDf54.setSeg_type("seg_type"); + sDf54.setDoc_type("doc_type"); + sDf54.setDocnm_ref("docnm_ref"); + sDf54.setDocnmprev("docnmprev"); + sDf54.setSbankcode("sbankcode"); + sDf54.setC_acc_deb("c_acc_deb"); + sDf54.setSbanknam1("sbanknam1"); + sDf54.setSbanknam2("sbanknam2"); + sDf54.setSbanknam3("sbanknam3"); + sDf54.setSbanknam4("sbanknam4"); + sDf54.setSbanknam5("sbanknam5"); + sDf54.setRbankcode("rbankcode"); + sDf54.setC_acc_cred("c_acc_cred"); + sDf54.setRbanknam1("rbanknam1"); + sDf54.setRbanknam2("rbanknam2"); + sDf54.setRbanknam3("rbanknam3"); + sDf54.setRbanknam4("rbanknam4"); + sDf54.setRbanknam5("rbanknam5"); + sDf54.setOp_type("op_type"); + sDf54.setOp_order("op_order"); + sDf54.setPay_date("pay_date"); + sDf54.setPay_val("pay_val"); + sDf54.setSum_deb("sum_deb"); + sDf54.setSclientn1("sclientn1"); + sDf54.setSclientn2("sclientn2"); + sDf54.setSclientn3("sclientn3"); + sDf54.setSclientn4("sclientn4"); + sDf54.setInn_deb("inn_deb"); + sDf54.setKpp_deb("kpp_deb"); + sDf54.setAcc_deb("acc_deb"); + sDf54.setRclientn1("rclientn1"); + sDf54.setRclientn2("rclientn2"); + sDf54.setRclientn3("rclientn3"); + sDf54.setRclientn4("rclientn4"); + sDf54.setInn_cred("inn_cred"); + sDf54.setKpp_cred("kpp_cred"); + sDf54.setAcc_kr_1("acc_kr_1"); + sDf54.setSpecif_1("specif_1"); + sDf54.setSend_type("send_type"); + sDf54.setDoc_result("doc_result"); + map.insert(sDf54); + SdfClearingRequest sdfClearingRequest = new SdfClearingRequest(); + sdfClearingRequest.setGroupId(generationId); + String request = getJsonStringForNew(sdfClearingRequest, generationId); + addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF54_PROCESS, 0, 0, request); + + //waiting for kafka send message (finale event) + ArgumentCaptor captor = getCaptor(kafkaTemplate); + verify(kafkaTemplate, timeout(30_000L).times(1)) + .send(captor.capture()); + + BaseRequest baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF56_Test.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF56_Test.java new file mode 100644 index 000000000..4e7beff0d --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/services/S_DF56_Test.java @@ -0,0 +1,61 @@ +package ru.spcex.clearing.dbf.exporter.services; + +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import ru.clearing.classes.statics.data.sdf.SDf56; +import ru.spcex.clearing.dbf.exporter.AbstractServiceTest; +import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.system.JournalSdf; +import ru.spcex.platform.imdg.api.Imdg; + +import javax.annotation.PostConstruct; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; +import static ru.spcex.clearing.test.TestUtils.addRecordToKafka; +import static ru.spcex.clearing.test.TestUtils.getJsonStringForNew; +import static ru.spcex.clearing.test.config.KafkaTestConfig.getCaptor; + +class S_DF56_Test extends AbstractServiceTest { + + @PostConstruct + public void init() { + super.init(); + } + + /** + * Тест проверяет создание строк документа DBF .
+ */ + @Test + void cdeateSdf() { + Table table = Table.S_DF56; + Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), SDf56.class); + SDf56 sDf56 = new SDf56(); + sDf56.setGenerationId(generationId); + sDf56.setNumber("seg_type"); + sDf56.setStart_datetime("23456"); + sDf56.setEnd_datetime("345678"); + sDf56.setAccount("docnmprev"); + sDf56.setDeal("sbankcode"); + map.insert(sDf56); + SdfClearingRequest sdfClearingRequest = new SdfClearingRequest(); + sdfClearingRequest.setGroupId(generationId); + String request = getJsonStringForNew(sdfClearingRequest, generationId); + addRecordToKafka((MockConsumer) commandService.getConsumer(), Consts.SDF56_PROCESS, 0, 0, request); + + //waiting for kafka send message (finale event) + ArgumentCaptor captor = getCaptor(kafkaTemplate); + verify(kafkaTemplate, timeout(30_000L).times(1)) + .send(captor.capture()); + + BaseRequest baseRequestResult = (BaseRequest) captor.getValue().value(); + JournalSdf journalSdf = (JournalSdf) baseRequestResult.getRequestPayload(); + assertEquals(generationId, journalSdf.getRegistrationNumber()); + } +} \ No newline at end of file diff --git a/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/AbstractServiceTest.java b/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/AbstractServiceTest.java index d216e40dd..103207f84 100644 --- a/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/AbstractServiceTest.java +++ b/clearing-parent/lim-exporter/src/test/java/ru/spcex/clearing/lim/exporter/AbstractServiceTest.java @@ -1,19 +1,14 @@ package ru.spcex.clearing.lim.exporter; -import org.apache.kafka.clients.producer.MockProducer; -import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.Producer; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.test.TestUtils; import ru.spcex.clearing.test.config.ImdgTestConfig; import ru.spcex.clearing.test.config.KafkaTestConfig; import ru.spcex.platform.imdg.api.Imdg; @@ -21,8 +16,6 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import java.time.LocalDate; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; import static ru.spcex.clearing.test.config.ImdgTestConfig.currentID; import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId; @@ -40,10 +33,10 @@ public abstract class AbstractServiceTest { protected Long securityIdFirst = 12L; protected Long securityIdSecond = 23L; - @Captor - protected ArgumentCaptor producerRecord; - @MockBean - protected MockProducer mockProducer; + @Autowired + @Qualifier("mockProducer") + protected Producer mockProducer; + @Autowired @Qualifier("hazelcastServiceTest") protected ImdgProvider imdgProvider; @@ -52,8 +45,5 @@ public abstract class AbstractServiceTest { waitAvailableImdgProviderAndAddAdminWithDefaultId(); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); - - TestUtils.FutureRecordMetadata future = spy(new TestUtils.FutureRecordMetadata()); - doReturn(future).when(mockProducer).send(producerRecord.capture()); } } From f7b129bf2459069cb817c1f79d31fa59d80595ee Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 19 May 2023 18:26:31 +0300 Subject: [PATCH 09/62] =?UTF-8?q?dbf-exporter=20http://jira.mfd.msk:8088/b?= =?UTF-8?q?rowse/CLS-313=D0=B8=D0=BB=20=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=B5=D1=82=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8E=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D1=81=D0=B8=D0=BD=D0=B3=D0=B0=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dbf/exporter/logic/data/enums/FilenameTemplate.java | 4 ++++ .../clearing/dbf/exporter/logic/stages/PrepareDBFFile.java | 2 ++ 2 files changed, 6 insertions(+) diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java index 03327e824..d534771cb 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java @@ -79,10 +79,14 @@ public enum FilenameTemplate { for (SftpFileInfo file : files) { String name = file.getFilename(); String[] splitName = name.split("_"); + if (splitName.length < 3) + throw new IllegalArgumentException("Filename did not contains 3 or 4 separator \"_\": " + name); String prefix = splitName[0]; String timestamp = splitName[2]; if (prefix.equalsIgnoreCase(prefixOfTable) && timestamp.contains(timestampNow)) { + if (splitName.length < 4) + throw new IllegalArgumentException("Filename did not contains 4 separator \"_\": " + name); String counter = splitName[3]; int positionOfDot = counter.indexOf('.'); if (positionOfDot != -1) { diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java index ff8acaed5..2b88238c0 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java @@ -39,6 +39,7 @@ public class PrepareDBFFile extends Stage implements InitializingBean { public StageResult process(ResultContainer resultContainer) { Objects.requireNonNull(resultContainer.getTableForExport()); List files = gateway.listFiles(settings.getStore().getOutDir()); + log.debug("From sFTP dir \"{}\" list {} file names.", settings.getStore().getOutDir(), files.size()); Table table = resultContainer.getTableForExport(); LocalDateTime currentDateTime = LocalDateTime.now(); resultContainer.setRegistrationDateTime(currentDateTime); @@ -64,6 +65,7 @@ public class PrepareDBFFile extends Stage implements InitializingBean { throw new IOException("Output directory " + outDirPath + " is file."); if (!outDirFile.exists()) Files.createDirectories(outDirFile.toPath()); this.outDir = outDirPath; + log.info("Output directory: {}", outDirFile.getAbsolutePath()); } private static final Map nameTemplates = new EnumMap<>(Table.class); From 8755f3e1ca08a065b51c7115b2eb9cd767d2a4f2 Mon Sep 17 00:00:00 2001 From: psemenkov Date: Fri, 19 May 2023 18:35:26 +0300 Subject: [PATCH 10/62] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-313?= =?UTF-8?q?=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BE?= =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BA=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exporter/config/KafkaSenderConfig.java | 30 +++++++++---------- .../logic/data/enums/FilenameTemplate.java | 1 + .../data/enums/FilenameTemplateTest.java | 28 +++++++++++++++++ 3 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplateTest.java diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java index 687b73447..bd4994aca 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaSenderConfig.java @@ -40,7 +40,6 @@ public class KafkaSenderConfig { return KafkaProducerFactory.producerFactory(kafkaSettings); } -// @Autowired(required = false) @Bean("kafkaTemplate") public KafkaTemplate kafkaTemplate(ProducerFactory pf) { if (pf == null) { @@ -49,19 +48,18 @@ public class KafkaSenderConfig { return new KafkaTemplate<>(pf); } -// @Autowired(required = false) -@Bean -public Supplier kafkaSenderSupplier(KafkaTemplate kafkaTemplate, - ImdgProvider imdgProvider) { - ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator(); - return () -> KafkaSender - .setup() - .setKafkaTemplate(kafkaTemplate) - .idGenerator(imdgIdGenerator::nextId) - .imdgProvider(s -> { - Imdg imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); - return imdg::insert; - }) - .build(); -} + @Bean + public Supplier kafkaSenderSupplier(KafkaTemplate kafkaTemplate, + ImdgProvider imdgProvider) { + ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator(); + return () -> KafkaSender + .setup() + .setKafkaTemplate(kafkaTemplate) + .idGenerator(imdgIdGenerator::nextId) + .imdgProvider(s -> { + Imdg imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); + return imdg::insert; + }) + .build(); + } } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java index d534771cb..bc51d59e6 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplate.java @@ -77,6 +77,7 @@ public enum FilenameTemplate { int res = 0; String timestampNow = utilFormatter.format(LocalDateTime.now()); for (SftpFileInfo file : files) { + if (file.isDirectory()) continue; String name = file.getFilename(); String[] splitName = name.split("_"); if (splitName.length < 3) diff --git a/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplateTest.java b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplateTest.java new file mode 100644 index 000000000..a59594bc4 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/test/java/ru/spcex/clearing/dbf/exporter/logic/data/enums/FilenameTemplateTest.java @@ -0,0 +1,28 @@ +package ru.spcex.clearing.dbf.exporter.logic.data.enums; + +import com.jcraft.jsch.ChannelSftp.LsEntry; +import org.junit.jupiter.api.Test; +import org.springframework.integration.sftp.session.SftpFileInfo; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +class FilenameTemplateTest { + + @Test + void countSameFilesInDir() { + LsEntry lsEntry = mock(LsEntry.class); + doReturn("DF-02_S_PRC2305191321_1.DBF").when(lsEntry).getFilename(); + SftpFileInfo sftpFileInfo = spy(new SftpFileInfo(lsEntry)); + doReturn(false).when(sftpFileInfo).isDirectory(); + List files = List.of(sftpFileInfo); + int count = FilenameTemplate.df_section_dateTime.countSameFilesInDir("DF-02", files); + assertEquals(1, count); + +// doReturn("DF-02_S_PRC230").when(lsEntry).getFilename(); +// count = FilenameTemplate.df_section_dateTime.countSameFilesInDir("DF-02", files); +// assertEquals(0, count); + } +} \ No newline at end of file From b80431f22e03d02ecfb624a9ec932288287e2503 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 19 May 2023 19:05:19 +0300 Subject: [PATCH 11/62] =?UTF-8?q?clearing-service=20CLS-290=20=D1=80=D0=B5?= =?UTF-8?q?=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20stage?= =?UTF-8?q?=206,=208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stage/impl/FormingRegistersOnOS.java | 16 ++- .../session/stage/impl/UnlockResources.java | 107 +++++++++++------- .../task/FormingRegistersOnOSPayload.java | 5 + ...tionsAndSettlementRequirementsPayload.java | 31 ----- .../stage/task/UnlockResourcesPayload.java | 9 -- .../ImdgTransactionProviderHazelcast.java | 5 + 6 files changed, 80 insertions(+), 93 deletions(-) create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/FormingRegistersOnOSPayload.java delete mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RegistryOnObligationsAndSettlementRequirementsPayload.java diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingRegistersOnOS.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingRegistersOnOS.java index 5204abe62..54b16f861 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingRegistersOnOS.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingRegistersOnOS.java @@ -9,7 +9,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.session.stage.ISessionStage; import ru.spcex.clearing.session.stage.StageResult; import ru.spcex.clearing.session.stage.Task; -import ru.spcex.clearing.session.stage.task.RegistryOnObligationsAndSettlementRequirementsPayload; +import ru.spcex.clearing.session.stage.task.FormingRegistersOnOSPayload; import ru.spcex.clearing.session.stage.util.RegistryUtil; import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryInstrumentType; @@ -39,10 +39,10 @@ public class FormingRegistersOnOS implements ISessionStage { @Override public StageResult submit(Task task) { - RegistryOnObligationsAndSettlementRequirementsPayload payload = (RegistryOnObligationsAndSettlementRequirementsPayload) task.getData(); + FormingRegistersOnOSPayload payload = (FormingRegistersOnOSPayload) task.getData(); switch (task.getTaskType()) { case FormingRegistersOnOS -> { - return createRegistryOnObligationsAndSettlementRequirements(payload.getSessionId()); + return createRegistryOnObligationsAndSettlementRequirements(); } default -> { throw new IllegalStateException("Unknown task type: " + task.getTaskType()); @@ -53,12 +53,10 @@ public class FormingRegistersOnOS implements ISessionStage { /** * Select Registry by: registryCode = [O/T][S/M][*][T] & registryStatus=OK * - * @param sessionId * @return */ - protected Collection selectRegistry(Long sessionId) { - String registrySQL = "sessionId = " + sessionId; - registrySQL += " and (registryDesignation=" + RegistryDesignation.O.getKey() + " or registryDesignation=" + RegistryDesignation.T.getKey() + ")"; + protected Collection selectRegistry() { + String registrySQL = "(registryDesignation=" + RegistryDesignation.O.getKey() + " or registryDesignation=" + RegistryDesignation.T.getKey() + ")"; registrySQL += " and (registryInstrumentType=" + RegistryInstrumentType.S.getKey() + " or registryInstrumentType=" + RegistryInstrumentType.M.getKey() + ")"; registrySQL += " and (registryUnit=" + RegistryUnit.T.getKey() + ")"; registrySQL += " and registryStatus=" + RegistryStatus.OK.getKey() + ")"; @@ -67,8 +65,8 @@ public class FormingRegistersOnOS implements ISessionStage { return result; } - protected StageResult createRegistryOnObligationsAndSettlementRequirements(Long sessionId) { - Collection forRegistries = selectRegistry(sessionId); + protected StageResult createRegistryOnObligationsAndSettlementRequirements() { + Collection forRegistries = selectRegistry(); ArrayList newRegistries = new ArrayList<>(); //todo oreder by обрабатываться группами по полю registry.groupId diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/UnlockResources.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/UnlockResources.java index c563c84b5..91c0a60f2 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/UnlockResources.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/UnlockResources.java @@ -15,6 +15,7 @@ import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryUnit; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.ImdgTransaction; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; @@ -26,10 +27,12 @@ import java.util.Collection; public class UnlockResources implements ISessionStage { private final Logger log = LoggerFactory.getLogger(getClass()); + protected final ImdgProvider imdgProvider; private final Imdg registryImdg; @Autowired public UnlockResources(ImdgProvider imdgProvider) { + this.imdgProvider = imdgProvider; this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); } @@ -39,7 +42,7 @@ public class UnlockResources implements ISessionStage { switch (task.getTaskType()) { case UnlockResources -> { UnlockResourcesPayload payload = (UnlockResourcesPayload) task.getData(); - return unlockResources(payload.getSdfMode(), payload.getSessionId(), + return unlockResources(payload.getSdfMode(), payload.getAccount(), payload.getSecurityId(), payload.getFullNames(), @@ -52,26 +55,18 @@ public class UnlockResources implements ISessionStage { } } - /** - * Select Registry by: account; fullName* / securityId - */ - protected Collection selectRegistry(Long sessionId, String account, Long securityId, Collection fullNames) { + protected Collection selectRegistryForSDF04(String account, Collection fullNames) { ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); - ImdgPredicate queryPart; - if (securityId != null) { - queryPart = pb.in("securityId", securityId); - } else if (fullNames != null && !fullNames.isEmpty()) { - queryPart = pb.in("fullName", fullNames.toArray(new String[fullNames.size()])); - } else { - throw new IllegalArgumentException("Required securityId or fullNames"); - } ImdgPredicate query = pb.and( pb.and( - pb.equals("sessionId", sessionId), - pb.equals("registryDesignation", RegistryDesignation.A.getKey()) // не все нужны, только с этим кодом отфильтруем. + pb.equals("registryDesignation", RegistryDesignation.A.getKey()), + pb.equals("registryInstrumentType", RegistryInstrumentType.M.getKey()), + // pb.equals("registryCapacity", *), + pb.or(pb.equals("registryUnit", RegistryUnit.F.getKey()), + pb.equals("registryUnit", RegistryUnit.B.getKey())) ), pb.equals("account", account), - queryPart + pb.in("fullName", fullNames.toArray(new String[fullNames.size()])) ); Collection result = registryImdg.getCollectionObjectsByPredicate(query); @@ -79,50 +74,74 @@ public class UnlockResources implements ISessionStage { return result; } + /** + * Select Registry by: account; fullName* / securityId + */ + protected Collection selectRegistryForSDF12(String account, Long securityId) { + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + ImdgPredicate query = pb.and( + pb.and( + pb.equals("registryDesignation", RegistryDesignation.A.getKey()), + pb.equals("registryInstrumentType", RegistryInstrumentType.S.getKey()), + // pb.equals("registryCapacity", *), + pb.or(pb.equals("registryUnit", RegistryUnit.F.getKey()), + pb.equals("registryUnit", RegistryUnit.B.getKey())) + ), + pb.equals("account", account), + pb.in("securityId", securityId) + ); + + Collection result = registryImdg.getCollectionObjectsByPredicate(query); + log.trace("Selected {} registry's by sql: {}", result.size(), query); + return result; + } + + /** * @param sdfMode UnlockResourcesPayload.sdfMode - * @param sessionId * @param account * @param securityId * @param fullNames * @return */ - protected StageResult unlockResources(String sdfMode, Long sessionId, String account, Long securityId, Collection fullNames, BigDecimal value) { - Collection forRegistries = selectRegistry(sessionId, account, securityId, fullNames); + protected StageResult unlockResources(String sdfMode, String account, Long securityId, Collection fullNames, BigDecimal value) { + Collection forRegistries; - //todo при перезапуске после незапланированного завершения стадии: надо ли проверять уже созданные регистры и не создавать дубликаты? if (UnlockResourcesPayload.MODE_SDF04.equals(sdfMode)) { - forRegistries = forRegistries.stream().filter( - (Registry r) -> - RegistryDesignation.A.equalsByKey(r.getRegistryDesignation()) - && - RegistryInstrumentType.M.equalsByKey(r.getRegistryInstrumentType()) - && - (RegistryUnit.F.equalsByKey(r.getRegistryUnit()) || RegistryUnit.B.equalsByKey(r.getRegistryUnit())) - ).toList(); + forRegistries = selectRegistryForSDF04(account, fullNames); } else if (UnlockResourcesPayload.MODE_SDF12.equals(sdfMode)) { - forRegistries = forRegistries.stream().filter( - (Registry r) -> - RegistryDesignation.A.equalsByKey(r.getRegistryDesignation()) - && - RegistryInstrumentType.S.equalsByKey(r.getRegistryInstrumentType()) - && - (RegistryUnit.F.equalsByKey(r.getRegistryUnit()) || RegistryUnit.B.equalsByKey(r.getRegistryUnit())) - ).toList(); + forRegistries = selectRegistryForSDF12(account, securityId); } else { throw new IllegalArgumentException("Mode not support: " + sdfMode); } - for (Registry registry : forRegistries) { - boolean modified = unlockRegistry(registry, value); - if (modified) { - registry.setUpdated(Instant.now()); - registryImdg.update(registry); - log.trace("Registry {} changed; value +- registry", - registry.getId(), registry.getRegistryCode(), value); + ImdgTransaction tx = imdgProvider.newTransaction(); + boolean txOk = false; + try { + log.debug("Processing transaction {}, input {} registers.", tx, forRegistries.size()); + Imdg registryTxImdg = tx.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + int nUpdates = 0; + for (Registry registry : forRegistries) { + boolean modified = unlockRegistry(registry, value); + if (modified) { + registry.setUpdated(Instant.now()); + registryTxImdg.update(registry); + nUpdates++; + log.trace("Registry {} (registryCode={}) changed; value +- {}", + registry.getId(), registry.getRegistryCode(), value); + } + } + log.info("Updated {} registry's (under transaction {}", nUpdates, tx); + txOk = true; + } finally { + if (txOk) { + log.debug("Commit transaction {}.", tx); + tx.commitTransaction(); + } else { + log.info("Rollback transaction {}", tx); + tx.rollbackTransaction(); } } - //todo рекомендуется делать транзакцией. StageResult> res = new StageResult<>(null, true); res.setStageResult(forRegistries); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/FormingRegistersOnOSPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/FormingRegistersOnOSPayload.java new file mode 100644 index 000000000..c09807ebb --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/FormingRegistersOnOSPayload.java @@ -0,0 +1,5 @@ +package ru.spcex.clearing.session.stage.task; + +public class FormingRegistersOnOSPayload { + +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RegistryOnObligationsAndSettlementRequirementsPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RegistryOnObligationsAndSettlementRequirementsPayload.java deleted file mode 100644 index e0ddc15da..000000000 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RegistryOnObligationsAndSettlementRequirementsPayload.java +++ /dev/null @@ -1,31 +0,0 @@ -package ru.spcex.clearing.session.stage.task; - -public class RegistryOnObligationsAndSettlementRequirementsPayload { - private Long sessionId; -// private Long companyId; -// private Long securityId; - - public Long getSessionId() { - return sessionId; - } - - public void setSessionId(Long sessionId) { - this.sessionId = sessionId; - } - -// public Long getCompanyId() { -// return companyId; -// } -// -// public void setCompanyId(Long companyId) { -// this.companyId = companyId; -// } -// -// public Long getSecurityId() { -// return securityId; -// } -// -// public void setSecurityId(Long securityId) { -// this.securityId = securityId; -// } -} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/UnlockResourcesPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/UnlockResourcesPayload.java index 1b9525f23..fc16b5d2b 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/UnlockResourcesPayload.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/UnlockResourcesPayload.java @@ -12,8 +12,6 @@ public class UnlockResourcesPayload { */ private String sdfMode; - private Long sessionId; - /** * sDf04.c_acc_cred * sDf12.depoCodeSender @@ -46,13 +44,6 @@ public class UnlockResourcesPayload { } - public Long getSessionId() { - return sessionId; - } - - public void setSessionId(Long sessionId) { - this.sessionId = sessionId; - } public String getAccount() { return account; diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionProviderHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionProviderHazelcast.java index 34e9ea3b1..e9d1d0380 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionProviderHazelcast.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgTransactionProviderHazelcast.java @@ -68,4 +68,9 @@ public class ImdgTransactionProviderHazelcast implements ImdgTransaction { public void setHz(HazelcastInstance hz) { this.hz = hz; } + + @Override + public String toString() { + return "ImdgTransaction{" + (ctx == null ? null : ctx.getTxnId()) + "}"; + } } From 6bdfb36c524ed9474d0ae6280ca3cbaa8e22f66e Mon Sep 17 00:00:00 2001 From: ialbert Date: Fri, 19 May 2023 19:23:50 +0300 Subject: [PATCH 12/62] http://jira.mfd.msk:8088/browse/CLS-290 --- .../session/stage/impl/RegistryBuilder.java | 153 +++++++++++++++ .../session/stage/impl/RegistryUpdater.java | 66 +++++++ .../RequirmentsAndObligationCreation.java | 180 ++++++++++++++++++ .../enumeration/BalanceDimension.java | 20 ++ .../ru/spcex/platform/enumeration/ISide.java | 15 ++ .../platform/enumeration/MoneyFlowSide.java | 13 +- .../platform/enumeration/RegistryStatus.java | 2 +- .../ru/spcex/platform/enumeration/Side.java | 13 +- .../iml/hazelcast/adapter/ImdgHazelcast.java | 9 + .../java/ru/spcex/platform/imdg/api/Imdg.java | 5 + 10 files changed, 473 insertions(+), 3 deletions(-) create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryBuilder.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryUpdater.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java create mode 100644 platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/BalanceDimension.java create mode 100644 platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ISide.java diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryBuilder.java new file mode 100644 index 000000000..45a21e5c2 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryBuilder.java @@ -0,0 +1,153 @@ +package ru.spcex.clearing.session.stage.impl; + +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.execution.ExecutionCommon; +import ru.clearing.classes.statics.data.execution.ExecutionDeposit; +import ru.clearing.classes.statics.data.execution.ExecutionFond; +import ru.clearing.classes.statics.data.misc.Market; +import ru.clearing.classes.statics.data.misc.Session; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.session.stage.util.RegistryUtil; +import ru.spcex.platform.classes.base.interfaces.ExecutionType; +import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +public class RegistryBuilder { + public static RegistryBuilder builder() { + return new RegistryBuilder(); + } + + private RegistryBuilder() { + } + + private Imdg companyImdg; + private Imdg tradingClearingRegistryImdg; + private Imdg accountImdg; + private Imdg marketImdg; + private Imdg sessionImdg; + private ExecutionCommon exec; + private RegistryDesignation regDsgn; + + public RegistryBuilder imdg(ImdgProvider imdgProvider) { + this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); + this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); + this.marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, Market.class); + this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); + return this; + } + + public RegistryBuilder exec(ExecutionCommon exec) { + this.exec = exec; + return this; + } + + public RegistryBuilder registryDesignation(RegistryDesignation registryDesignation) { + this.regDsgn = registryDesignation; + return this; + } + + + + public Registry build() { + ISide side = getSide(exec); + Registry reg = new Registry(); + reg.setCompanyId(exec.getCompanyId()); + Company company = searchCompany(); + reg.setTradingCode(company.getTradingCode()); + reg.setClearingCode(company.getClearingCode()); + reg.setShortName(company.getShortName()); + reg.setFullName(company.getFullName()); + TradingClearingRegistry tcr = searchTradingClearingRegistry(); + if ((regDsgn.equals(RegistryDesignation.O) && side.isBuy()) || (regDsgn.equals(RegistryDesignation.T) && side.isSell())) { + reg.setAccountId(tcr.getMoneyAccountId()); + reg.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); + reg.setBalanceDimension(BalanceDimension.MONY.getKey()); //fixme add second leg code branch + } else if ((regDsgn.equals(RegistryDesignation.T) && side.isBuy()) || (regDsgn.equals(RegistryDesignation.O) && side.isSell())) { + reg.setAccountId(tcr.getDepoAccountId()); + reg.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); + reg.setBalanceDimension(BalanceDimension.PICS.getKey()); //fixme add second leg code branch + } + Account account = accountImdg.getSingleObjectByID(reg.getAccountId()); + reg.setAccountType(account.getAccountType()); + reg.setAccount(account.getAccount()); + reg.setRegistryDesignation(regDsgn.getKey()); + reg.setRegistryCapacity(account.getAccountType()); + reg.setRegistryUnit(RegistryUnit.T.getKey()); + reg.setRegistryCode(RegistryUtil.clearingCode(reg)); + reg.setTradingClearingRegistryId(exec.getTradingClearingRegistryId()); + reg.setTradingClearingRegistry(tcr.getCode()); + reg.setRegistryStatus(RegistryStatus.PROC.getKey()); + reg.setSecurityId(exec.getSecurityId()); + reg.setSecuritySymbol(exec.getSecuritySymbol()); + switch (exec.type()) { + case ExecutionDeposit -> { + ExecutionDeposit execDep = (ExecutionDeposit) this.exec; + reg.setBalance((execDep).getFirstLegAmount()); + if (regDsgn.equals(RegistryDesignation.T)) { + reg.setSettledCredit((execDep).getFirstLegAmount()); + } else if (regDsgn.equals(RegistryDesignation.O)) { + reg.setSettledDebit((execDep).getFirstLegAmount()); + } + reg.setSettlementDate(execDep.getFirstLegSettlementDate()); //fixme add second leg code branch + reg.setSettlementCode(execDep.getFirstLegSettlementCode()); //fixme add second leg code branch + reg.setRefundDate(execDep.getSecondLegSettlementDate()); //fixme add second leg code branch?? + reg.setValueDate(execDep.getFirstLegSettlementDate()); + reg.setContract(execDep.getContract()); + } + case ExecutionFond -> { + ExecutionFond execFond = (ExecutionFond) this.exec; + reg.setBalance(execFond.getSettlementAmount()); + reg.setSettlementDate(execFond.getSettlementDate()); + reg.setSettlementCode(execFond.getSettlementCode()); + } + } + reg.setTradingDate(exec.getTradingDate()); + reg.setClearingDate(LocalDate.now()); + reg.setPrice(exec.getPrice()); + reg.setCounterPartyId(exec.getCounterPartyId()); + reg.setGroupId(groupId()); + reg.setSessionId(exec.getSessionId()); + reg.setSessionType(sessionType()); + return reg; + } + + private static DateTimeFormatter yyyyMMdd = DateTimeFormatter.ofPattern("yyyyMMdd"); + + private Long groupId() { + LocalDate now = LocalDate.now(); + Market market = marketImdg.getSingleObjectBySQL("code = '" + exec.getMarket() + "'"); + return Long.valueOf(now.format(yyyyMMdd) + exec.getExchangeExecutionId() + market.getId()); + } + + //можно передать из стейджа + private String sessionType() { + Session session = sessionImdg.getSingleObjectByID(exec.getSessionId()); + return session.getSessionType(); + } + + private Company searchCompany() { + return companyImdg.getSingleObjectBySQL("id = " + exec.getCompanyId()); + } + + private TradingClearingRegistry searchTradingClearingRegistry() { + return tradingClearingRegistryImdg.getSingleObjectBySQL("tradingClearingRegistryId = " + exec.getTradingClearingRegistryId()); + } + + private static ISide getSide(ExecutionCommon exec) { + if (exec.type().equals(ExecutionType.ExecutionDeposit)) { + return ISide.parse(MoneyFlowSide.class, exec.getSide()); + } else if (exec.type().equals(ExecutionType.ExecutionFond)) { + return ISide.parse(Side.class, exec.getSide()); + } else { + throw new RuntimeException("Unknown Execution type: " + exec.type()); + } + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryUpdater.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryUpdater.java new file mode 100644 index 000000000..98bc78a6d --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryUpdater.java @@ -0,0 +1,66 @@ +package ru.spcex.clearing.session.stage.impl; + +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.execution.ExecutionCommon; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +public class RegistryUpdater { + public static RegistryUpdater updater() { + return new RegistryUpdater(); + } + + private RegistryUpdater() { + } + + private Imdg registryImdg; + private Imdg companyImdg; + private Imdg tradingClearingRegistryImdg; + private ExecutionCommon exec; + private Registry rgs; + + public RegistryUpdater imdg(ImdgProvider imdgProvider) { + this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); + return this; + } + + public RegistryUpdater registry(Registry rgs) { + this.rgs = rgs; + return this; + } + + public RegistryUpdater exec(ExecutionCommon exec) { + this.exec = exec; + return this; + } + + public Registry update() { + Registry reg = new Registry(); + reg.setCompanyId(exec.getCompanyId()); + Company company = searchCompany(); + reg.setTradingCode(company.getTradingCode()); + reg.setClearingCode(company.getClearingCode()); + reg.setShortName(company.getShortName()); + reg.setFullName(company.getFullName()); + TradingClearingRegistry tcr = searchTradingClearingRegistry(); + return null; + } + + private Company searchCompany() { + return companyImdg.getSingleObjectBySQL("id = " + exec.getCompanyId()); + } + + private TradingClearingRegistry searchTradingClearingRegistry() { + return tradingClearingRegistryImdg.getSingleObjectBySQL("tradingClearingRegistryId = " + exec.getTradingClearingRegistryId()); + } + + + + +// public +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java new file mode 100644 index 000000000..894b0f197 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java @@ -0,0 +1,180 @@ +package ru.spcex.clearing.session.stage.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.execution.ExecutionCommon; +import ru.clearing.classes.statics.data.execution.ExecutionDeposit; +import ru.clearing.classes.statics.data.execution.ExecutionFond; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.models.RegistryTradingParams; +import ru.spcex.clearing.service.builder.sql.RegistryCodeSqlBuilder; +import ru.spcex.clearing.session.stage.ISessionStage; +import ru.spcex.clearing.session.stage.StageResult; +import ru.spcex.clearing.session.stage.Task; +import ru.spcex.clearing.session.stage.TaskType; +import ru.spcex.platform.classes.base.interfaces.ExecutionType; +import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.utils.collection.Pair; + +import java.time.LocalDate; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.function.BiConsumer; + +@Service +public class RequirmentsAndObligationCreation implements ISessionStage { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Imdg registryImdg; + private final ImdgProvider imdgProvider; + + + @Autowired + public RequirmentsAndObligationCreation(ImdgProvider imdgProvider) { + this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + this.imdgProvider = imdgProvider; + } + + @SuppressWarnings("unchecked") + @Override + public StageResult submit(Task task) { + if (task.getTaskType() == TaskType.RequirementsAndObligationsCreate) { + return createRegisters((List) task.getData()); + } + throw new IllegalStateException("Unknown task type: " + task.getTaskType()); + } + + private StageResult createRegisters(List data) { + if (data.size() % 2 != 0) { + throw new IllegalStateException("Data size must be even (executions must match)"); + } + //см. описание к #matchExecutions + for (int i = 0; i < data.size(); ) { + Pair matched = matchExecutions(data, i); + if (matched == null) { + log.error("couldn't find match execution for id = {}", data.get(i).getId()); + i += 1; + continue; + } + i += 2; + ExecutionCommon partyExec = matched.getFirst(); + ExecutionCommon counterExec = matched.getSecond(); + + BiConsumer findAndUpdateOrCreate = (exec, regDsgn) -> + findReg(exec, regDsgn).ifPresentOrElse(registry -> { + RegistryUpdater.updater() + .imdg(imdgProvider) + .exec(partyExec) + .registry(registry) + .update(); + registryImdg.update(registry); + }, () -> { + Registry newRegister = RegistryBuilder.builder() + .imdg(imdgProvider) + .exec(partyExec) + .registryDesignation(regDsgn) + .build(); + registryImdg.insert(newRegister); + }); + findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.O); + findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.T); + findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.O); + findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.T); + } + return new StageResult<>(null, true); + } + + + private Optional findReg(ExecutionCommon exec, RegistryDesignation des) { + ISide side = getSide(exec); + RegistryTradingParams p; + if (side.isBuy() && des.equals(RegistryDesignation.O)) { + p = new RegistryTradingParams( + RegistryDesignation.O, RegistryInstrumentType.M, null, RegistryUnit.T + ); + } else if (side.isBuy() && des.equals(RegistryDesignation.T)) { + p = new RegistryTradingParams( + RegistryDesignation.T, RegistryInstrumentType.S, null, RegistryUnit.T + ); + } else if (side.isSell() && des.equals(RegistryDesignation.O)) { + p = new RegistryTradingParams( + RegistryDesignation.O, RegistryInstrumentType.S, null, RegistryUnit.T + ); + } else if (side.isSell() && des.equals(RegistryDesignation.T)) { + p = new RegistryTradingParams( + RegistryDesignation.T, RegistryInstrumentType.M, null, RegistryUnit.T + ); + } else { + throw new IllegalStateException("cannot construct for " + des + " " + side); + } + String sql = RegistryCodeSqlBuilder.getInstance(p).build(); + ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); + ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql), + pb.equals("tradingClearingRegistryId", exec.getTradingClearingRegistryId()), + pb.equals("companyId", exec.getCompanyId()), + pb.equals("settlementDate", settlementDt(exec)) + ); + return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(rgstrPredicate)); + } + + private LocalDate settlementDt(ExecutionCommon exec) { + if (exec.type().equals(ExecutionType.ExecutionDeposit)) { + return ((ExecutionDeposit) exec).getFirstLegSettlementDate(); + } else if (exec.type().equals(ExecutionType.ExecutionFond)) { + return ((ExecutionFond) exec).getSettlementDate(); + } else { + throw new RuntimeException("Unknown Execution type: " + exec.type()); + } + } + + + /** + * входные данные отсортированы по exchangeExecutionId. + * сортировка выполнена на предыдущем шаге. (такое описание шагов в ТЗ) + * по идее, Execution с одинаковым exchangeExecutionId должно быть всего два. + * если это не так, передалать на коллекцию Long executionId в правильном порядке + * и для каждого искать мэтч отдельно в Imdg, с сохранением уже обработанных для избежания дублирования + */ + private Pair matchExecutions(List data, int i) { + //if the last execution, then no match + if (i >= data.size() - 1) { + return null; + } + ExecutionCommon exec1 = data.get(i); + ExecutionCommon exec2 = data.get(i + 1); + //Встречная сделка контрагента выбирается из executionDeposit/Fond по условию: + //exchangeExecutionId=currentExecutionDeposit/Fond.exchangeExecutionId + //и [side=SELL (если currentExecutionDeposit/Fond.side=BUY) или side=BUY (если currentExecutionDeposit/Fond.side=SELL) по справочнику moneyFlowSide или справочнику side в зависимости от секции обрабатываемой сделки] + //и companyId=currentExecutionDeposit/Fond.counterPartyId + boolean valid = true; + if (!Objects.equals(exec1.getExchangeExecutionId(), exec2.getExchangeExecutionId())) { + valid = false; + } else if (Objects.equals(getSide(exec1), getSide(exec2))) { + valid = false; + } else if (!Objects.equals(exec1.getCounterPartyId(), exec2.getCounterPartyId())) { + valid = false; + } + if (!valid) { + log.error("FATAL skipping ExchangeExecutionId: {}", exec1.getId()); + } + return new Pair<>(exec1, exec2); + } + + private static ISide getSide(ExecutionCommon exec) { + if (exec.type().equals(ExecutionType.ExecutionDeposit)) { + return ISide.parse(MoneyFlowSide.class, exec.getSide()); + } else if (exec.type().equals(ExecutionType.ExecutionFond)) { + return ISide.parse(Side.class, exec.getSide()); + } else { + throw new RuntimeException("Unknown Execution type: " + exec.type()); + } + } + +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/BalanceDimension.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/BalanceDimension.java new file mode 100644 index 000000000..8251c48a4 --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/BalanceDimension.java @@ -0,0 +1,20 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum BalanceDimension implements IEnumKey { + MONY("MONY"), + PICS("PICS"), + ; + + private final String key; + + BalanceDimension(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ISide.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ISide.java new file mode 100644 index 000000000..4a5256b8b --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ISide.java @@ -0,0 +1,15 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public interface ISide { + boolean isBuy(); + boolean isSell(); + default boolean isOpposite(ISide other) { + return (isBuy() && other.isSell()) || (isSell() && other.isBuy()); + } + + static & IEnumKey & ISide> ISide parse(Class clazz, String key) { + return IEnumKey.getEnumByKey(clazz, key); + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/MoneyFlowSide.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/MoneyFlowSide.java index 1b1111295..b275279de 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/MoneyFlowSide.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/MoneyFlowSide.java @@ -2,7 +2,7 @@ package ru.spcex.platform.enumeration; import ru.spcex.platform.utils.enumeration.IEnumKey; -public enum MoneyFlowSide implements IEnumKey { +public enum MoneyFlowSide implements IEnumKey, ISide { BUY("BUY"), SELL("SELL"), ; @@ -17,4 +17,15 @@ public enum MoneyFlowSide implements IEnumKey { public String getKey() { return key; } + + + @Override + public boolean isBuy() { + return equals(BUY); + } + + @Override + public boolean isSell() { + return equals(SELL); + } } diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryStatus.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryStatus.java index dd948e3b9..451a06ef8 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryStatus.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryStatus.java @@ -3,7 +3,7 @@ package ru.spcex.platform.enumeration; import ru.spcex.platform.utils.enumeration.IEnumKey; public enum RegistryStatus implements IEnumKey { - OK("OK"), + OK("OK"), PROC("PROC"), ; private final String key; diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Side.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Side.java index d33888a93..2efb0196d 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Side.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Side.java @@ -2,7 +2,7 @@ package ru.spcex.platform.enumeration; import ru.spcex.platform.utils.enumeration.IEnumKey; -public enum Side implements IEnumKey { +public enum Side implements IEnumKey, ISide { BUY("B"), SELL("S"), ; @@ -17,4 +17,15 @@ public enum Side implements IEnumKey { public String getKey() { return key; } + + + @Override + public boolean isBuy() { + return equals(BUY); + } + + @Override + public boolean isSell() { + return equals(SELL); + } } diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java index a544c3a45..4cbde8b72 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java @@ -251,6 +251,15 @@ public class ImdgHazelcast implements Imdg { return searchResult; } + @Override + public T getSingleObjectByPredicate(ImdgPredicate predicate) { + Collection els = getCollectionObjectsByPredicate(predicate); + if (els.size() > 1) { + throw new RuntimeException("More than one element found by predicate - " + els.size()); + } + return els.iterator().next(); + } + @Override public ImdgPredicateBuilder predicateBuilder() { return ImdgPredicateBuilderHazelcast.instance(); diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java index 68007e757..091dc44fa 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java @@ -101,6 +101,11 @@ public interface Imdg { throw new UnsupportedOperationException("not implemented getCollectionObjectsByPredicate"); } + // Predicate API + default T getSingleObjectByPredicate(ImdgPredicate predicate) { + throw new UnsupportedOperationException("not implemented getSingleObjectByPredicate"); + } + default ImdgPredicateBuilder predicateBuilder() { throw new UnsupportedOperationException("not implemented predicateBuilder API"); } From db14e0f8e8eaaa855c21e7e19980fb4803507d45 Mon Sep 17 00:00:00 2001 From: ialbert Date: Fri, 19 May 2023 19:26:14 +0300 Subject: [PATCH 13/62] http://jira.mfd.msk:8088/browse/CLS-290 --- .../session/stage/impl/RegistryBuilder.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryBuilder.java index 45a21e5c2..29e40efae 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryBuilder.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryBuilder.java @@ -20,13 +20,6 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class RegistryBuilder { - public static RegistryBuilder builder() { - return new RegistryBuilder(); - } - - private RegistryBuilder() { - } - private Imdg companyImdg; private Imdg tradingClearingRegistryImdg; private Imdg accountImdg; @@ -35,6 +28,13 @@ public class RegistryBuilder { private ExecutionCommon exec; private RegistryDesignation regDsgn; + private RegistryBuilder() { + } + + public static RegistryBuilder builder() { + return new RegistryBuilder(); + } + public RegistryBuilder imdg(ImdgProvider imdgProvider) { this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); @@ -54,8 +54,6 @@ public class RegistryBuilder { return this; } - - public Registry build() { ISide side = getSide(exec); Registry reg = new Registry(); From 8c30280c1e3cfb811d59ef43e4a0526ff5d7e664 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 19 May 2023 19:34:37 +0300 Subject: [PATCH 14/62] =?UTF-8?q?backend-api=20meta=204=20=D0=BE=D0=B1?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20API.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/meta/meta.json | 116 ++++++++++-------- .../src/main/resources/meta/meta.xml | 98 ++++++++------- .../backend-api/src/test/resources/meta.json | 116 ++++++++++-------- 3 files changed, 183 insertions(+), 147 deletions(-) diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.json b/clearing-parent/backend-api/src/main/resources/meta/meta.json index a4d163256..e345077d9 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.json +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.json @@ -1,6 +1,6 @@ { - "version": "3.5.0.22", + "version": "3.5.0.23", "enums": { @@ -1726,7 +1726,7 @@ } , {"code": "corporationSoleType", - "type": 12,"dbname": "Код единоличного исполнительного органа","name": "Единоличный исполнительный орган","shortname": "Исполнительный орган","searchable": true,"sortable": true,"visible": true,"link": "corporationSoleType" + "type": 12,"dbname": "Код единоличного исполнительного органа","name": "Единоличный исполнительный орган","shortname": "Исполнительный орган","searchable": true,"sortable": true,"visible": true,"link": "corporationSoleType","ignore": true } , {"code": "countryCode", @@ -1734,7 +1734,7 @@ } , {"code": "description", - "type": 2,"length": 255,"name": "Описание компании","shortname": "Описание","searchable": true,"sortable": true,"visible": true + "type": 2,"length": 255,"name": "Описание компании","shortname": "Описание","searchable": true,"sortable": true,"visible": true,"ignore": true } , {"code": "professionalSign", @@ -1812,7 +1812,7 @@ } , {"code": "corporationSoleType", - "type": 12,"name": "Единоличный исполнительный орган","shortname": "Исполнительный орган","link": "corporationSoleType" + "type": 12,"name": "Единоличный исполнительный орган","shortname": "Исполнительный орган","link": "corporationSoleType","visible": false } , {"code": "legalKind", @@ -1840,7 +1840,7 @@ } , {"code": "description", - "type": 2,"length": 255,"name": "Описание компании","shortname": "Описание компании" + "type": 2,"length": 255,"name": "Описание компании","shortname": "Описание компании","visible": false } , {"code": "workflowStatus", @@ -2025,7 +2025,7 @@ } , {"code": "issuePlace", - "type": 2,"length": 255,"name": "Место выдачи","shortname": "Место выдачи","searchable": true,"sortable": true,"visible": true + "type": 2,"length": 255,"name": "Место выдачи","shortname": "Место выдачи","searchable": true,"sortable": true,"visible": true,"ignore": true } , {"code": "issuer", @@ -2033,11 +2033,11 @@ } , {"code": "issuerCode", - "type": 2,"length": 255,"name": "Код выдавшего органа","shortname": "Выдавший орган","searchable": true,"sortable": true,"visible": true + "type": 2,"length": 255,"name": "Код выдавшего органа","shortname": "Выдавший орган","searchable": true,"sortable": true,"visible": true,"ignore": true } , {"code": "name", - "type": 2,"length": 255,"name": "Наименование документа","shortname": "Документ","searchable": true,"sortable": true,"visible": true + "type": 2,"length": 255,"name": "Наименование документа","shortname": "Документ","searchable": true,"sortable": true,"visible": true,"ignore": true } , {"code": "number", @@ -2045,11 +2045,11 @@ } , {"code": "place", - "type": 2,"length": 255,"name": "Место","shortname": "Место","searchable": true,"sortable": true,"visible": true + "type": 2,"length": 255,"name": "Место","shortname": "Место","searchable": true,"sortable": true,"visible": true,"ignore": true } , {"code": "validFromDate", - "type": 6,"name": "Дата начала срока действия","shortname": "Начало","searchable": true,"sortable": true + "type": 6,"name": "Дата начала срока действия","shortname": "Начало","searchable": true,"sortable": true,"ignore": true } , {"code": "validToDate", @@ -2085,7 +2085,7 @@ } , {"code": "issuePlace", - "type": 2,"length": 255,"name": "Место выдачи","shortname": "Место выдачи","required": true + "type": 2,"length": 255,"name": "Место выдачи","shortname": "Место выдачи","visible": false } , {"code": "issuer", @@ -2093,11 +2093,11 @@ } , {"code": "issuerCode", - "type": 2,"length": 255,"name": "Код выдавшего органа","shortname": "Выдавший орган","required": true + "type": 2,"length": 255,"name": "Код выдавшего органа","shortname": "Выдавший орган","visible": false } , {"code": "name", - "type": 2,"length": 255,"name": "Наименование документа","shortname": "Документ","required": true + "type": 2,"length": 255,"name": "Наименование документа","shortname": "Документ","visible": false } , {"code": "number", @@ -2105,11 +2105,11 @@ } , {"code": "place", - "type": 2,"length": 255,"name": "Место","shortname": "Место","required": true + "type": 2,"length": 255,"name": "Место","shortname": "Место","visible": false } , {"code": "validFromDate", - "type": 6,"name": "Дата начала срока действия","shortname": "Начало","required": true + "type": 6,"name": "Дата начала срока действия","shortname": "Начало","visible": false } , {"code": "validToDate", @@ -2146,7 +2146,7 @@ } , {"code": "issuePlace", - "type": 2,"length": 255,"name": "Место выдачи","shortname": "Место выдачи" + "type": 2,"length": 255,"name": "Место выдачи","shortname": "Место выдачи","visible": false } , {"code": "issuer", @@ -2154,11 +2154,11 @@ } , {"code": "issuerCode", - "type": 2,"length": 255,"name": "Код выдавшего органа","shortname": "Выдавший орган" + "type": 2,"length": 255,"name": "Код выдавшего органа","shortname": "Выдавший орган","visible": false } , {"code": "name", - "type": 2,"length": 255,"name": "Наименование документа","shortname": "Документ" + "type": 2,"length": 255,"name": "Наименование документа","shortname": "Документ","visible": false } , {"code": "number", @@ -2166,11 +2166,11 @@ } , {"code": "place", - "type": 2,"length": 255,"name": "Место","shortname": "Место" + "type": 2,"length": 255,"name": "Место","shortname": "Место","visible": false } , {"code": "validFromDate", - "type": 6,"name": "Дата начала срока действия","shortname": "Начало" + "type": 6,"name": "Дата начала срока действия","shortname": "Начало","visible": false } , {"code": "validToDate", @@ -2391,7 +2391,7 @@ "fields": [ {"code": "countryCode", - "type": 12,"dbname": "Код страны","name": "Наименование страны","shortname": "Страна","searchable": true,"sortable": true,"visible": true,"link": "countryCode" + "type": 12,"dbname": "Код страны","name": "Наименование страны","shortname": "Страна","searchable": true,"sortable": true,"visible": true,"link": "countryCode","ignore": true } , {"code": "currencyCode", @@ -2423,15 +2423,15 @@ } , {"code": "description", - "type": 2,"length": 255,"name": "Описание","shortname": "Описание","searchable": true,"sortable": false + "type": 2,"length": 255,"name": "Описание","shortname": "Описание","searchable": true,"sortable": false,"ignore": true } , {"code": "startDate", - "type": 6,"name": "Дата начала действия","shortname": "Дата начала","searchable": true,"sortable": true + "type": 6,"name": "Дата начала действия","shortname": "Дата начала","searchable": true,"sortable": true,"ignore": true } , {"code": "endDate", - "type": 6,"name": "Дата окончания действия","shortname": "Дата окончания","searchable": true,"sortable": true + "type": 6,"name": "Дата окончания действия","shortname": "Дата окончания","searchable": true,"sortable": true,"ignore": true } , {"code": "nominalValue", @@ -2463,7 +2463,7 @@ } , {"code": "termType", - "type": 12,"dbname": "Код вида инструмента","name": "Наименование вида инструмента","shortname": "Вид инструмента","searchable": true,"sortable": true,"visible": false,"link": "termType" + "type": 12,"dbname": "Код вида инструмента","name": "Наименование вида инструмента","shortname": "Вид инструмента","searchable": true,"sortable": true,"visible": false,"link": "termType","ignore": true } , {"code": "lotSize", @@ -2499,7 +2499,7 @@ "name": "Добавление инструмента Денежного рынка", - "confirmation": "securitySymbol,shortName,fullName,lotSize,nominalValue,nominalCurrency,startDate,endDate,termType", + "confirmation": "securitySymbol,shortName,fullName,lotSize,nominalValue,nominalCurrency", "fields": [ {"code": "securitySymbol", @@ -2531,19 +2531,19 @@ } , {"code": "startDate", - "type": 6,"name": "Дата начала действия","shortname": "Дата начала","required": true + "type": 6,"name": "Дата начала действия","shortname": "Дата начала","visible": false } , {"code": "endDate", - "type": 6,"name": "Дата окончания действия","shortname": "Дата окончания","required": true + "type": 6,"name": "Дата окончания действия","shortname": "Дата окончания","visible": false } , {"code": "termType", - "type": 12,"name": "Наименование вида инструмента","shortname": "Вид инструмента","link": "termType","required": true + "type": 12,"name": "Наименование вида инструмента","shortname": "Вид инструмента","link": "termType","visible": false } , {"code": "description", - "type": 2,"length": 255,"name": "Описание","shortname": "Описание" + "type": 2,"length": 255,"name": "Описание","shortname": "Описание","visible": false } , {"code": "issuerId", @@ -2576,7 +2576,7 @@ "name": "Изменение инструмента Денежного рынка", - "confirmation": "securitySymbol,shortName,fullName,lotSize,nominalValue,nominalCurrency,startDate,endDate,termType", + "confirmation": "securitySymbol,shortName,fullName,lotSize,nominalValue,nominalCurrency", "fields": [ {"code": "id", @@ -2612,19 +2612,19 @@ } , {"code": "startDate", - "type": 6,"name": "Дата начала действия","shortname": "Дата начала","enabled": false + "type": 6,"name": "Дата начала действия","shortname": "Дата начала","enabled": false,"visible": false } , {"code": "endDate", - "type": 6,"name": "Дата окончания действия","shortname": "Дата окончания" + "type": 6,"name": "Дата окончания действия","shortname": "Дата окончания","visible": false } , {"code": "termType", - "type": 12,"name": "Наименование вида инструмента","shortname": "Вид инструмента","link": "termType" + "type": 12,"name": "Наименование вида инструмента","shortname": "Вид инструмента","link": "termType","visible": false } , {"code": "description", - "type": 2,"length": 255,"name": "Описание","shortname": "Описание" + "type": 2,"length": 255,"name": "Описание","shortname": "Описание","visible": false } , {"code": "issuerId", @@ -3531,7 +3531,7 @@ } , {"code": "code", - "type": 2,"length": 255,"name": "Код торгово-клирингового регистра","shortname": "Код ТКР","searchable": true,"sortable": true,"visible": true + "type": 2,"length": 255,"name": "Код торгово-клирингового регистра","shortname": "ТКР","searchable": true,"sortable": true,"visible": true } , {"code": "moneyAccountId", @@ -3596,15 +3596,31 @@ "name": "Изменение ТКР", - "confirmation": "companyId,moneyAccountId,depoAccountId,status", + "confirmation": "companyId,code,moneyAccountId,depoAccountId,status", "fields": [ {"code": "id", "type": 1,"name": "Идентификатор записи","shortname": "ID","link": "clientCode","linkCode": "id","required": true } + , + {"code": "companyId", + "type": 1,"name": "Наименование компании","shortname": "Компания","link": "company","linkCode": "shortName","enabled": false + } + , + {"code": "code", + "type": 2,"length": 255,"name": "Код торгово-клирингового регистра","shortname": "ТКР","enabled": false + } + , + {"code": "moneyAccountId", + "type": 1,"name": "Номер денежного счета","shortname": "Денежный счет","link": "account","linkCode": "account","enabled": false + } + , + {"code": "depoAccountId", + "type": 1,"name": "Номер депозитарного счета","shortname": "Депозитарный счет","link": "account","linkCode": "account","enabled": false + } , {"code": "status", - "type": 12,"name": "Наименование статуса","shortname": "Статус","link": "workflowStatus" + "type": 12,"name": "Наименование статуса","shortname": "Статус","link": "workflowStatus","required": true } ] } @@ -4439,11 +4455,11 @@ } , {"code": "task", - "type": 12,"name": "Наименование задачи","shortname": "Задача","link": "task" + "type": 12,"name": "Наименование задачи","shortname": "Задача","link": "task","required": true } , {"code": "taskTime", - "type": 5,"name": "Время задачи","shortname": "Время задачи" + "type": 5,"name": "Время задачи","shortname": "Время задачи","required": true } , {"code": "section", @@ -4455,7 +4471,7 @@ } , {"code": "taskStatus", - "type": 12,"name": "Наименование статуса","shortname": "Статус","link": "taskStatus" + "type": 12,"name": "Наименование статуса","shortname": "Статус","link": "taskStatus","required": true } , {"code": "companyId", @@ -4548,11 +4564,11 @@ } , {"code": "clearingDate", - "type": 6,"name": "Дата","shortname": "Дата" + "type": 6,"name": "Дата","shortname": "Дата","required": true } , {"code": "dayStatus", - "type": 12,"name": "Статус","shortname": "Статус","link": "dayStatus" + "type": 12,"name": "Статус","shortname": "Статус","link": "dayStatus","required": true } , {"code": "companyId", @@ -4685,15 +4701,15 @@ } , {"code": "task", - "type": 12,"name": "Наименование задачи","shortname": "Задача","link": "task" - } - , - {"code": "taskTime", - "type": 5,"name": "Время задачи","shortname": "Время задачи" + "type": 12,"name": "Наименование задачи","shortname": "Задача","link": "task","required": true } , {"code": "clearingDate", - "type": 6,"name": "Дата задачи","shortname": "Дата задачи" + "type": 6,"name": "Дата задачи","shortname": "Дата задачи","required": true + } + , + {"code": "taskTime", + "type": 5,"name": "Время задачи","shortname": "Время задачи","required": true } , {"code": "section", @@ -4705,7 +4721,7 @@ } , {"code": "taskStatus", - "type": 12,"name": "Наименование статуса","shortname": "Статус","link": "taskStatus" + "type": 12,"name": "Наименование статуса","shortname": "Статус","link": "taskStatus","required": true } , {"code": "companyId", diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.xml b/clearing-parent/backend-api/src/main/resources/meta/meta.xml index 6273184e6..7527dd5e0 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.xml @@ -1,6 +1,6 @@ - + @@ -388,9 +388,9 @@ - + - + @@ -410,14 +410,14 @@ - + - + @@ -465,13 +465,13 @@ - + - - + + - - + + @@ -480,13 +480,13 @@ - + - - + + - - + + @@ -495,13 +495,13 @@ - + - - + + - - + + @@ -553,15 +553,15 @@ - + - - - + + + @@ -569,7 +569,7 @@ - + @@ -578,7 +578,7 @@ - + @@ -586,10 +586,10 @@ - - - - + + + + @@ -597,7 +597,7 @@ - + @@ -606,10 +606,10 @@ - - - - + + + + @@ -823,7 +823,7 @@ - + @@ -839,9 +839,13 @@ - + - + + + + + @@ -1042,11 +1046,11 @@ - - + +
- + @@ -1070,8 +1074,8 @@ - - + + @@ -1105,12 +1109,12 @@ - - - + + +
- + diff --git a/clearing-parent/backend-api/src/test/resources/meta.json b/clearing-parent/backend-api/src/test/resources/meta.json index a4d163256..e345077d9 100644 --- a/clearing-parent/backend-api/src/test/resources/meta.json +++ b/clearing-parent/backend-api/src/test/resources/meta.json @@ -1,6 +1,6 @@ { - "version": "3.5.0.22", + "version": "3.5.0.23", "enums": { @@ -1726,7 +1726,7 @@ } , {"code": "corporationSoleType", - "type": 12,"dbname": "Код единоличного исполнительного органа","name": "Единоличный исполнительный орган","shortname": "Исполнительный орган","searchable": true,"sortable": true,"visible": true,"link": "corporationSoleType" + "type": 12,"dbname": "Код единоличного исполнительного органа","name": "Единоличный исполнительный орган","shortname": "Исполнительный орган","searchable": true,"sortable": true,"visible": true,"link": "corporationSoleType","ignore": true } , {"code": "countryCode", @@ -1734,7 +1734,7 @@ } , {"code": "description", - "type": 2,"length": 255,"name": "Описание компании","shortname": "Описание","searchable": true,"sortable": true,"visible": true + "type": 2,"length": 255,"name": "Описание компании","shortname": "Описание","searchable": true,"sortable": true,"visible": true,"ignore": true } , {"code": "professionalSign", @@ -1812,7 +1812,7 @@ } , {"code": "corporationSoleType", - "type": 12,"name": "Единоличный исполнительный орган","shortname": "Исполнительный орган","link": "corporationSoleType" + "type": 12,"name": "Единоличный исполнительный орган","shortname": "Исполнительный орган","link": "corporationSoleType","visible": false } , {"code": "legalKind", @@ -1840,7 +1840,7 @@ } , {"code": "description", - "type": 2,"length": 255,"name": "Описание компании","shortname": "Описание компании" + "type": 2,"length": 255,"name": "Описание компании","shortname": "Описание компании","visible": false } , {"code": "workflowStatus", @@ -2025,7 +2025,7 @@ } , {"code": "issuePlace", - "type": 2,"length": 255,"name": "Место выдачи","shortname": "Место выдачи","searchable": true,"sortable": true,"visible": true + "type": 2,"length": 255,"name": "Место выдачи","shortname": "Место выдачи","searchable": true,"sortable": true,"visible": true,"ignore": true } , {"code": "issuer", @@ -2033,11 +2033,11 @@ } , {"code": "issuerCode", - "type": 2,"length": 255,"name": "Код выдавшего органа","shortname": "Выдавший орган","searchable": true,"sortable": true,"visible": true + "type": 2,"length": 255,"name": "Код выдавшего органа","shortname": "Выдавший орган","searchable": true,"sortable": true,"visible": true,"ignore": true } , {"code": "name", - "type": 2,"length": 255,"name": "Наименование документа","shortname": "Документ","searchable": true,"sortable": true,"visible": true + "type": 2,"length": 255,"name": "Наименование документа","shortname": "Документ","searchable": true,"sortable": true,"visible": true,"ignore": true } , {"code": "number", @@ -2045,11 +2045,11 @@ } , {"code": "place", - "type": 2,"length": 255,"name": "Место","shortname": "Место","searchable": true,"sortable": true,"visible": true + "type": 2,"length": 255,"name": "Место","shortname": "Место","searchable": true,"sortable": true,"visible": true,"ignore": true } , {"code": "validFromDate", - "type": 6,"name": "Дата начала срока действия","shortname": "Начало","searchable": true,"sortable": true + "type": 6,"name": "Дата начала срока действия","shortname": "Начало","searchable": true,"sortable": true,"ignore": true } , {"code": "validToDate", @@ -2085,7 +2085,7 @@ } , {"code": "issuePlace", - "type": 2,"length": 255,"name": "Место выдачи","shortname": "Место выдачи","required": true + "type": 2,"length": 255,"name": "Место выдачи","shortname": "Место выдачи","visible": false } , {"code": "issuer", @@ -2093,11 +2093,11 @@ } , {"code": "issuerCode", - "type": 2,"length": 255,"name": "Код выдавшего органа","shortname": "Выдавший орган","required": true + "type": 2,"length": 255,"name": "Код выдавшего органа","shortname": "Выдавший орган","visible": false } , {"code": "name", - "type": 2,"length": 255,"name": "Наименование документа","shortname": "Документ","required": true + "type": 2,"length": 255,"name": "Наименование документа","shortname": "Документ","visible": false } , {"code": "number", @@ -2105,11 +2105,11 @@ } , {"code": "place", - "type": 2,"length": 255,"name": "Место","shortname": "Место","required": true + "type": 2,"length": 255,"name": "Место","shortname": "Место","visible": false } , {"code": "validFromDate", - "type": 6,"name": "Дата начала срока действия","shortname": "Начало","required": true + "type": 6,"name": "Дата начала срока действия","shortname": "Начало","visible": false } , {"code": "validToDate", @@ -2146,7 +2146,7 @@ } , {"code": "issuePlace", - "type": 2,"length": 255,"name": "Место выдачи","shortname": "Место выдачи" + "type": 2,"length": 255,"name": "Место выдачи","shortname": "Место выдачи","visible": false } , {"code": "issuer", @@ -2154,11 +2154,11 @@ } , {"code": "issuerCode", - "type": 2,"length": 255,"name": "Код выдавшего органа","shortname": "Выдавший орган" + "type": 2,"length": 255,"name": "Код выдавшего органа","shortname": "Выдавший орган","visible": false } , {"code": "name", - "type": 2,"length": 255,"name": "Наименование документа","shortname": "Документ" + "type": 2,"length": 255,"name": "Наименование документа","shortname": "Документ","visible": false } , {"code": "number", @@ -2166,11 +2166,11 @@ } , {"code": "place", - "type": 2,"length": 255,"name": "Место","shortname": "Место" + "type": 2,"length": 255,"name": "Место","shortname": "Место","visible": false } , {"code": "validFromDate", - "type": 6,"name": "Дата начала срока действия","shortname": "Начало" + "type": 6,"name": "Дата начала срока действия","shortname": "Начало","visible": false } , {"code": "validToDate", @@ -2391,7 +2391,7 @@ "fields": [ {"code": "countryCode", - "type": 12,"dbname": "Код страны","name": "Наименование страны","shortname": "Страна","searchable": true,"sortable": true,"visible": true,"link": "countryCode" + "type": 12,"dbname": "Код страны","name": "Наименование страны","shortname": "Страна","searchable": true,"sortable": true,"visible": true,"link": "countryCode","ignore": true } , {"code": "currencyCode", @@ -2423,15 +2423,15 @@ } , {"code": "description", - "type": 2,"length": 255,"name": "Описание","shortname": "Описание","searchable": true,"sortable": false + "type": 2,"length": 255,"name": "Описание","shortname": "Описание","searchable": true,"sortable": false,"ignore": true } , {"code": "startDate", - "type": 6,"name": "Дата начала действия","shortname": "Дата начала","searchable": true,"sortable": true + "type": 6,"name": "Дата начала действия","shortname": "Дата начала","searchable": true,"sortable": true,"ignore": true } , {"code": "endDate", - "type": 6,"name": "Дата окончания действия","shortname": "Дата окончания","searchable": true,"sortable": true + "type": 6,"name": "Дата окончания действия","shortname": "Дата окончания","searchable": true,"sortable": true,"ignore": true } , {"code": "nominalValue", @@ -2463,7 +2463,7 @@ } , {"code": "termType", - "type": 12,"dbname": "Код вида инструмента","name": "Наименование вида инструмента","shortname": "Вид инструмента","searchable": true,"sortable": true,"visible": false,"link": "termType" + "type": 12,"dbname": "Код вида инструмента","name": "Наименование вида инструмента","shortname": "Вид инструмента","searchable": true,"sortable": true,"visible": false,"link": "termType","ignore": true } , {"code": "lotSize", @@ -2499,7 +2499,7 @@ "name": "Добавление инструмента Денежного рынка", - "confirmation": "securitySymbol,shortName,fullName,lotSize,nominalValue,nominalCurrency,startDate,endDate,termType", + "confirmation": "securitySymbol,shortName,fullName,lotSize,nominalValue,nominalCurrency", "fields": [ {"code": "securitySymbol", @@ -2531,19 +2531,19 @@ } , {"code": "startDate", - "type": 6,"name": "Дата начала действия","shortname": "Дата начала","required": true + "type": 6,"name": "Дата начала действия","shortname": "Дата начала","visible": false } , {"code": "endDate", - "type": 6,"name": "Дата окончания действия","shortname": "Дата окончания","required": true + "type": 6,"name": "Дата окончания действия","shortname": "Дата окончания","visible": false } , {"code": "termType", - "type": 12,"name": "Наименование вида инструмента","shortname": "Вид инструмента","link": "termType","required": true + "type": 12,"name": "Наименование вида инструмента","shortname": "Вид инструмента","link": "termType","visible": false } , {"code": "description", - "type": 2,"length": 255,"name": "Описание","shortname": "Описание" + "type": 2,"length": 255,"name": "Описание","shortname": "Описание","visible": false } , {"code": "issuerId", @@ -2576,7 +2576,7 @@ "name": "Изменение инструмента Денежного рынка", - "confirmation": "securitySymbol,shortName,fullName,lotSize,nominalValue,nominalCurrency,startDate,endDate,termType", + "confirmation": "securitySymbol,shortName,fullName,lotSize,nominalValue,nominalCurrency", "fields": [ {"code": "id", @@ -2612,19 +2612,19 @@ } , {"code": "startDate", - "type": 6,"name": "Дата начала действия","shortname": "Дата начала","enabled": false + "type": 6,"name": "Дата начала действия","shortname": "Дата начала","enabled": false,"visible": false } , {"code": "endDate", - "type": 6,"name": "Дата окончания действия","shortname": "Дата окончания" + "type": 6,"name": "Дата окончания действия","shortname": "Дата окончания","visible": false } , {"code": "termType", - "type": 12,"name": "Наименование вида инструмента","shortname": "Вид инструмента","link": "termType" + "type": 12,"name": "Наименование вида инструмента","shortname": "Вид инструмента","link": "termType","visible": false } , {"code": "description", - "type": 2,"length": 255,"name": "Описание","shortname": "Описание" + "type": 2,"length": 255,"name": "Описание","shortname": "Описание","visible": false } , {"code": "issuerId", @@ -3531,7 +3531,7 @@ } , {"code": "code", - "type": 2,"length": 255,"name": "Код торгово-клирингового регистра","shortname": "Код ТКР","searchable": true,"sortable": true,"visible": true + "type": 2,"length": 255,"name": "Код торгово-клирингового регистра","shortname": "ТКР","searchable": true,"sortable": true,"visible": true } , {"code": "moneyAccountId", @@ -3596,15 +3596,31 @@ "name": "Изменение ТКР", - "confirmation": "companyId,moneyAccountId,depoAccountId,status", + "confirmation": "companyId,code,moneyAccountId,depoAccountId,status", "fields": [ {"code": "id", "type": 1,"name": "Идентификатор записи","shortname": "ID","link": "clientCode","linkCode": "id","required": true } + , + {"code": "companyId", + "type": 1,"name": "Наименование компании","shortname": "Компания","link": "company","linkCode": "shortName","enabled": false + } + , + {"code": "code", + "type": 2,"length": 255,"name": "Код торгово-клирингового регистра","shortname": "ТКР","enabled": false + } + , + {"code": "moneyAccountId", + "type": 1,"name": "Номер денежного счета","shortname": "Денежный счет","link": "account","linkCode": "account","enabled": false + } + , + {"code": "depoAccountId", + "type": 1,"name": "Номер депозитарного счета","shortname": "Депозитарный счет","link": "account","linkCode": "account","enabled": false + } , {"code": "status", - "type": 12,"name": "Наименование статуса","shortname": "Статус","link": "workflowStatus" + "type": 12,"name": "Наименование статуса","shortname": "Статус","link": "workflowStatus","required": true } ] } @@ -4439,11 +4455,11 @@ } , {"code": "task", - "type": 12,"name": "Наименование задачи","shortname": "Задача","link": "task" + "type": 12,"name": "Наименование задачи","shortname": "Задача","link": "task","required": true } , {"code": "taskTime", - "type": 5,"name": "Время задачи","shortname": "Время задачи" + "type": 5,"name": "Время задачи","shortname": "Время задачи","required": true } , {"code": "section", @@ -4455,7 +4471,7 @@ } , {"code": "taskStatus", - "type": 12,"name": "Наименование статуса","shortname": "Статус","link": "taskStatus" + "type": 12,"name": "Наименование статуса","shortname": "Статус","link": "taskStatus","required": true } , {"code": "companyId", @@ -4548,11 +4564,11 @@ } , {"code": "clearingDate", - "type": 6,"name": "Дата","shortname": "Дата" + "type": 6,"name": "Дата","shortname": "Дата","required": true } , {"code": "dayStatus", - "type": 12,"name": "Статус","shortname": "Статус","link": "dayStatus" + "type": 12,"name": "Статус","shortname": "Статус","link": "dayStatus","required": true } , {"code": "companyId", @@ -4685,15 +4701,15 @@ } , {"code": "task", - "type": 12,"name": "Наименование задачи","shortname": "Задача","link": "task" - } - , - {"code": "taskTime", - "type": 5,"name": "Время задачи","shortname": "Время задачи" + "type": 12,"name": "Наименование задачи","shortname": "Задача","link": "task","required": true } , {"code": "clearingDate", - "type": 6,"name": "Дата задачи","shortname": "Дата задачи" + "type": 6,"name": "Дата задачи","shortname": "Дата задачи","required": true + } + , + {"code": "taskTime", + "type": 5,"name": "Время задачи","shortname": "Время задачи","required": true } , {"code": "section", @@ -4705,7 +4721,7 @@ } , {"code": "taskStatus", - "type": 12,"name": "Наименование статуса","shortname": "Статус","link": "taskStatus" + "type": 12,"name": "Наименование статуса","shortname": "Статус","link": "taskStatus","required": true } , {"code": "companyId", From 2a8bda41e94689208ee8bfdffc3841d0b94d3ed3 Mon Sep 17 00:00:00 2001 From: psemenkov Date: Fri, 19 May 2023 19:41:05 +0300 Subject: [PATCH 15/62] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-268?= =?UTF-8?q?=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20plannerAllToday=20?= =?UTF-8?q?=D0=B5=D1=81=D0=BB=D0=B8=20=D1=82=D0=B5=D0=BA.=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D1=8C=3D=D0=9F=D0=9D-=D0=9F=D0=A2=20=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=20clearingCalendar=20(?= =?UTF-8?q?=D1=82.=D0=B5.=20=D0=BD=D0=B5=D1=82=20=D0=B7=D0=B0=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B8).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scheduler/service/PlannerTemplateService.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/PlannerTemplateService.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/PlannerTemplateService.java index 2e70f0eda..c6b65e707 100644 --- a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/PlannerTemplateService.java +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/PlannerTemplateService.java @@ -21,7 +21,7 @@ import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.scheduler.PlannerAllTodayBuilder; import ru.spcex.clearing.util.security.UserRoleVerification; -import ru.spcex.platform.enumeration.DayStatus; +import ru.spcex.platform.enumeration.Status; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.IMessageResolver; @@ -106,7 +106,7 @@ public class PlannerTemplateService extends QueueConsumer implements Initializin plannerTemplate.setSecurityId(req.getSecurityId()); plannerTemplateMap.insert(plannerTemplate); - if (todayWorkDay()) { + if (todayWorkDay() && Status.Active.equalsByKey(plannerTemplate.getTaskStatus())) { PlannerAllToday plannerAllToday = PlannerAllTodayBuilder.builder().append(plannerTemplate).build(); plannerAllTodayMap.insert(plannerAllToday); addToPlannerQueue(TaskManager.Process.add, plannerAllToday); @@ -143,7 +143,7 @@ public class PlannerTemplateService extends QueueConsumer implements Initializin plannerAllToday.setId(oldPlannerAllToday.getId()); plannerAllTodayMap.insert(plannerAllToday); addToPlannerQueue(TaskManager.Process.update, oldPlannerAllToday); - }else { + } else if (Status.Active.equalsByKey(plannerTemplate.getTaskStatus())) { plannerAllTodayMap.insert(plannerAllToday); addToPlannerQueue(TaskManager.Process.add, plannerAllToday); } @@ -165,7 +165,7 @@ public class PlannerTemplateService extends QueueConsumer implements Initializin if (todayWorkDay()) { PlannerAllToday plannerAllToday = plannerAllTodayMap.getSingleObjectBySQL(String.format("parentId = %s", plannerTemplate.getId())); - if (plannerAllToday != null){ + if (plannerAllToday != null) { plannerAllTodayMap.delete(plannerAllToday); addToPlannerQueue(TaskManager.Process.delete, plannerAllToday); } @@ -178,13 +178,12 @@ public class PlannerTemplateService extends QueueConsumer implements Initializin LocalDate currentDate = LocalDate.now(); boolean isWeekend = Arrays.asList(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY).contains(currentDate.getDayOfWeek()); //проверим есть ли другие записи clearingCalendar с таким же clearingDate, если они актуальные ничего не удаляем - Collection clearingCalendars = clearingCalendarMap.getCollectionObjectsByFieldValues(Map.of("dayStatus", DayStatus.Workday.getKey(), - "clearingDate", currentDate)); + Collection clearingCalendars = clearingCalendarMap.getCollectionObjectsByFieldValues(Map.of("clearingDate", currentDate)); if (clearingCalendars != null && !clearingCalendars.isEmpty()) { for (ClearingCalendar calendar : clearingCalendars) { if (isValidWorkday(calendar, isWeekend)) return true; } - } + } else return !isWeekend; return false; } } From 00a02ed7d23d0258cf0e3127571e38eb81aef325 Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 22 May 2023 10:15:10 +0300 Subject: [PATCH 16/62] http://jira.mfd.msk:8088/browse/CLS-290 --- .../session/stage/impl/RegistryUpdater.java | 61 ++++++++----------- .../RequirmentsAndObligationCreation.java | 1 - 2 files changed, 25 insertions(+), 37 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryUpdater.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryUpdater.java index 98bc78a6d..a5c08b03e 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryUpdater.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryUpdater.java @@ -1,12 +1,14 @@ package ru.spcex.clearing.session.stage.impl; -import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.execution.ExecutionCommon; +import ru.clearing.classes.statics.data.execution.ExecutionDeposit; +import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.classes.base.interfaces.ExecutionType; +import ru.spcex.platform.enumeration.RegistryDesignation; + +import java.math.BigDecimal; +import java.time.Instant; public class RegistryUpdater { public static RegistryUpdater updater() { @@ -16,19 +18,9 @@ public class RegistryUpdater { private RegistryUpdater() { } - private Imdg registryImdg; - private Imdg companyImdg; - private Imdg tradingClearingRegistryImdg; private ExecutionCommon exec; private Registry rgs; - public RegistryUpdater imdg(ImdgProvider imdgProvider) { - this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); - return this; - } - public RegistryUpdater registry(Registry rgs) { this.rgs = rgs; return this; @@ -39,28 +31,25 @@ public class RegistryUpdater { return this; } - public Registry update() { - Registry reg = new Registry(); - reg.setCompanyId(exec.getCompanyId()); - Company company = searchCompany(); - reg.setTradingCode(company.getTradingCode()); - reg.setClearingCode(company.getClearingCode()); - reg.setShortName(company.getShortName()); - reg.setFullName(company.getFullName()); - TradingClearingRegistry tcr = searchTradingClearingRegistry(); - return null; + public void update() { + if (exec.type().equals(ExecutionType.ExecutionDeposit)) { + rgs.setBalance(safe(rgs.getBalance()).add(safe(((ExecutionDeposit) exec).getFirstLegAmount()))); + if (rgs.getRegistryDesignation().equals(RegistryDesignation.T.getKey())) { + rgs.setSettledCredit(safe(rgs.getSettledCredit()).add(safe(((ExecutionDeposit) exec).getFirstLegAmount()))); + } + if (rgs.getRegistryDesignation().equals(RegistryDesignation.O.getKey())) { + rgs.setSettledDebit(safe(rgs.getSettledDebit()).add(safe(((ExecutionDeposit) exec).getFirstLegAmount()))); + } + rgs.setValueDate(((ExecutionDeposit) exec).getFirstLegSettlementDate()); + + } else if (exec.type().equals(ExecutionType.ExecutionFond)) { + rgs.setBalance(safe(rgs.getBalance()).add(safe(((ExecutionFond) exec).getSettlementAmount()))); + } + rgs.setUpdated(Instant.now()); + } - private Company searchCompany() { - return companyImdg.getSingleObjectBySQL("id = " + exec.getCompanyId()); + private BigDecimal safe(BigDecimal value) { + return value == null ? BigDecimal.ZERO : value; } - - private TradingClearingRegistry searchTradingClearingRegistry() { - return tradingClearingRegistryImdg.getSingleObjectBySQL("tradingClearingRegistryId = " + exec.getTradingClearingRegistryId()); - } - - - - -// public } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java index 894b0f197..d6ad3bc9e 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java @@ -70,7 +70,6 @@ public class RequirmentsAndObligationCreation implements ISessionStage { BiConsumer findAndUpdateOrCreate = (exec, regDsgn) -> findReg(exec, regDsgn).ifPresentOrElse(registry -> { RegistryUpdater.updater() - .imdg(imdgProvider) .exec(partyExec) .registry(registry) .update(); From dbec4604f9f4bfccb3e96ac1c881ee81a3b1cb2d Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 22 May 2023 12:34:51 +0300 Subject: [PATCH 17/62] clearing-service http://jira.mfd.msk:8088/browse/CLS-290 stage 11 --- .../service/ExecutionDepositComponent.java | 8 +- .../clearing/session/stage/TaskType.java | 7 ++ .../session/stage/impl/BalanceRevise.java | 3 +- .../stage/impl/EndStageNotification.java | 112 ++++++++++++++++++ .../task/EndStageNotificationPayload.java | 13 ++ .../platform/messaging/domain/Consts.java | 1 + 6 files changed, 140 insertions(+), 4 deletions(-) create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/EndStageNotification.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/EndStageNotificationPayload.java diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/ExecutionDepositComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/ExecutionDepositComponent.java index 81cddeb36..d7756f23a 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/ExecutionDepositComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/ExecutionDepositComponent.java @@ -54,7 +54,7 @@ public class ExecutionDepositComponent { //fixme ждать ТЗ Long tradeNum; Instant tradingDay; - private final IMessageResolver msgResolver = new SimpleMessageResolver(); + private final IMessageResolver msgResolver; private final Function stradesValidator; private final KafkaSender kafkaSender; @@ -62,12 +62,14 @@ public class ExecutionDepositComponent { @Autowired public ExecutionDepositComponent(ImdgProvider imdgProvider, Producer kafka, @Qualifier("sTradesValidator") Function stradesValidator, - @Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender) { + @Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender, + IMessageResolver msgResolver) { this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class); this.executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class); this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); this.stradesValidator = stradesValidator; this.kafkaSender = kafkaSender; + this.msgResolver = msgResolver; resetTradingDay(); } @@ -127,7 +129,7 @@ public class ExecutionDepositComponent { } ExecutionDeposit newED; try { - newED = createExecutionDeposit(sTrd, validator); + newED = createExecutionDeposit(sTrd, validator); executionDepositImdg.insert(newED); sendNotification(newED); log.debug("New executionDeposit.id={} was created.", newED.getId()); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java index 72a2f42e8..a6a3bac15 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java @@ -34,4 +34,11 @@ public enum TaskType { * step 8 */ UnlockResources, + + + + /** + * Step 11 + */ + EndStageNotification; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java index 4614f2276..1cebb2a3b 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java @@ -43,12 +43,13 @@ public class BalanceRevise implements ISessionStage { private KafkaSender kafkaSender; @Autowired - public BalanceRevise(ImdgProvider imdgProvider) { + public BalanceRevise(ImdgProvider imdgProvider, KafkaSender kafkaSender) { this.imdgProvider = imdgProvider; this.idGenerator = imdgProvider.getImdgIdGenerator(); this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class); this.currencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class); this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + this.kafkaSender = kafkaSender; } @Override diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/EndStageNotification.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/EndStageNotification.java new file mode 100644 index 000000000..ef76991c9 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/EndStageNotification.java @@ -0,0 +1,112 @@ +package ru.spcex.clearing.session.stage.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.SdfClearingRequest; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.clearing.session.stage.ISessionStage; +import ru.spcex.clearing.session.stage.StageResult; +import ru.spcex.clearing.session.stage.Task; +import ru.spcex.clearing.session.stage.task.EndStageNotificationPayload; +import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IMessageResolver; + +import java.util.Collection; +import java.util.Objects; +import java.util.stream.Collectors; + +import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError; + +@Service +public class EndStageNotification implements ISessionStage { + private final Logger log = LoggerFactory.getLogger(getClass()); + + private final Imdg registryImdg; + private final KafkaSender kafkaSender; + private final IMessageResolver msgResolver; + + @Autowired + public EndStageNotification(ImdgProvider imdgProvider, KafkaSender kafkaSender, IMessageResolver msgResolver) { + this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + this.kafkaSender = kafkaSender; + this.msgResolver = msgResolver; + } + + @Override + public StageResult submit(Task task) { + EndStageNotificationPayload payload = (EndStageNotificationPayload) task.getData(); + switch (task.getTaskType()) { + case EndStageNotification -> { + return endStageNotification(payload.getSection()); + } + default -> { + throw new IllegalStateException("Unknown task type: " + task.getTaskType()); + } + } + } + + protected Collection selectRegistry() { + String registrySQL = "registryStatus=" + RegistryStatus.OK.getKey() + ")"; + Collection result = registryImdg.getCollectionObjectsBySQL(registrySQL); + log.trace("Selected {} registry's by sql: {}", result.size(), registrySQL); + return result; + } + + protected StageResult endStageNotification(String section) { + Collection forRegistries = selectRegistry(); + Collection groups = forRegistries.stream() + .map(Registry::getGroupId) + .filter(Objects::nonNull) + .distinct().collect(Collectors.toList()); + log.debug("Sending notifications for {} groups ({} registers) on section {}", + groups, forRegistries.size(), section); + for (Long groupId : groups) { + log.trace("For registry group {} send notification", + groupId); + StageResult sResult; + if (Section.FOND.equalsByKey(section)) { + sResult = notificationDF14(groupId); + } else if (Section.MKR.equalsByKey(section)) { + sResult = notificationDF05(groupId); + } else { + throw new IllegalArgumentException("Unsupported section " + section); + } + if (sResult.getError() != null) { + log.warn("When sending groupId={} has error: {}", groupId, msgResolver.resolve(sResult.getError())); + } + } + StageResult> res = new StageResult<>(null, true); + return res; + } + + protected StageResult notificationDF14(Long groupId) { + SdfClearingRequest sdf14Request = new SdfClearingRequest(); + sdf14Request.setGroupId(groupId); + Long msgKey = kafkaSender.sendRequestToQueue(Consts.SDF14_PROCESS, sdf14Request); + if (msgKey == null) { + log.error("failed to put SDF14 request to kafka queue"); + return new StageResult<>(new EnumMessage(SessionGeneralError), false); + } + return new StageResult<>(null, true); + } + + protected StageResult notificationDF05(Long groupId) { + SdfClearingRequest sdf05Request = new SdfClearingRequest(); + sdf05Request.setGroupId(groupId); + Long msgKey = kafkaSender.sendRequestToQueue(Consts.SDF05_PROCESS, sdf05Request); + if (msgKey == null) { + log.error("failed to put SDF05 request to kafka queue"); + return new StageResult<>(new EnumMessage(SessionGeneralError), false); + } + return new StageResult<>(null, true); + } + +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/EndStageNotificationPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/EndStageNotificationPayload.java new file mode 100644 index 000000000..ba2b3836c --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/EndStageNotificationPayload.java @@ -0,0 +1,13 @@ +package ru.spcex.clearing.session.stage.task; + +public class EndStageNotificationPayload { + private String section; + + public String getSection() { + return section; + } + + public void setSection(String section) { + this.section = section; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index 7d80037cc..7dac16640 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -111,6 +111,7 @@ public interface Consts { String SDF05_PROCESS = "sdf05-process"; String SDF07_PROCESS = "sdf07-process"; String SDF11_PROCESS = "sdf11-process"; + String SDF14_PROCESS = "sdf14-process"; String SDF51_PROCESS = "sdf51-process"; String SDF53_PROCESS = "sdf53-process"; String SDF54_PROCESS = "sdf54-process"; From 0eadc49ab6c767d3a566b7100a55f9d46d7a30eb Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 22 May 2023 12:50:56 +0300 Subject: [PATCH 18/62] http://jira.mfd.msk:8088/browse/CLS-290 --- .../RequirmentsAndObligationCreation.java | 81 ++++++++++++++----- 1 file changed, 63 insertions(+), 18 deletions(-) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java index d6ad3bc9e..c10e29938 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java @@ -27,7 +27,9 @@ import java.time.LocalDate; import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; +import java.util.function.BiFunction; @Service public class RequirmentsAndObligationCreation implements ISessionStage { @@ -66,26 +68,38 @@ public class RequirmentsAndObligationCreation implements ISessionStage { i += 2; ExecutionCommon partyExec = matched.getFirst(); ExecutionCommon counterExec = matched.getSecond(); - + //бывает поиск обычный, бывает по ExecutionDeposit.secondLegSettlementDt + AtomicReference>> regSearchMethod = new AtomicReference<>(); + //обычный поиск + regSearchMethod.set(this::findReg); BiConsumer findAndUpdateOrCreate = (exec, regDsgn) -> - findReg(exec, regDsgn).ifPresentOrElse(registry -> { - RegistryUpdater.updater() - .exec(partyExec) - .registry(registry) - .update(); - registryImdg.update(registry); - }, () -> { - Registry newRegister = RegistryBuilder.builder() - .imdg(imdgProvider) - .exec(partyExec) - .registryDesignation(regDsgn) - .build(); - registryImdg.insert(newRegister); - }); + regSearchMethod.get().apply(exec, regDsgn) + .ifPresentOrElse(registry -> { + RegistryUpdater.updater() + .exec(partyExec) + .registry(registry) + .update(); + registryImdg.update(registry); + }, () -> { + Registry newRegister = RegistryBuilder.builder() + .imdg(imdgProvider) + .exec(partyExec) + .registryDesignation(regDsgn) + .build(); + registryImdg.insert(newRegister); + }); findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.O); findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.T); findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.O); findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.T); + if (partyExec.type().equals(ExecutionType.ExecutionDeposit) && ((ExecutionDeposit) partyExec).getSecondLegSettlementDate() != null) { + //поиск по дате расчетов ExecutionDeposit.secondLegSettlementDt + regSearchMethod.set(this::findRegBySettlementDt); + findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.T); + findAndUpdateOrCreate.accept(partyExec, RegistryDesignation.O); + findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.T); + findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.O); + } } return new StageResult<>(null, true); } @@ -113,12 +127,43 @@ public class RequirmentsAndObligationCreation implements ISessionStage { } else { throw new IllegalStateException("cannot construct for " + des + " " + side); } + return imdgRegSearch(p, exec.getTradingClearingRegistryId(), exec.getCompanyId(), settlementDt(exec)); + } + + private Optional findRegBySettlementDt(ExecutionCommon exec, RegistryDesignation des) { + if (!exec.type().equals(ExecutionType.ExecutionDeposit) || ((ExecutionDeposit) exec).getSecondLegSettlementDate() == null) + throw new IllegalStateException("cannot searchSettlementDt for " + exec.type()); + ISide side = getSide(exec); + RegistryTradingParams p; + if (side.isBuy() && des.equals(RegistryDesignation.T)) { + p = new RegistryTradingParams( + RegistryDesignation.T, RegistryInstrumentType.M, RegistryCapacity.A, RegistryUnit.T + ); + } else if (side.isBuy() && des.equals(RegistryDesignation.O)) { + p = new RegistryTradingParams( + RegistryDesignation.O, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.T + ); + } else if (side.isSell() && des.equals(RegistryDesignation.O)) { + p = new RegistryTradingParams( + RegistryDesignation.O, RegistryInstrumentType.M, RegistryCapacity.A, RegistryUnit.T + ); + } else if (side.isSell() && des.equals(RegistryDesignation.T)) { + p = new RegistryTradingParams( + RegistryDesignation.T, RegistryInstrumentType.S, RegistryCapacity.A, RegistryUnit.T + ); + } else { + throw new IllegalStateException("cannot construct by settleDt for " + des + " " + side); + } + return imdgRegSearch(p, exec.getTradingClearingRegistryId(), exec.getCompanyId(), ((ExecutionDeposit) exec).getSecondLegSettlementDate()); + } + + public Optional imdgRegSearch(RegistryTradingParams p, Long tcrId, Long companyId, LocalDate settlementDt) { String sql = RegistryCodeSqlBuilder.getInstance(p).build(); ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); ImdgPredicate rgstrPredicate = pb.and(pb.sql(sql), - pb.equals("tradingClearingRegistryId", exec.getTradingClearingRegistryId()), - pb.equals("companyId", exec.getCompanyId()), - pb.equals("settlementDate", settlementDt(exec)) + pb.equals("tradingClearingRegistryId", tcrId), + pb.equals("companyId", companyId), + pb.equals("settlementDate", settlementDt) ); return Optional.ofNullable(registryImdg.getSingleObjectByPredicate(rgstrPredicate)); } From 343497b5566e43619c9f5298a42904aaa88eed25 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 22 May 2023 13:35:23 +0300 Subject: [PATCH 19/62] =?UTF-8?q?clearing-service=20http://jira.mfd.msk:80?= =?UTF-8?q?88/browse/CLS-290=20stage=2010/11=20=D0=BC=D0=B5=D0=BB=D0=BE?= =?UTF-8?q?=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clearing/session/stage/TaskType.java | 5 ++++ .../stage/impl/EndStageNotification.java | 2 +- .../stage/task/FinishingSessionPayload.java | 13 ++++++++++ .../platform/enumeration/SessionStatus.java | 26 +++++++++++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/FinishingSessionPayload.java create mode 100644 platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SessionStatus.java diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java index a6a3bac15..47d060511 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java @@ -37,6 +37,11 @@ public enum TaskType { + /** + * Step 10 + */ + FinishingSession, + /** * Step 11 */ diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/EndStageNotification.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/EndStageNotification.java index ef76991c9..ad6481639 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/EndStageNotification.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/EndStageNotification.java @@ -54,7 +54,7 @@ public class EndStageNotification implements ISessionStage { } protected Collection selectRegistry() { - String registrySQL = "registryStatus=" + RegistryStatus.OK.getKey() + ")"; + String registrySQL = "registryStatus='" + RegistryStatus.OK.getKey() + "'"; Collection result = registryImdg.getCollectionObjectsBySQL(registrySQL); log.trace("Selected {} registry's by sql: {}", result.size(), registrySQL); return result; diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/FinishingSessionPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/FinishingSessionPayload.java new file mode 100644 index 000000000..9842cdc30 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/FinishingSessionPayload.java @@ -0,0 +1,13 @@ +package ru.spcex.clearing.session.stage.task; + +public class FinishingSessionPayload { + private Long sessionId; + + public Long getSessionId() { + return sessionId; + } + + public void setSessionId(Long sessionId) { + this.sessionId = sessionId; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SessionStatus.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SessionStatus.java new file mode 100644 index 000000000..9f1c34986 --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SessionStatus.java @@ -0,0 +1,26 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum SessionStatus implements IEnumKey { + ACTV("ACTV"), + CLRN("CLRN"), + CLOS("CLOS"); + + + SessionStatus(String key) { + this.key = key; + } + + private String key; + + @Override + public String getKey() { + return this.key; + } + + @Override + public boolean equalsByKey(String key) { + return IEnumKey.super.equalsByKey(key); + } +} From 91b7b99f86cb2497c83bdaa66612652c13d00ad7 Mon Sep 17 00:00:00 2001 From: aalehin Date: Mon, 22 May 2023 16:50:58 +0300 Subject: [PATCH 20/62] http://jira.mfd.msk:8088/browse/CLS-280 --- registry service update --- .../data/register/MoneyBalanceRegister.java | 56 +++++++++--- .../AdmittedLiabilitiesRegisterService.java | 82 +++++++++++++----- .../CoveredLiabilitiesRegisterService.java | 85 ++++++++++++++----- .../service/DepoBalanceRegisterService.java | 57 +++++++++---- ...DepoPaymentInstructionRegisterService.java | 73 +++++++++++----- .../ExcludeLiabilitiesRegisterService.java | 64 ++++++++------ .../service/LiabilitiesRegisterService.java | 65 ++++++++------ .../service/MoneyBalanceRegisterService.java | 72 +++++++++++----- ...oneyPaymentInstructionRegisterService.java | 55 +++++++----- .../ru/spcex/platform/enumeration/Task.java | 2 + 10 files changed, 424 insertions(+), 187 deletions(-) diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/register/MoneyBalanceRegister.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/register/MoneyBalanceRegister.java index 90dd23ad5..dff2d1116 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/register/MoneyBalanceRegister.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/register/MoneyBalanceRegister.java @@ -7,7 +7,7 @@ import java.math.BigDecimal; /** * Реестр остатков денежных средств - * + *

* DB table: MONEY_BALANCE_REGISTER **/ public class MoneyBalanceRegister extends BusinessObject { @@ -24,74 +24,108 @@ public class MoneyBalanceRegister extends BusinessObject { private String companyFullName; private Long companyId; + public static MoneyBalanceRegister makeMoneyBalanceRegister(String setHouseName, + String account, + String infoAccount, + BigDecimal remainderSum, + BigDecimal blockedSum, + BigDecimal unblockedSum, + String inn, + Long sessionId, + String companyFullName, + Long companyId) { + MoneyBalanceRegister moneyBalanceRegister = new MoneyBalanceRegister(); + moneyBalanceRegister.setSetHouseName(setHouseName); + moneyBalanceRegister.setAccount(account); + moneyBalanceRegister.setInfoAccount(infoAccount); + moneyBalanceRegister.setRemainderSum(remainderSum); + moneyBalanceRegister.setBlockedSum(blockedSum); + moneyBalanceRegister.setUnblockedSum(unblockedSum); + moneyBalanceRegister.setInn(inn); + moneyBalanceRegister.setSessionId(sessionId); + moneyBalanceRegister.setCompanyFullName(companyFullName); + moneyBalanceRegister.setCompanyId(companyId); + return moneyBalanceRegister; + } + public String getSetHouseName() { return setHouseName; } + public void setSetHouseName(String value) { - this.setHouseName=value; + this.setHouseName = value; } public String getAccount() { return account; } + public void setAccount(String value) { - this.account=value; + this.account = value; } public String getInfoAccount() { return infoAccount; } + public void setInfoAccount(String value) { - this.infoAccount=value; + this.infoAccount = value; } public BigDecimal getRemainderSum() { return remainderSum; } + public void setRemainderSum(BigDecimal value) { - this.remainderSum=value; + this.remainderSum = value; } public BigDecimal getBlockedSum() { return blockedSum; } + public void setBlockedSum(BigDecimal value) { - this.blockedSum=value; + this.blockedSum = value; } public BigDecimal getUnblockedSum() { return unblockedSum; } + public void setUnblockedSum(BigDecimal value) { - this.unblockedSum=value; + this.unblockedSum = value; } public String getInn() { return inn; } + public void setInn(String value) { - this.inn=value; + this.inn = value; } public Long getSessionId() { return sessionId; } + public void setSessionId(Long value) { - this.sessionId=value; + this.sessionId = value; } public String getCompanyFullName() { return companyFullName; } + public void setCompanyFullName(String value) { - this.companyFullName=value; + this.companyFullName = value; } public Long getCompanyId() { return companyId; } + public void setCompanyId(Long value) { - this.companyId=value; + this.companyId = value; } } \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java index 37a601135..221edb4db 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java @@ -6,19 +6,31 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.register.AdmittedLiabilitiesRegister; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.clearing.classes.statics.data.security.Security; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.registry.AdmittedLiabilitiesRegisterNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Optional; + +import static ru.spcex.platform.enumeration.Task.createRegistry_GRRT; + public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg admittedLiabilitiesRegisterMap; + private final Imdg registryMap; + private final Imdg companyMap; + private final Imdg securityMap; @Autowired public AdmittedLiabilitiesRegisterService(Consumer kafkaQueue, @@ -26,33 +38,59 @@ public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements ImdgProvider imdgProvider) { super(kafkaQueue, kafkaProducer); this.admittedLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_AdmittedLiabilitiesRegister, AdmittedLiabilitiesRegister.class); + this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + this.securityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Security, Security.class); } @Override public void afterPropertiesSet() { - callback(AdmittedLiabilitiesRegisterNewRequest.class) + callback(LauncherCommandRequest.class) .setConsumer(this::admittedLiabilitiesRegisterNew) - .forDestination(Consts.REGISTRY_ADMITTED_LIABILITIES_REGISTER_NEW, callbacks::put); + .forDestination(createRegistry_GRRT.topic(), callbacks::put);//TODO FIX UP WHAT KIND OF TOPIC init(); } - public void admittedLiabilitiesRegisterNew(BaseRequest userRequest) { - AdmittedLiabilitiesRegisterNewRequest req = userRequest.getRequestPayload(); - log.debug("AdmittedLiabilitiesRegisterNewRequest received"); - AdmittedLiabilitiesRegister register = new AdmittedLiabilitiesRegister(); - register.setSecuritySymbol(req.getSecuritySymbol()); - register.setSecurityFullName(req.getSecurityFullName()); - register.setSessionId(req.getSessionId()); - register.setClearingCode(req.getClearingCode()); - register.setAccount(req.getAccount()); - register.setCompanyId(req.getCompanyId()); - register.setAmount(req.getAmount()); - register.setId(req.getId()); - register.setCreated(req.getCreatedAt()); - register.setUpdated(req.getUpdatedAt()); - register.setClearingDate(req.getClearingDate()); - register.setCompanyFullName(req.getCompanyFullName()); - admittedLiabilitiesRegisterMap.insert(register); - log.debug("successfully processed, id {}", register.getId()); + + public void admittedLiabilitiesRegisterNew(BaseRequest userRequest) { + log.debug("LauncherCommandRequest received from {}", createRegistry_GRRT.topic()); //TODO FIX UP WHAT KIND OF TOPIC + + List registries = registryMap.getAllValues().stream().filter((x) -> { + return x.getRegistryDesignation().equalsIgnoreCase("O") && + x.getRegistryCapacity().equalsIgnoreCase("P") && + x.getRegistryCode().equalsIgnoreCase("T") && + (x.getRegistryInstrumentType().equalsIgnoreCase("S") + || x.getRegistryInstrumentType().equalsIgnoreCase("M")); + } + ).toList(); + HashMap sessionIdByCompanyId = new HashMap<>(); + Collection collection = admittedLiabilitiesRegisterMap.getAllValues(); + collection.forEach(x -> sessionIdByCompanyId.put(x.getCompanyId(), x.getSessionId())); + registries.forEach(x -> { + Long existingCompanySessionId = sessionIdByCompanyId.get(x.getCompanyId()); + if (existingCompanySessionId == null) { + insertAdmittedLiabilitiesRegister(x); + } + }); + log.debug("successfully processed"); + } + + private void insertAdmittedLiabilitiesRegister(Registry registry) { + AdmittedLiabilitiesRegister admittedLiabilitiesRegister = new AdmittedLiabilitiesRegister(); + Optional company = companyMap.getAllValues().stream().filter((x)-> x.getId() == 1L).findFirst(); + Optional security = securityMap.getAllValues().stream().filter((x)-> x.getId().equals(registry.getSecurityId())).findFirst(); + String securitySymbol = security.map(Security::getSecuritySymbol).orElse(null); + String securityFullName = security.map(Security::getShortName).orElse(null); + String companyFullName = company.map(Company::getFullName).orElse(null); + admittedLiabilitiesRegister.setCompanyFullName(companyFullName); + admittedLiabilitiesRegister.setSessionId(registry.getSessionId()); + admittedLiabilitiesRegister.setSecuritySymbol(securitySymbol); + admittedLiabilitiesRegister.setSecurityFullName(securityFullName); + admittedLiabilitiesRegister.setCompanyId(registry.getCompanyId()); + admittedLiabilitiesRegister.setClearingCode(registry.getClearingCode()); + admittedLiabilitiesRegister.setAccount(registry.getAccount()); + admittedLiabilitiesRegister.setAmount(registry.getBalance()); + admittedLiabilitiesRegister.setClearingDate(registry.getClearingDate()); + admittedLiabilitiesRegisterMap.insert(admittedLiabilitiesRegister); } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java index f658cbdb8..1ccf30151 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java @@ -6,19 +6,31 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.register.CoveredLiabilitiesRegister; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.clearing.classes.statics.data.security.Security; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.registry.CoveredLiabilitiesRegisterNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Optional; + +import static ru.spcex.platform.enumeration.Task.createRegistry_GRRT; + public class CoveredLiabilitiesRegisterService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg coveredLiabilitiesRegisterMap; + private final Imdg registryMap; + private final Imdg companyMap; + private final Imdg securityMap; @Autowired public CoveredLiabilitiesRegisterService(Consumer kafkaQueue, @@ -26,33 +38,62 @@ public class CoveredLiabilitiesRegisterService extends QueueConsumer implements ImdgProvider imdgProvider) { super(kafkaQueue, kafkaProducer); this.coveredLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CoveredLiabilitiesRegister, CoveredLiabilitiesRegister.class); + this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + this.securityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Security, Security.class); } @Override public void afterPropertiesSet() { - callback(CoveredLiabilitiesRegisterNewRequest.class) + callback(LauncherCommandRequest.class) .setConsumer(this::coveredLiabilitiesRegisterNew) - .forDestination(Consts.REGISTRY_COVERED_LIABILITIES_REGISTER_NEW, callbacks::put); + .forDestination(createRegistry_GRRT.topic(), callbacks::put);//TODO FIX UP WHAT KIND OF TOPIC init(); } - public void coveredLiabilitiesRegisterNew(BaseRequest userRequest) { - CoveredLiabilitiesRegisterNewRequest req = userRequest.getRequestPayload(); - log.debug("CoveredLiabilitiesRegisterNewRequest received"); - CoveredLiabilitiesRegister register = new CoveredLiabilitiesRegister(); - register.setCompanyFullName(req.getCompanyFullName()); - register.setSessionId(req.getSessionId()); - register.setSecuritySymbol(req.getSecuritySymbol()); - register.setSecurityFullName(req.getSecurityFullName()); - register.setCompanyId(req.getCompanyId()); - register.setClearingCode(req.getClearingCode()); - register.setAccount(req.getAccount()); - register.setAmount(req.getAmount()); - register.setId(req.getId()); - register.setCreated(req.getCreatedAt()); - register.setUpdated(req.getUpdatedAt()); - register.setClearingDate(req.getClearingDate()); - coveredLiabilitiesRegisterMap.insert(register); - log.debug("successfully processed, id {}", register.getId()); + + public void coveredLiabilitiesRegisterNew(BaseRequest userRequest) { + log.debug("LauncherCommandRequest received from {}", createRegistry_GRRT.topic()); //TODO FIX UP WHAT KIND OF TOPIC + + HashMap sessionIdByCompanyId = new HashMap<>(); + List registries = registryMap.getAllValues().stream().filter((x) -> { + return x.getRegistryDesignation().equalsIgnoreCase("O") && + x.getRegistryCapacity().equalsIgnoreCase("P") && + x.getRegistryCode().equalsIgnoreCase("T") && + (x.getRegistryInstrumentType().equalsIgnoreCase("S") + || x.getRegistryInstrumentType().equalsIgnoreCase("M")) && + (x.getRegistryStatus().equalsIgnoreCase("OK") || + x.getRegistryStatus().equalsIgnoreCase("PROC")); + } + + ).toList(); + Collection collection = coveredLiabilitiesRegisterMap.getAllValues(); + collection.forEach(x -> sessionIdByCompanyId.put(x.getCompanyId(), x.getSessionId())); + registries.forEach(x -> { + Long existingCompanySessionId = sessionIdByCompanyId.get(x.getCompanyId()); + if (existingCompanySessionId == null) { + insertCoveredLiabilitiesRegister(x); + + } + }); + log.debug("successfully processed"); + } + + private void insertCoveredLiabilitiesRegister(Registry registry) { + CoveredLiabilitiesRegister coveredLiabilitiesRegister = new CoveredLiabilitiesRegister(); + Optional company = companyMap.getAllValues().stream().filter((x) -> x.getId() == 1L).findFirst(); + Optional security = securityMap.getAllValues().stream().filter((x) -> x.getId().equals(registry.getSecurityId())).findFirst(); + String securitySymbol = security.map(Security::getSecuritySymbol).orElse(null); + String securityFullName = security.map(Security::getShortName).orElse(null); + String companyFullName = company.map(Company::getFullName).orElse(null); + coveredLiabilitiesRegister.setCompanyFullName(companyFullName); + coveredLiabilitiesRegister.setSessionId(registry.getSessionId()); + coveredLiabilitiesRegister.setSecurityFullName(securityFullName); + coveredLiabilitiesRegister.setCompanyId(registry.getCompanyId()); + coveredLiabilitiesRegister.setClearingCode(registry.getClearingCode()); + coveredLiabilitiesRegister.setAccount(registry.getAccount()); + coveredLiabilitiesRegister.setAmount(registry.getBalance()); + coveredLiabilitiesRegister.setClearingDate(registry.getClearingDate()); + coveredLiabilitiesRegisterMap.insert(coveredLiabilitiesRegister); } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java index 9ca959a81..c56d0df36 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java @@ -8,19 +8,27 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.register.DepoBalanceRegister; +import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.registry.DepoBalanceRegisterNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import java.time.Instant; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; + +import static ru.spcex.platform.enumeration.Task.createRegistry_GRRT; + @Service public class DepoBalanceRegisterService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg depoBalanceRegisterMap; + private final Imdg registryMap; @Autowired public DepoBalanceRegisterService(Consumer kafkaQueue, @@ -28,29 +36,42 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial ImdgProvider imdgProvider) { super(kafkaQueue, kafkaProducer); this.depoBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoBalanceRegister, DepoBalanceRegister.class); + this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); } @Override public void afterPropertiesSet() { - callback(DepoBalanceRegisterNewRequest.class) + callback(LauncherCommandRequest.class) .setConsumer(this::depoBalanceRegisterNew) - .forDestination(Consts.REGISTRY_DEPO_BALANCE_REGISTER_NEW, callbacks::put); + .forDestination(createRegistry_GRRT.topic(), callbacks::put); init(); } - public void depoBalanceRegisterNew(BaseRequest userRequest) { - DepoBalanceRegisterNewRequest req = userRequest.getRequestPayload(); - log.debug("DepoBalanceRegisterNewRequest received"); - DepoBalanceRegister register = new DepoBalanceRegister(); - register.setId(req.getId()); - register.setCreated(req.getCreatedAt()); - register.setUpdated(req.getUpdatedAt()); - register.setCompanyId(req.getCompanyId()); - register.setSessionId(req.getSessionId()); - register.setDepoCode(req.getDepoCode()); - register.setQuantity(req.getQuantity()); - register.setSecuritySymbol(req.getSecuritySymbol()); - depoBalanceRegisterMap.insert(register); - log.debug("successfully processed, id {}", register.getId()); + public void depoBalanceRegisterNew(BaseRequest userRequest) { + log.debug("LauncherCommandRequest received from {}", createRegistry_GRRT.topic()); + + HashMap sessionIdByCompanyId = new HashMap<>(); + List registries = registryMap.getAllValues().stream().filter((x) -> x.getAccountType().equalsIgnoreCase("DEPO")).toList(); + Collection collection = depoBalanceRegisterMap.getAllValues(); + collection.forEach(x -> sessionIdByCompanyId.put(x.getCompanyId(), x.getSessionId())); + registries.forEach(x -> { + Long existingCompanySessionId = sessionIdByCompanyId.get(x.getCompanyId()); + if (existingCompanySessionId == null) { + insertDepoBalanceRegister(x); + } + }); + log.debug("successfully processed"); + } + + private void insertDepoBalanceRegister(Registry registry) { + DepoBalanceRegister depoBalanceRegister = new DepoBalanceRegister(); + depoBalanceRegister.setUpdated(Instant.now()); + depoBalanceRegister.setCreated(Instant.now()); + depoBalanceRegister.setCompanyId(registry.getCompanyId()); + depoBalanceRegister.setSessionId(registry.getSessionId()); + depoBalanceRegister.setDepoCode(registry.getAccountType()); + depoBalanceRegister.setQuantity(registry.getCloseBalance()); + depoBalanceRegister.setSecuritySymbol(registry.getSecuritySymbol()); + depoBalanceRegisterMap.insert(depoBalanceRegister); } } \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java index 263191948..e105c5703 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java @@ -6,19 +6,31 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import ru.clearing.classes.statics.data.misc.Session; +import ru.clearing.classes.statics.data.payment.PaymentInstruction; import ru.clearing.classes.statics.data.register.DepoPaymentInstructionRegister; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.registry.DepoPaymentInstructionRegisterNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; + +import static ru.spcex.platform.enumeration.Task.createRegistry_GORR; +import static ru.spcex.platform.enumeration.Task.createRegistry_GRRT; + public class DepoPaymentInstructionRegisterService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg depoPaymentInstructionRegisterMap; + private final Imdg paymentInstructionMap; + private final Imdg sessionMap; + private final Imdg tradingClearingRegistryMap; @Autowired public DepoPaymentInstructionRegisterService(Consumer kafkaQueue, @@ -26,31 +38,52 @@ public class DepoPaymentInstructionRegisterService extends QueueConsumer impleme ImdgProvider imdgProvider) { super(kafkaQueue, kafkaProducer); this.depoPaymentInstructionRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoPaymentInstructionRegister, DepoPaymentInstructionRegister.class); + this.paymentInstructionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); + this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); + this.tradingClearingRegistryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); } @Override public void afterPropertiesSet() { - callback(DepoPaymentInstructionRegisterNewRequest.class) + callback(LauncherCommandRequest.class) .setConsumer(this::depoPaymentInstructionRegisterNew) - .forDestination(Consts.REGISTRY_DEPO_PAYMENT_INSTRUCTION_REGISTER_NEW, callbacks::put); + .forDestination(createRegistry_GRRT.topic(), callbacks::put); init(); } - public void depoPaymentInstructionRegisterNew(BaseRequest userRequest) { - DepoPaymentInstructionRegisterNewRequest req = userRequest.getRequestPayload(); - log.debug("DepoPaymentInstructionRegisterNewRequest received"); - DepoPaymentInstructionRegister register = new DepoPaymentInstructionRegister(); - register.setId(req.getId()); - register.setCreated(req.getCreatedAt()); - register.setUpdated(req.getUpdatedAt()); - register.setCompanyId(req.getCompanyId()); - register.setTradingClearingRegistryType(req.getTradingClearingRegistryType()); - register.setTradingClearingRegistry(req.getTradingClearingRegistry()); - register.setCbCode(req.getCbCode()); - register.setQuantity(req.getQuantity()); - register.setDirection(req.getDirection()); - register.setSessionId(req.getSessionId()); - depoPaymentInstructionRegisterMap.insert(register); - log.debug("successfully processed, id {}", register.getId()); + + public void depoPaymentInstructionRegisterNew(BaseRequest userRequest) { + log.debug("LauncherCommandRequest received from {}", createRegistry_GORR.topic()); + HashMap sessionIdByPaymentInstructions = new HashMap<>(); + paymentInstructionMap.getAllValues().stream().forEach(x -> sessionIdByPaymentInstructions.put(x.getSessionId(), x)); + List actualSession = sessionMap.getAllValues().stream().filter(x -> + sessionIdByPaymentInstructions.containsKey(x.getId()) && x.getSection().equalsIgnoreCase("FOND") + ).toList(); + HashMap sessionIdByCompanyId = new HashMap<>(); + Collection collection = depoPaymentInstructionRegisterMap.getAllValues(); + collection.forEach(x -> sessionIdByCompanyId.put(x.getCompanyId(), x.getSessionId())); + actualSession.forEach(x -> { + Long existingCompanySessionId = sessionIdByCompanyId.get(x.getCompanyId()); + if (existingCompanySessionId == null) { + insertDepoPaymentInstructionRegister(sessionIdByPaymentInstructions.get(x.getId())); + } + }); + + log.debug("successfully processed"); + } + + private void insertDepoPaymentInstructionRegister(PaymentInstruction paymentInstruction) { + DepoPaymentInstructionRegister depoPaymentInstructionRegister = new DepoPaymentInstructionRegister(); + //todo fix up Optional tradingClearingRegistry = tradingClearingRegistryMap.getAllValues().stream().filter((x)-> x.getCompanyId().equals(paymentInstruction.getCompanyId())).findFirst(); + + depoPaymentInstructionRegister.setCompanyId(paymentInstruction.getSenderId()); + //todo fix up depoPaymentInstructionRegister.setTradingClearingRegistryType(); + //todo fix up depoPaymentInstructionRegister.setTradingClearingRegistry(); + depoPaymentInstructionRegister.setCbCode("=RNCB-BE-01"); + depoPaymentInstructionRegister.setQuantity(paymentInstruction.getCreditLeg_amount()); + //todo fix up depoPaymentInstructionRegister.setDirection(paymentInstruction.getCreditLeg_direction()); + depoPaymentInstructionRegister.setSessionId(paymentInstruction.getSessionId()); + + depoPaymentInstructionRegisterMap.insert(depoPaymentInstructionRegister); } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java index f56dcd1b7..87759c1ee 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java @@ -7,18 +7,25 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister; +import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExcludeLiabilitiesRegisterNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; + +import static ru.spcex.platform.enumeration.Task.createRegistry_GRRT; + public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg excludeLiabilitiesRegisterMap; + private final Imdg registryMap; @Autowired public ExcludeLiabilitiesRegisterService(Consumer kafkaQueue, @@ -26,37 +33,44 @@ public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements ImdgProvider imdgProvider) { super(kafkaQueue, kafkaProducer); this.excludeLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_ExcludeLiabilitiesRegister, ExcludeLiabilitiesRegister.class); + this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); } @Override public void afterPropertiesSet() { - callback(ExcludeLiabilitiesRegisterNewRequest.class) + callback(LauncherCommandRequest.class) .setConsumer(this::excludeLiabilitiesRegisterNew) - .forDestination(Consts.REGISTRY_DEPO_PAYMENT_INSTRUCTION_REGISTER_NEW, callbacks::put); + .forDestination(createRegistry_GRRT.topic(), callbacks::put);//TODO FIX UP WHAT KIND OF TOPIC init(); } - public void excludeLiabilitiesRegisterNew(BaseRequest userRequest) { - ExcludeLiabilitiesRegisterNewRequest req = userRequest.getRequestPayload(); - log.debug("ExcludeLiabilitiesRegisterNewRequest received"); - ExcludeLiabilitiesRegister register = new ExcludeLiabilitiesRegister(); - register.setId(req.getId()); - register.setCreated(req.getCreatedAt()); - register.setUpdated(req.getUpdatedAt()); - register.setSessionId(req.getSessionId()); - register.setValidFromDate(req.getValidFromDate()); - register.setValidToDate(req.getValidToDate()); - register.setCompanyId(req.getCompanyId()); - register.setCompanyFullName(req.getCompanyFullName()); - register.setInn(req.getInn()); - register.setSegment(req.getSegment()); - register.setRegistryCode(req.getRegistryCode()); - register.setAccount(req.getAccount()); - register.setRegistryStatus(req.getRegistryStatus()); - register.setCurrency(req.getCurrency()); - register.setSumLiabilities(req.getSumLiabilities()); - excludeLiabilitiesRegisterMap.insert(register); - log.debug("successfully processed, id {}", register.getId()); + public void excludeLiabilitiesRegisterNew(BaseRequest userRequest) { + log.debug("LauncherCommandRequest received from {}", createRegistry_GRRT.topic()); //TODO FIX UP WHAT KIND OF TOPIC + HashMap sessionIdByCompanyId = new HashMap<>(); + List registries = registryMap.getAllValues().stream().filter((x) -> { + return x.getRegistryDesignation().equalsIgnoreCase("O") && + x.getRegistryCapacity().equalsIgnoreCase("P") && + x.getRegistryCode().equalsIgnoreCase("T") && + (x.getRegistryInstrumentType().equalsIgnoreCase("S") + || x.getRegistryInstrumentType().equalsIgnoreCase("M")) && + x.getRegistryStatus().equalsIgnoreCase("FAIL"); + } + ).toList(); + Collection collection = excludeLiabilitiesRegisterMap.getAllValues(); + collection.forEach(x -> sessionIdByCompanyId.put(x.getCompanyId(), x.getSessionId())); + registries.forEach(x -> { + Long existingCompanySessionId = sessionIdByCompanyId.get(x.getCompanyId()); + if (existingCompanySessionId == null) { + insertExcludeLiabilitiesRegister(x); + } + }); + log.debug("successfully processed"); + } + + private void insertExcludeLiabilitiesRegister(Registry registry) { + ExcludeLiabilitiesRegister excludeLiabilitiesRegister = new ExcludeLiabilitiesRegister(); + //TODO MAPPING + excludeLiabilitiesRegisterMap.insert(excludeLiabilitiesRegister); } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java index f310b589a..1b4c48321 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java @@ -7,18 +7,25 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import ru.clearing.classes.statics.data.register.LiabilitiesRegister; +import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.registry.LiabilitiesRegisterNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; + +import static ru.spcex.platform.enumeration.Task.createRegistry_GRRT; + public class LiabilitiesRegisterService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg liabilitiesRegisterMap; + private final Imdg registryMap; @Autowired public LiabilitiesRegisterService(Consumer kafkaQueue, @@ -26,37 +33,43 @@ public class LiabilitiesRegisterService extends QueueConsumer implements Initial ImdgProvider imdgProvider) { super(kafkaQueue, kafkaProducer); this.liabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesRegister, LiabilitiesRegister.class); + this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); } @Override public void afterPropertiesSet() { - callback(LiabilitiesRegisterNewRequest.class) + callback(LauncherCommandRequest.class) .setConsumer(this::liabilitiesRegisterNew) - .forDestination(Consts.REGISTRY_LIABILITIES_REGISTER_NEW, callbacks::put); + .forDestination(createRegistry_GRRT.topic(), callbacks::put);//TODO FIX UP WHAT KIND OF TOPIC init(); } - public void liabilitiesRegisterNew(BaseRequest userRequest) { - LiabilitiesRegisterNewRequest req = userRequest.getRequestPayload(); - log.debug("LiabilitiesRegisterNewRequest received"); - LiabilitiesRegister register = new LiabilitiesRegister(); - register.setId(req.getId()); - register.setCreated(req.getCreatedAt()); - register.setUpdated(req.getUpdatedAt()); - register.setSessionId(req.getSessionId()); - register.setValidFromDate(req.getValidFromDate()); - register.setValidToDate(req.getValidToDate()); - register.setCompanyId(req.getCompanyId()); - register.setCompanyFullName(req.getCompanyFullName()); - register.setInn(req.getInn()); - register.setSegment(req.getSegment()); - register.setRegistryCode(req.getRegistryCode()); - register.setAccount(req.getAccount()); - register.setRegistryStatus(req.getRegistryStatus()); - register.setCurrency(req.getCurrency()); - register.setSumLiabilities(req.getSumLiabilities()); - register.setSettlementDate(req.getSettlementDate()); - liabilitiesRegisterMap.insert(register); - log.debug("successfully processed, id {}", register.getId()); + + public void liabilitiesRegisterNew(BaseRequest userRequest) { + log.debug("LauncherCommandRequest received from {}", createRegistry_GRRT.topic()); //TODO FIX UP WHAT KIND OF TOPIC + HashMap sessionIdByCompanyId = new HashMap<>(); + List registries = registryMap.getAllValues().stream().filter((x) -> { + return x.getRegistryDesignation().equalsIgnoreCase("L") && + x.getRegistryCapacity().equalsIgnoreCase("P") && + x.getRegistryCode().equalsIgnoreCase("T") && + (x.getRegistryInstrumentType().equalsIgnoreCase("S") + || x.getRegistryInstrumentType().equalsIgnoreCase("M")); + } + ).toList(); + Collection collection = liabilitiesRegisterMap.getAllValues(); + collection.forEach(x -> sessionIdByCompanyId.put(x.getCompanyId(), x.getSessionId())); + registries.forEach(x -> { + Long existingCompanySessionId = sessionIdByCompanyId.get(x.getCompanyId()); + if (existingCompanySessionId == null) { + insertLiabilitiesRegister(x); + } + }); + log.debug("successfully processed"); + } + + private void insertLiabilitiesRegister(Registry registry) { + LiabilitiesRegister liabilitiesRegister = new LiabilitiesRegister(); + //TODO FIX UP + liabilitiesRegisterMap.insert(liabilitiesRegister); } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java index d4b26a1ba..da1ca3e8e 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java @@ -6,19 +6,31 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.register.MoneyBalanceRegister; +import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.registry.MoneyBalanceRegisterNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Optional; + +import static ru.spcex.platform.enumeration.Task.createRegistry_GBRR; + public class MoneyBalanceRegisterService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg moneyBalanceRegisterMap; + private final Imdg registryMap; + private final Imdg companySymbolsMap; + private final Imdg companyMap; @Autowired public MoneyBalanceRegisterService(Consumer kafkaQueue, @@ -26,34 +38,48 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia ImdgProvider imdgProvider) { super(kafkaQueue, kafkaProducer); this.moneyBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyBalanceRegister, MoneyBalanceRegister.class); + this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + this.companySymbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); } @Override public void afterPropertiesSet() { - callback(MoneyBalanceRegisterNewRequest.class) + callback(LauncherCommandRequest.class) .setConsumer(this::moneyBalanceRegisterNew) - .forDestination(Consts.REGISTRY_MONEY_BALANCE_REGISTER_NEW, callbacks::put); + .forDestination(createRegistry_GBRR.topic(), callbacks::put); init(); } - public void moneyBalanceRegisterNew(BaseRequest userRequest) { - MoneyBalanceRegisterNewRequest req = userRequest.getRequestPayload(); - log.debug("MoneyBalanceRegisterNewRequest received"); - MoneyBalanceRegister register = new MoneyBalanceRegister(); - register.setSetHouseName(req.getSetHouseName()); - register.setAccount(req.getAccount()); - register.setInfoAccount(req.getInfoAccount()); - register.setRemainderSum(req.getRemainderSum()); - register.setBlockedSum(req.getBlockedSum()); - register.setUnblockedSum(req.getUnblockedSum()); - register.setInn(req.getInn()); - register.setSessionId(req.getSessionId()); - register.setCompanyFullName(req.getCompanyFullName()); - register.setCompanyId(req.getCompanyId()); - register.setId(req.getId()); - register.setCreated(req.getCreatedAt()); - register.setUpdated(req.getUpdatedAt()); - moneyBalanceRegisterMap.insert(register); - log.debug("successfully processed, id {}", register.getId()); + public void moneyBalanceRegisterNew(BaseRequest userRequest) { + log.debug("LauncherCommandRequest received from {}", createRegistry_GBRR.topic()); + HashMap sessionIdByCompanyId = new HashMap<>(); + List registries = registryMap.getAllValues().stream().filter((x) -> x.getAccountType().equalsIgnoreCase("INFO") || x.getAccountType().equalsIgnoreCase("CLRN")).toList(); + Collection collection = moneyBalanceRegisterMap.getAllValues(); + collection.forEach(x -> sessionIdByCompanyId.put(x.getCompanyId(), x.getSessionId())); + registries.forEach(x -> { + Long existingCompanySessionId = sessionIdByCompanyId.get(x.getCompanyId()); + if (existingCompanySessionId == null) { + insertMoneyBalanceRegister(x); + } + }); + log.debug("successfully processed"); + } + + private void insertMoneyBalanceRegister(Registry registry){ + MoneyBalanceRegister moneyBalanceRegister = new MoneyBalanceRegister(); + Optional company = companyMap.getAllValues().stream().filter((x)-> x.getId() == 2L).findFirst(); + String setHouseName = company.map(Company::getShortName).orElse(null); + moneyBalanceRegister.setSetHouseName(setHouseName); + moneyBalanceRegister.setAccount(registry.getAccount()); + moneyBalanceRegister.setInfoAccount(registry.getAccountType()); + moneyBalanceRegister.setRemainderSum(registry.getCloseBalance()); + Optional companySymbol = companySymbolsMap.getAllValues().stream().filter((x)-> x.getCompanyId().equals(registry.getCompanyId())).findFirst(); + String inn = companySymbol.map(CompanySymbols::getCompanySymbolValue).orElse(null); + moneyBalanceRegister.setInn(inn); + moneyBalanceRegister.setSessionId(registry.getSessionId()); + //moneyBalanceRegister.setCompanyFullName(registry.getCompanyFullName()) todo resolve is it ok that it is empty technical task + moneyBalanceRegister.setCompanyId(registry.getCompanyId()); + moneyBalanceRegisterMap.insert(moneyBalanceRegister); } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java index a342fac19..ee4f711bc 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java @@ -6,19 +6,27 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import ru.clearing.classes.statics.data.misc.Session; +import ru.clearing.classes.statics.data.payment.PaymentInstruction; import ru.clearing.classes.statics.data.register.MoneyPaymentInstructionRegister; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.registry.MoneyPaymentInstructionRegisterNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import java.util.HashMap; +import java.util.List; + +import static ru.spcex.platform.enumeration.Task.createRegistry_GORR; + public class MoneyPaymentInstructionRegisterService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg moneyPaymentInstructionRegisterMap; + private final Imdg paymentInstructionMap; + private final Imdg sessionMap; @Autowired public MoneyPaymentInstructionRegisterService(Consumer kafkaQueue, @@ -26,31 +34,38 @@ public class MoneyPaymentInstructionRegisterService extends QueueConsumer implem ImdgProvider imdgProvider) { super(kafkaQueue, kafkaProducer); this.moneyPaymentInstructionRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyPaymentInstructionRegister, MoneyPaymentInstructionRegister.class); + this.paymentInstructionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); + this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); } @Override public void afterPropertiesSet() { - callback(MoneyPaymentInstructionRegisterNewRequest.class) + callback(LauncherCommandRequest.class) .setConsumer(this::moneyPaymentInstructionRegisterNew) - .forDestination(Consts.REGISTRY_MONEY_PAYMENT_INSTRUCTION_REGISTER_NEW, callbacks::put); + .forDestination(createRegistry_GORR.topic(), callbacks::put); init(); } - public void moneyPaymentInstructionRegisterNew(BaseRequest userRequest) { - MoneyPaymentInstructionRegisterNewRequest req = userRequest.getRequestPayload(); - log.debug("MoneyPaymentInstructionRegisterNewRequest received"); - MoneyPaymentInstructionRegister register = new MoneyPaymentInstructionRegister(); - register.setCreditLegAccount(req.getCreditLegAccount()); - register.setCreditLegAmount(req.getCreditLegAmount()); - register.setCreditLegCurrencyCode(req.getCreditLegCurrencyCode()); - register.setDebitLegAccount(req.getDebitLegAccount()); - register.setSender(req.getSender()); - register.setAddressee(req.getAddressee()); - register.setId(req.getId()); - register.setCreated(req.getCreatedAt()); - register.setUpdated(req.getUpdatedAt()); - register.setClearingDate(req.getClearingDate()); - moneyPaymentInstructionRegisterMap.insert(register); - log.debug("successfully processed, id {}", register.getId()); + public void moneyPaymentInstructionRegisterNew(BaseRequest userRequest) { + log.debug("LauncherCommandRequest received from {}", createRegistry_GORR.topic()); + HashMap sessionIdByPaymentInstructions = new HashMap<>(); + paymentInstructionMap.getAllValues().stream().forEach(x -> sessionIdByPaymentInstructions.put(x.getSessionId(), x)); + List actualSession = sessionMap.getAllValues().stream().filter(x-> + sessionIdByPaymentInstructions.containsKey(x.getId()) && x.getSection().equalsIgnoreCase("MKR") + ).toList(); + actualSession.forEach(x -> insertMoneyPaymentInstructionRegister(sessionIdByPaymentInstructions.get(x.getId()))); + log.debug("successfully processed"); + } + + private void insertMoneyPaymentInstructionRegister(PaymentInstruction paymentInstruction){ + MoneyPaymentInstructionRegister moneyPaymentInstructionRegister = new MoneyPaymentInstructionRegister(); + moneyPaymentInstructionRegister.setCreditLegAccount(paymentInstruction.getCreditLeg_account()); + moneyPaymentInstructionRegister.setCreditLegAmount(paymentInstruction.getCreditLeg_amount()); + moneyPaymentInstructionRegister.setCreditLegCurrencyCode(paymentInstruction.getCreditLeg_currencyCode()); + moneyPaymentInstructionRegister.setDebitLegAccount(paymentInstruction.getDebitLeg_account()); + moneyPaymentInstructionRegister.setSender(paymentInstruction.getSenderId().toString()); + moneyPaymentInstructionRegister.setAddressee(paymentInstruction.getAddresseeId().toString()); + moneyPaymentInstructionRegister.setClearingDate(paymentInstruction.getClearingDate()); + moneyPaymentInstructionRegisterMap.insert(moneyPaymentInstructionRegister); } } diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java index e6b512d58..bdd0365e3 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java @@ -29,7 +29,9 @@ public enum Task implements IEnumKey { reconciliationRequest_RCHK("RCHK"),//Запрос на сверку активов createRegistry_GRYT("GRYT"),//Сформировать регистр на текущий день createRegistry_GRRT("GRRT"),//Сформировать реестр на текущий день + createRegistry_GBRR("GBRR"),//Сформировать реестр на текущий день createRegistry_GORD("GORD"), // Формирование реестра распоряжений, направленных расчетному депозитарию + createRegistry_GORR("GORR"), // Формирование реестра распоряжений, направленных расчетному депозитарию ; private final String key; From bea0c96d643ba1d6be0e023c587bd355a9073ffe Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 22 May 2023 17:48:27 +0300 Subject: [PATCH 21/62] http://jira.mfd.msk:8088/browse/CLS-290 --- .../clearing/config/ValidationConfig.java | 21 ++++ .../spcex/clearing/error/ClearingError.java | 3 + .../RegistryStep3ValidationRule.java | 104 ++++++++++++++++++ .../validation/RegistryValidationStored.java | 5 + .../clearing/session/stage/TaskType.java | 4 + .../stage/impl/ObligationAdmission.java | 79 +++++++++++++ ...=> RequirementsAndObligationCreation.java} | 4 +- .../platform/enumeration/RegistryStatus.java | 2 +- 8 files changed, 219 insertions(+), 3 deletions(-) create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RegistryStep3ValidationRule.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RegistryValidationStored.java create mode 100644 clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/ObligationAdmission.java rename clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/{RequirmentsAndObligationCreation.java => RequirementsAndObligationCreation.java} (98%) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java index f4677be37..95f979e72 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/ValidationConfig.java @@ -8,11 +8,13 @@ import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.relation.Relation; import ru.clearing.classes.statics.data.execution.ExecutionDeposit; import ru.clearing.classes.statics.data.misc.STrades; +import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.security.Security; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.service.validation.ClrngValidationStored; import ru.spcex.clearing.service.validation.ExecutionDepositValidationRule; +import ru.spcex.clearing.service.validation.RegistryStep3ValidationRule; import ru.spcex.clearing.service.validation.STradesValidationRule; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.enumeration.ClearingCategory; @@ -86,4 +88,23 @@ public class ValidationConfig { STradesValidationRule.TradingClearingRegistryPresent); }; } + + @Bean("obligationAndRequirementsAdmissionValidator") + public Function registryValidator() { + return rgs -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(rgs); + addImdg.accept(context, IMDGDistributedNames.Map_Relation); + addImdg.accept(context, IMDGDistributedNames.Map_Session); + addImdg.accept(context, IMDGDistributedNames.Map_SectionDictionary); + addImdg.accept(context, IMDGDistributedNames.Map_Account); + addImdg.accept(context, IMDGDistributedNames.Map_Company); + addImdg.accept(context, IMDGDistributedNames.Map_TradingClearingRegistry); + return new ValidatorImpl<>(context, + RegistryStep3ValidationRule.ClearingAvailable, + RegistryStep3ValidationRule.AccountActive, + RegistryStep3ValidationRule.CompanyActive, + RegistryStep3ValidationRule.TradingClearingRegistryActive); + }; + } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java index 7b8cb5e01..9dd2a2595 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java @@ -5,12 +5,15 @@ import ru.spcex.platform.utils.enumeration.IErrorEnumId; public enum ClearingError implements IErrorEnumId { GeneralError(5400L), RecordNotFound(5406L), + CompanyNotActive(5411L), CompanyCreditCheck(5412L), CompanyDebitCheck(5413L), CompanyNotFound(5410L), + AccountNotActive(5415L), SecurityNotFound(5416L), TradingClearingRegistryNotFound(5418L), TradingClearingRegistryNotActive(5419L), + ClearingUnavailableForCompany(5421L), InsecurityObligation(5422L), NewDealsNotFound(5423L), ; diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RegistryStep3ValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RegistryStep3ValidationRule.java new file mode 100644 index 000000000..495574f9e --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RegistryStep3ValidationRule.java @@ -0,0 +1,104 @@ +package ru.spcex.clearing.service.validation; + +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.relation.Relation; +import ru.clearing.classes.statics.data.misc.Session; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.clearing.platform.dictionary.SectionDictionary; +import ru.spcex.clearing.error.ClearingError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.ServiceStatus; +import ru.spcex.platform.enumeration.WorkflowStatus; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IEnumKey; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Map; +import java.util.Optional; +import java.util.function.Supplier; + +public enum RegistryStep3ValidationRule implements IValidationRule> { + ClearingAvailable() { + @Override + public Optional validate(ImdgValidationContext context) { + Registry validatedObject = context.getValidatedObject(); + Supplier sectionFind = () -> { + Imdg sessionImdg = context.obtainMap(IMDGDistributedNames.Map_Session, Session.class); + Imdg sectionDictionaryImdg = context.obtainMap(IMDGDistributedNames.Map_SectionDictionary, SectionDictionary.class); + Session session = sessionImdg.getSingleObjectByID(validatedObject.getSessionId()); + if (session == null) { + return "null"; + } else { + SectionDictionary section = sectionDictionaryImdg.getSingleObjectBySQL("code ='" + session.getSection() + "'"); + if (section == null) { + return "null"; + } else { + return section.getName(); + } + } + }; + if (validatedObject.getCompanyId() == null) { + return of(ClearingError.ClearingUnavailableForCompany, sectionFind.get()); + } + Imdg relationImdg = context.obtainMap(IMDGDistributedNames.Map_Relation, Relation.class); + Relation relation = relationImdg.getSingleObjectByFieldValues(Map.of("consumerId", validatedObject.getCompanyId())); + if (relation == null || (!ServiceStatus.Active.equalsByKey(relation.getServiceStatus()) && !ServiceStatus.Reopened.equalsByKey(relation.getServiceStatus()))) { + return of(ClearingError.ClearingUnavailableForCompany, sectionFind.get(), validatedObject.getCompanyId()); + } + context.storeObject(RegistryValidationStored.Relation, relation); + return empty(); + } + }, + AccountActive() { + @Override + public Optional validate(ImdgValidationContext context) { + Registry validatedObject = context.getValidatedObject(); + Relation relation = context.getStoredObject(RegistryValidationStored.Relation); + Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + Account account = accountImdg.getSingleObjectBySQL("id = %d and relationId = %d".formatted(validatedObject.getAccountId(), relation.getId())); + if (account == null || (!IEnumKey.contains(account.getStatus(), ServiceStatus.Active, ServiceStatus.Reopened))) { + return of(ClearingError.AccountNotActive, validatedObject.getAccountId()); + } + return empty(); + } + }, + CompanyActive() { + @Override + public Optional validate(ImdgValidationContext context) { + Registry validatedObject = context.getValidatedObject(); + Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + if (validatedObject.getCompanyId() == null) { + return of(ClearingError.CompanyNotActive, validatedObject.getCompanyId()); + } + Company company = companyImdg.getSingleObjectBySQL("id = %d".formatted(validatedObject.getCompanyId())); + if (company == null || !WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) { + return of(ClearingError.CompanyNotActive, validatedObject.getCompanyId()); + } + return empty(); + } + }, + TradingClearingRegistryActive() { + @Override + public Optional validate(ImdgValidationContext context) { + Registry validatedObject = context.getValidatedObject(); + if (validatedObject.getTradingClearingRegistryId() == null) { + return of(ClearingError.TradingClearingRegistryNotActive, validatedObject.getTradingClearingRegistryId()); + } + Imdg tradingClearingRegistryImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); + TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectBySQL("id = " + validatedObject.getTradingClearingRegistryId()); + if (tcr == null || (ServiceStatus.Active.equalsByKey(tcr.getStatus()) || ServiceStatus.Reopened.equalsByKey(tcr.getStatus()))) + return of(ClearingError.TradingClearingRegistryNotActive, validatedObject.getTradingClearingRegistryId()); + return empty(); + } + }, + ; + + @Override + public String ruleName() { + return "STradesValidationRule." + name(); + } +} \ No newline at end of file diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RegistryValidationStored.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RegistryValidationStored.java new file mode 100644 index 000000000..0d7bba6b7 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RegistryValidationStored.java @@ -0,0 +1,5 @@ +package ru.spcex.clearing.service.validation; + +public enum RegistryValidationStored { + Relation +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java index 47d060511..d30d4c7d8 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java @@ -15,6 +15,10 @@ public enum TaskType { * step 2 */ RequirementsAndObligationsCreate, + /** + * step 3 + */ + ObligationsAdmission, /** * step 4 */ diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/ObligationAdmission.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/ObligationAdmission.java new file mode 100644 index 000000000..f62cdd211 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/ObligationAdmission.java @@ -0,0 +1,79 @@ +package ru.spcex.clearing.session.stage.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.registry.Registry; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.session.stage.ISessionStage; +import ru.spcex.clearing.session.stage.StageResult; +import ru.spcex.clearing.session.stage.Task; +import ru.spcex.clearing.session.stage.TaskType; +import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.validation.IValidator; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +public class ObligationAdmission implements ISessionStage { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Imdg registryImdg; + private final ImdgProvider imdgProvider; + private final Function validatorFactory; + private final IMessageResolver messageResolver; + + @Autowired + public ObligationAdmission(ImdgProvider imdgProvider, + @Qualifier("obligationAndRequirementsAdmissionValidator") Function validatorFactory, + IMessageResolver messageResolver) { + this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); + this.imdgProvider = imdgProvider; + this.validatorFactory = validatorFactory; + this.messageResolver = messageResolver; + } + + @SuppressWarnings("unchecked") + @Override + public StageResult submit(Task task) { + if (task.getTaskType() == TaskType.ObligationsAdmission) { + return obligationAdmission((Long) task.getData()); + } + throw new IllegalStateException("Unknown task type: " + task.getTaskType()); + } + + private StageResult obligationAdmission(Long sessionId) { + Collection registries = registryImdg.getCollectionObjectsBySQL("sessionId = " + sessionId); + Map> byGroups = registries.stream().collect(Collectors.groupingBy(Registry::getGroupId)); + for (Map.Entry> grpEntry : byGroups.entrySet()) { + EnumMessage groupError = null; + List rgsGroup = grpEntry.getValue(); + for (Registry rgs : rgsGroup) { + IValidator validator = validatorFactory.apply(rgs); + Optional error = validator.tillFirstError(); + if (error.isPresent()) { + groupError = error.get(); + break; + } + } + if (groupError != null) { + log.warn("error {} for registries groupId = {}", messageResolver.resolve(groupError), grpEntry.getKey()); + for (Registry rgs : rgsGroup) { + rgs.setRegistryStatus(RegistryStatus.NACK.getKey()); + registryImdg.update(rgs); + } + } + } + return new StageResult<>(null, true); + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java similarity index 98% rename from clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java rename to clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java index c10e29938..eaecae3f8 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirmentsAndObligationCreation.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java @@ -32,14 +32,14 @@ import java.util.function.BiConsumer; import java.util.function.BiFunction; @Service -public class RequirmentsAndObligationCreation implements ISessionStage { +public class RequirementsAndObligationCreation implements ISessionStage { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg registryImdg; private final ImdgProvider imdgProvider; @Autowired - public RequirmentsAndObligationCreation(ImdgProvider imdgProvider) { + public RequirementsAndObligationCreation(ImdgProvider imdgProvider) { this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.imdgProvider = imdgProvider; } diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryStatus.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryStatus.java index 451a06ef8..ec4f38aa2 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryStatus.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/RegistryStatus.java @@ -3,7 +3,7 @@ package ru.spcex.platform.enumeration; import ru.spcex.platform.utils.enumeration.IEnumKey; public enum RegistryStatus implements IEnumKey { - OK("OK"), PROC("PROC"), + OK("OK"), PROC("PROC"), NACK("NACK"), ; private final String key; From fd2b54d44b3bdfcd377c0117f9295911791abb3b Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 22 May 2023 19:31:59 +0300 Subject: [PATCH 22/62] =?UTF-8?q?backend-api=20meta=204=20=D0=BE=D0=B1?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20API=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/meta/meta.json | 30 +- .../src/main/resources/meta/meta.xml | 4214 +++++++++-------- .../backend-api/src/test/resources/meta.json | 30 +- 3 files changed, 2161 insertions(+), 2113 deletions(-) diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.json b/clearing-parent/backend-api/src/main/resources/meta/meta.json index e345077d9..7b96718d8 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.json +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.json @@ -1,6 +1,6 @@ { - "version": "3.5.0.23", + "version": "3.5.0.24", "enums": { @@ -2600,7 +2600,7 @@ } , {"code": "lotSize", - "type": 11,"name": "Размер лота","shortname": "Лот" + "field": "securityId","type": 11,"name": "Размер лота","shortname": "Лот","linkKeyCode": "securityId","linkCode": "lotSize","link": "listing" } , {"code": "nominalValue", @@ -2849,7 +2849,7 @@ } , {"code": "lotSize", - "type": 11,"name": "Размер лота","shortname": "Лот" + "field": "securityId","type": 11,"name": "Размер лота","shortname": "Лот","linkKeyCode": "securityId","linkCode": "lotSize","link": "listing" } , {"code": "issuerId", @@ -3080,7 +3080,7 @@ } , {"code": "lotSize", - "type": 11,"name": "Размер лота","shortname": "Лот" + "field": "securityId","type": 11,"name": "Размер лота","shortname": "Лот","linkKeyCode": "securityId","linkCode": "lotSize","link": "listing" } , {"code": "nominalValue", @@ -5206,6 +5206,28 @@ "name": "Формирование реестра распоряжений, направленных расчетному депозитарию", + "fields": [] + } + , + {"method":"post", + + "destination": "LOSC", + + "group": "Клиринг", + + "name": "Загрузить инструменты", + + "fields": [] + } + , + {"method":"post", + + "destination": "LOCM", + + "group": "Клиринг", + + "name": "Загрузить участников", + "fields": [] } ] diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.xml b/clearing-parent/backend-api/src/main/resources/meta/meta.xml index 7527dd5e0..7735e5c00 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.xml @@ -1,2106 +1,2110 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - -
- - - - - - - - - - -
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -