diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportWithPeriod.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportWithPeriod.java index 07caffd69..77a00ec6e 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportWithPeriod.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportWithPeriod.java @@ -11,7 +11,7 @@ import java.time.LocalDate; /** * Шапка для отчётов, содержащих startDate и endDate */ -public class ReportWithPeriod extends AbstractReport { +public abstract class ReportWithPeriod extends AbstractReport { @XStreamAsAttribute @XStreamAlias("startDate") diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java index f95d0af68..113de634c 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java @@ -1,18 +1,43 @@ package ru.spcex.clearing.reports; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.context.ConfigurableApplicationContext; +import ru.spcex.clearing.reports.services.ReportDataCollector; import ru.spcex.clearing.reports.services.ReportsService; +import ru.spcex.clearing.reports.services.builders.XMLReportBuilder; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.time.LocalDate; +import java.util.Map; @SpringBootApplication public class ReportsServiceApplication { public static void main(String[] args) { try { SpringApplicationBuilder builder = new SpringApplicationBuilder(ReportsServiceApplication.class); - builder.run(args); + ConfigurableApplicationContext context = builder.run(args); + + //todo это тест. Переписать код: + Logger log = LoggerFactory.getLogger(ReportsServiceApplication.class); + ImdgProvider imdg = context.getBean(ImdgProvider.class); + log.info("Wait IMDG..."); + imdg.waitAvailable(); + log.info("Run generate report."); + Map allReports = context.getBeansOfType(ReportDataCollector.class); + log.info("Report types: {}", allReports); + for (ReportDataCollector collector:allReports.values()) { + log.info("Make report {}", collector); + XMLReportBuilder xmlReportBuilder = new XMLReportBuilder(collector.getReportClass(), collector); + LocalDate date2 = LocalDate.now(); + LocalDate date1 = LocalDate.of(date2.getYear(), date2.getMonth(), 1);//date2.minusMonths(1); + xmlReportBuilder.createReport(date1, date2); + } } catch (Throwable e) { - LoggerFactory.getLogger(ReportsServiceApplication.class).error("DBF-Loader start failed: {} -> {}", e.getClass().getSimpleName(), e.getMessage()); + LoggerFactory.getLogger(ReportsServiceApplication.class).error("Report-service start failed: {} -> {}", e.getClass().getSimpleName(), ExceptionUtils.getStackTrace(e)); System.exit(-1); } ReportsService reportsService = new ReportsService(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java index 7cb550e10..a79eaa702 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java @@ -3,18 +3,19 @@ package ru.spcex.clearing.reports.config.element; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; -//import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings; -//import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings; import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; +/** + * Параметр запуска: XMLReportBuilder + * --spring.config.location=E:/MFD_GIT_REPO/clearing/clearing-parent/reports-service/src/main/resources + * + */ @Component @PropertySource("file:${spring.config.location}/application.properties") -//todo for test @PropertySource("classpath:application.properties") @ConfigurationProperties("reports-service") public class ReportsServiceSettings { private HazelcastClientParams hazelcast; -// private KafkaConsumerSettings kafkaConsumer; -// private KafkaProducerSettings kafkaProducer; + private String reportModuleOut; public HazelcastClientParams getHazelcast() { return hazelcast; @@ -24,19 +25,12 @@ public class ReportsServiceSettings { this.hazelcast = hazelcast; } -// public KafkaConsumerSettings getKafkaConsumer() { -// return kafkaConsumer; -// } -// -// public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) { -// this.kafkaConsumer = kafkaConsumer; -// } -// -// public KafkaProducerSettings getKafkaProducer() { -// return kafkaProducer; -// } -// -// public void setKafkaProducer(KafkaProducerSettings kafkaProducer) { -// this.kafkaProducer = kafkaProducer; -// } + + public String getReportModuleOut() { + return reportModuleOut; + } + + public void setReportModuleOut(String reportModuleOut) { + this.reportModuleOut = reportModuleOut; + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java index df56feb45..7f82058a3 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/AbstractReport.java @@ -3,10 +3,15 @@ package ru.spcex.clearing.reports.reports; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + /** * Общая шапка (атрибуты) для всех отчетов */ public abstract class AbstractReport { + protected static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy"); + protected static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy'T'HH:mm:ss"); @XStreamAsAttribute @XStreamAlias("version") @@ -28,4 +33,6 @@ public abstract class AbstractReport { this.name = name; } + abstract public String getReportName(LocalDateTime reportDateTime); + } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_B.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_B.java index c527ee2b5..ac062d5fb 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_B.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_B.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; +import java.time.LocalDateTime; @XStreamAlias("netPositionBank") public class ReportPA_BT2_B extends ReportWithPeriod { @@ -93,6 +94,15 @@ public class ReportPA_BT2_B extends ReportWithPeriod { this.total = new Total(claimsAmount, liabilitiesAmount, paymentAmount); } + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPPA.BT12.2.B.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } + @XStreamAlias("total") public static class Total { @XStreamAlias("claimsAmount") diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_IV.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_IV.java index 04ddbdc22..e10ac91bb 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_IV.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_12_2/ReportPA_BT2_IV.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; +import java.time.LocalDateTime; @XStreamAlias("netPositionInitiator") public class ReportPA_BT2_IV extends ReportWithPeriod { @@ -93,6 +94,15 @@ public class ReportPA_BT2_IV extends ReportWithPeriod { this.total = new Total(claimsAmount, liabilitiesAmount, paymentAmount); } + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPPA.BT12.2.IV.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } + @XStreamAlias("total") public static class Total { @XStreamAlias("claimsAmount") diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_11.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_11.java index 0bb6fce3f..893c204ab 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_11.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_11.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.reports.AbstractReport; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.LocalTime; @XStreamAlias("incomingDocuments") @@ -91,4 +92,10 @@ public class Report_BT13_11 extends AbstractReport { this.inDocumentJournalReceiptDate = inDocumentJournalReceiptDate; } + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "DOCIN.%s".formatted( + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_12.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_12.java index 9e7a36639..de765fe63 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_12.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_13/Report_BT13_12.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.reports.AbstractReport; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.LocalTime; @XStreamAlias("outgoingDocuments") @@ -119,4 +120,11 @@ public class Report_BT13_12 extends AbstractReport { this.outDocumentJournalDossierNumber = outDocumentJournalDossierNumber; this.outDocumentJournalPostDate = outDocumentJournalPostDate; } + + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "DOCOUT.%s".formatted( + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_16_5/Report_BT16_5.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_16_5/Report_BT16_5.java index 0b3db0ccc..3dc1d5737 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_16_5/Report_BT16_5.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_16_5/Report_BT16_5.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.reports.AbstractReport; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.LocalTime; @XStreamAlias("accountBalanceInfo") @@ -69,4 +70,11 @@ public class Report_BT16_5 extends AbstractReport { this.accountBalanceCloseAmount = accountBalanceCloseAmount; } + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "INACCNT.%s.%s".formatted( + companyClearingCode, + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P1.java index ab2700296..47600c673 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P1.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P1.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.reports.ReportWithClearingStatus; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -76,4 +77,13 @@ public class ReportBR_0420315_P1 extends ReportWithClearingStatus { } } + + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPBR.0420315.P1.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P2.java index 450b87e0f..a7c87f98d 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P2.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_1/ReportBR_0420315_P2.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; +import java.time.LocalDateTime; @XStreamAlias("clearedLiabilitiesTotal") public class ReportBR_0420315_P2 extends ReportWithPeriod { @@ -68,4 +69,13 @@ public class ReportBR_0420315_P2 extends ReportWithPeriod { } + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPBR.0420315.P2.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } + } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_2/ReportBR_0420317.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_2/ReportBR_0420317.java index 8ad1f2bcd..2357530a0 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_2/ReportBR_0420317.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_2/ReportBR_0420317.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -89,4 +90,13 @@ public class ReportBR_0420317 extends ReportWithPeriod { this.relationComment = relationComment; } } + + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPBR.0420317.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_3/ReportBR_0420318.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_3/ReportBR_0420318.java index c48422636..73dc19c81 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_3/ReportBR_0420318.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_3/ReportBR_0420318.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.reports.ReportWithClearingStatus; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -114,4 +115,13 @@ public class ReportBR_0420318 extends ReportWithClearingStatus { this.liabilitiesClaimsAssetsFullNames = liabilitiesClaimsAssetsFullNames; } } + + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPBR.0420318.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P1.java index cc6dfed89..0940041db 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P1.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P1.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.reports.ReportWithClearingStatus; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -90,4 +91,13 @@ public class ReportBR_0420314_P1 extends ReportWithClearingStatus { this.liabilitiesClaimsAssetsLiabilitiesQuantity = liabilitiesClaimsAssetsLiabilitiesQuantity; } } + + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPBR.0420314.P1.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java index 6c924222a..478698b15 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_4/ReportBR_0420314_P2.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -83,4 +84,13 @@ public class ReportBR_0420314_P2 extends ReportWithPeriod { } } + + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPBR.0420314.P2.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java index a19956e75..af4884919 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; +import java.time.LocalDateTime; @XStreamAlias("clearingCoverage1") public class ReportBR_0420312_P1 extends ReportWithPeriod { @@ -87,4 +88,13 @@ public class ReportBR_0420312_P1 extends ReportWithPeriod { } } + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPBR.0420312_р1-1.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } + } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P10.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P10.java index e7196690b..0f79fe269 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P10.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P10.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; +import java.time.LocalDateTime; @XStreamAlias("clearingCoverage10") public class ReportBR_0420312_P10 extends ReportWithPeriod { @@ -37,4 +38,13 @@ public class ReportBR_0420312_P10 extends ReportWithPeriod { this.liabilitiesAmount = liabilitiesAmount; } } + + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPBR.0420312_р3-3.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P2.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P2.java index 0cf73c838..84dbf562d 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P2.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P2.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; +import java.time.LocalDateTime; @XStreamAlias("clearingCoverage2") public class ReportBR_0420312_P2 extends ReportWithPeriod { @@ -45,4 +46,13 @@ public class ReportBR_0420312_P2 extends ReportWithPeriod { } } + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPBR.0420312_р1-2.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } + } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P3.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P3.java index 0c92c0676..97442b1a9 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P3.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P3.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; +import java.time.LocalDateTime; @XStreamAlias("clearingCoverage3") public class ReportBR_0420312_P3 extends ReportWithPeriod { @@ -46,4 +47,12 @@ public class ReportBR_0420312_P3 extends ReportWithPeriod { } } + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPBR.0420312_р1-3.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P4.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P4.java index ee1d00f29..d4725b978 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P4.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P4.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; +import java.time.LocalDateTime; @XStreamAlias("clearingCoverage4") public class ReportBR_0420312_P4 extends ReportWithPeriod { @@ -38,4 +39,12 @@ public class ReportBR_0420312_P4 extends ReportWithPeriod { } } + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPBR.0420312_р1-4.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P5.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P5.java index 57318d940..1af1850eb 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P5.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P5.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; +import java.time.LocalDateTime; @XStreamAlias("clearingCoverage5") public class ReportBR_0420312_P5 extends ReportWithPeriod { @@ -37,4 +38,13 @@ public class ReportBR_0420312_P5 extends ReportWithPeriod { this.liabilitiesAmount = liabilitiesAmount; } } + + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPBR.0420312_р1-5.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P6.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P6.java index b03bf0069..6b5126f7e 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P6.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P6.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; +import java.time.LocalDateTime; @XStreamAlias("clearingCoverage6") public class ReportBR_0420312_P6 extends ReportWithPeriod { @@ -37,4 +38,13 @@ public class ReportBR_0420312_P6 extends ReportWithPeriod { this.liabilitiesAmount = liabilitiesAmount; } } + + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPBR.0420312_р1-6.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P7.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P7.java index 72a57f10b..81b539868 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P7.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P7.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; +import java.time.LocalDateTime; @XStreamAlias("clearingCoverage7") public class ReportBR_0420312_P7 extends ReportWithPeriod { @@ -37,4 +38,13 @@ public class ReportBR_0420312_P7 extends ReportWithPeriod { this.liabilitiesAmount = liabilitiesAmount; } } + + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPBR.0420312_р1-7.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P8.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P8.java index 8f6f431a5..563ffc599 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P8.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P8.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; +import java.time.LocalDateTime; @XStreamAlias("clearingCoverage8") public class ReportBR_0420312_P8 extends ReportWithPeriod { @@ -85,4 +86,13 @@ public class ReportBR_0420312_P8 extends ReportWithPeriod { this.clearingMemberCategoryClearingMemberCategory = clearingMemberCategoryClearingMemberCategory; } } + + @Override + public String getReportName(LocalDateTime reportDateTime) { + return " REPBR.0420312_р3-1.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P9.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P9.java index d508df865..3438b9d05 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P9.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P9.java @@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; +import java.time.LocalDateTime; @XStreamAlias("clearingCoverage9") public class ReportBR_0420312_P9 extends ReportWithPeriod { @@ -61,4 +62,13 @@ public class ReportBR_0420312_P9 extends ReportWithPeriod { this.liabilitiesClaimsAssetsLiabilities = liabilitiesClaimsAssetsLiabilities; } } + + @Override + public String getReportName(LocalDateTime reportDateTime) { + return "REPBR.0420312_р3-2.%s-%s.%s".formatted( + DATE_FORMATTER.format(startDate), + DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(reportDateTime) + ); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/DOCXService.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/DOCXService.java index ac1a078ea..86483a38b 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/DOCXService.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/DOCXService.java @@ -15,6 +15,11 @@ import java.util.stream.Collectors; /** * Сервис для работы с DOCX файлами * Читает шаблон .docx и во всех текстовых элементах меняет переданные ключи на соответствующие им значения + * Пример ключа по умолчанию: ${ключ} + * + * При использовании нового шаблона, необходимо отредактировать docx документ так, чтобы ключ содержался в одном + * элементе. Для этого нужно вырезать ключ и в это же место вставить его как текст, без форматирования. Если нужно, + * идентификатору потом можно установить стиль, который будет применён к вставляемой строке. */ public class DOCXService { /** diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java index a3d5683e0..739c83759 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java @@ -4,8 +4,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.spcex.clearing.reports.reports.AbstractReport; +import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.List; @@ -20,22 +22,37 @@ public abstract class ReportDataCollector { * T extends ReportWithPeriod * @return */ - abstract public List collectReportWithPeriod(LocalDate startDate, LocalDate endDate); + abstract public T collectReportWithPeriod(LocalDate startDate, LocalDate endDate); + +// /** +// * T extends ReportWithClearingStatus +// * @param startDate +// * @param endDate +// * @return +// */ +// abstract public List collectReportWithClearingStatus(LocalDate startDate, LocalDate endDate, String clearingStatus); /** - * T extends ReportWithClearingStatus - * @param startDate - * @param endDate - * @return - */ - abstract public List collectReportWithClearingStatus(LocalDate startDate, LocalDate endDate, String clearingStatus); - - /** - * + * todo убрать метод, он уже лишний * @param startDate * @param endDate * @param dateTimeNow LocalDateTime.now() * @return */ - abstract public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow); + @Deprecated + public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) { + throw new IllegalArgumentException("deprecated"); + } + + abstract public Class getReportClass(); + + protected String toString(Long val) { + if (val == null) return null; + return val.toString(); + } + + protected String toString(Instant val) { + if (val == null) return null; + return DATE_TIME_FORMATTER.format(val.atZone(ZoneId.systemDefault())); + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/DOCXReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/DOCXReportBuilder.java new file mode 100644 index 000000000..ebf56d43d --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/DOCXReportBuilder.java @@ -0,0 +1,16 @@ +package ru.spcex.clearing.reports.services.builders; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.spcex.clearing.reports.reports.AbstractReport; + +import java.io.File; +import java.io.IOException; + +public abstract class DOCXReportBuilder extends FileReportBuilder { + private final Logger log = LoggerFactory.getLogger(getClass()); + + protected DOCXReportBuilder(Class reportClass, File templateResource) throws IOException { + super(reportClass); + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java new file mode 100644 index 000000000..ee7db9533 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java @@ -0,0 +1,12 @@ +package ru.spcex.clearing.reports.services.builders; + +import ru.spcex.clearing.reports.reports.AbstractReport; + +public abstract class FileReportBuilder { + protected final Class reportClass; + + protected FileReportBuilder(Class reportClass) { + this.reportClass = reportClass; + } + +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java new file mode 100644 index 000000000..ed8ac24bf --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java @@ -0,0 +1,51 @@ +package ru.spcex.clearing.reports.services.builders; + +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.naming.NoNameCoder; +import com.thoughtworks.xstream.io.xml.XppDriver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.spcex.clearing.reports.reports.AbstractReport; +import ru.spcex.clearing.reports.services.ReportDataCollector; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.time.LocalDate; +import java.time.LocalDateTime; + +public class XMLReportBuilder extends FileReportBuilder { + private final Logger log = LoggerFactory.getLogger(getClass()); + + protected final XStream xStream; + + protected final ReportDataCollector collector; + + public XMLReportBuilder(Class reportClass, ReportDataCollector collector) { + super(reportClass); + this.collector = collector; + this.xStream = new XStream(new XppDriver(new NoNameCoder())); + xStream.processAnnotations(reportClass); + } + + public File createReport(LocalDate startDate, LocalDate endDate) throws IOException { + R report = collector.collectReportWithPeriod(startDate, endDate); + String reportName = report.getReportName(LocalDateTime.now()); + + if (System.getProperty("os.name").toLowerCase().contains("windows")) reportName = reportName.replace(":", "_"); + + String reportFileName = reportName + ".xml"; + File reportFile = new File(reportFileName); + if (reportFile.exists()) { + if (reportFile.isFile()) { + log.warn("Файл {} существует и будет перезаписан", reportFileName); + boolean deleteOk = reportFile.delete(); + if (!deleteOk) throw new IOException("Не удалось удалить файл " + reportFileName); + } else throw new IOException(reportFileName + " существует, но не является файлом"); + } + try (FileOutputStream fos = new FileOutputStream(reportFile)) { + xStream.toXML(report, fos); + } + return reportFile; + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java new file mode 100644 index 000000000..229eb2a8a --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java @@ -0,0 +1,143 @@ +package ru.spcex.clearing.reports.services.collector; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.generated.ClearingMemberCategory; +import ru.clearing.classes.statics.data.misc.Listing; +import ru.clearing.classes.transaction.data.execution.LiabilitiesClaimsAssets; +import ru.clearing.platform.dictionary.ClearingStatusDictionary; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.bt_17_1.ReportBR_0420315_P1; +import ru.spcex.clearing.reports.services.ReportDataCollector; +import ru.spcex.platform.enumeration.ClearingCategory; +import ru.spcex.platform.enumeration.ClearingStatus; +import ru.spcex.platform.enumeration.Market; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +@Component +public class Bt17_1_P1_collector extends ReportDataCollector { + protected static final List ALLOW_CLEARING_MEMBER_CATEGORY = Arrays.asList(ClearingCategory.I.getKey(), ClearingCategory.V.getKey()); + protected static final String ALLOW_CLEARING_STATUS = ClearingStatus.OK.getKey(); + + private Imdg companyImdg; + private Imdg liabilitiesClaimsAssetsImdg; + private Imdg clearingMemberCategoryImdg; + private Imdg clearingStatusDictionaryImdg; + private Imdg listingImdg; + + @Autowired + public Bt17_1_P1_collector(ImdgProvider imdgProvider) { + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); + clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); + clearingStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingStatusDictionary, ClearingStatusDictionary.class); + listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); + } + + /** + * @param onMarket Market.mkrs.getKey() + * @param securityId liability.getSecurityId() + * @return + */ + protected Listing findListing(Market onMarket, Long securityId) { + Map qParam = new HashMap<>(); + qParam.put("market", onMarket.getKey()); + qParam.put("securityId", securityId); + return listingImdg.getSingleObjectByFieldValues(qParam); + } + + @Override + public ReportBR_0420315_P1 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { + if (startDate.isAfter(endDate)) { + throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")"); + } + ReportBR_0420315_P1 reportBR_0420315_p1 = new ReportBR_0420315_P1(startDate, endDate, + "BR", + "I,V", // cmc.getClearingMemberCategory() + ALLOW_CLEARING_STATUS //clearingStatus.getCode() "OK" + ); + + ClearingStatusDictionary allowClearingStatus = clearingStatusDictionaryImdg.getSingleObjectByFieldValues(Map.of("code", ALLOW_CLEARING_STATUS)); + if (allowClearingStatus == null) { + throw new IllegalStateException("ClearingStatusDictionary with code=\"" + ALLOW_CLEARING_STATUS + "\" not fount"); + } + final Long allowClearingStatusId = allowClearingStatus.getId(); // "OK" + + String ql = String.format("'%s' <= refundDate and refundDate <= '%s' and clearingStatus=%s", + startDate, endDate, allowClearingStatusId); + Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); + + Map> indexByCompany = MapUtil.indexList(liabilities, LiabilitiesClaimsAssets::getCompanyId); + for (Map.Entry> companyEntry : indexByCompany.entrySet()) { + final Long companyId = companyEntry.getKey(); + List liabilitiesOfCompany = companyEntry.getValue(); + Company company = companyImdg.getSingleObjectByID(companyId); + if (company != null) { + ClearingMemberCategory cmc = clearingMemberCategoryImdg.getSingleObjectByFieldValues(Map.of("companyId", companyId)); + String checkCategory = cmc == null ? null : cmc.getClearingMemberCategory(); + if (!ALLOW_CLEARING_MEMBER_CATEGORY.contains(checkCategory)) { + // фильтруются <> I, V + log.trace("Filtered company[{}] ClearingMemberCategory[{}].ClearingMemberCategory={}", + companyId, cmc == null ? null : cmc.getId(), checkCategory); + continue; + } + + HashSet onMarket = new HashSet<>(); + + long contractorQty; + double liabilitiesAmount = 0; + { + HashSet collectedToSumm = new HashSet<>(); // чтобы дважды не посчитать 1 и тот же контракт + HashSet onMarketSecurity=new HashSet<>(); + for (LiabilitiesClaimsAssets lContract : liabilitiesOfCompany) { + if (!onMarketSecurity.contains(lContract.getSecurityId())) { + Listing listing = findListing(Market.mkrs, lContract.getSecurityId()); + if (listing!= null) { + onMarket.add(listing.getMarket()); + } + onMarketSecurity.add(lContract.getSecurityId()); + } + if (lContract.getPrice() != null && StringUtils.isNotEmpty(lContract.getContract()) + && !collectedToSumm.contains(lContract.getContract())) { + collectedToSumm.add(lContract.getContract()); + liabilitiesAmount += lContract.getLiabilitiesQuantity().doubleValue(); + } + } + contractorQty = collectedToSumm.size(); + } + String onMarketString = StringUtils.join(onMarket, ","); + if (onMarket.size() != 1) { // Сейчас по коду ожидается один listing.market="MKRS" но потом могут быть несколько + log.warn("Market for companyId[{}]: {}", companyId, onMarketString); + } + ReportBR_0420315_P1.Info_0420315_P1 info_0420315_p1 = new ReportBR_0420315_P1.Info_0420315_P1(company.getId().toString(), + company.getFullName(), + onMarketString, + String.valueOf(contractorQty), + String.valueOf(liabilitiesAmount)); + reportBR_0420315_p1.getRows().add(info_0420315_p1); + } + } + + return reportBR_0420315_p1; + } + + + @Override + public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) { + return String.format("REPBR.0420315.P1.%s-%s.%s", DATE_FORMATTER.format(startDate), DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(dateTimeNow)); + } + + @Override + public Class getReportClass() { + return ReportBR_0420315_P1.class; + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java new file mode 100644 index 000000000..8bc56a177 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java @@ -0,0 +1,66 @@ +package ru.spcex.clearing.reports.services.collector; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import ru.clearing.classes.transaction.data.execution.LiabilitiesClaimsAssets; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.bt_17_1.ReportBR_0420315_P2; +import ru.spcex.clearing.reports.services.ReportDataCollector; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; + +@Component +public class Bt17_1_P2_collector extends ReportDataCollector { + private Imdg liabilitiesClaimsAssetsImdg; + + @Autowired + public Bt17_1_P2_collector(ImdgProvider imdgProvider) { + liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); + } + + @Override + public ReportBR_0420315_P2 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { + if (startDate.isAfter(endDate)) { + throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")"); + } + String ql = String.format("'%s' <= refundDate and refundDate <= '%s'", startDate, endDate); + Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); + + long contractorQty; + double liabilitiesAmount = 0; + { + HashSet collectedToSumm = new HashSet<>(); + for (LiabilitiesClaimsAssets lContract : liabilities) { + if (lContract.getPrice() != null && StringUtils.isNotEmpty(lContract.getContract()) + && !collectedToSumm.contains(lContract.getContract())) { + collectedToSumm.add(lContract.getContract()); + liabilitiesAmount += lContract.getLiabilitiesQuantity().doubleValue(); + } + } + contractorQty = collectedToSumm.size(); + } + + ReportBR_0420315_P2 reportBR_0420315_p2 = new ReportBR_0420315_P2(startDate, endDate, + "BR", + String.valueOf(contractorQty), + String.valueOf(liabilitiesAmount)); + + return reportBR_0420315_p2; + } + + @Override + public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) { + return String.format("REPBR.0420315.P2.%s-%s.%s", DATE_FORMATTER.format(startDate), DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(dateTimeNow)); + } + + @Override + public Class getReportClass() { + return ReportBR_0420315_P2.class; + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_collector.java deleted file mode 100644 index e3d323dac..000000000 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_collector.java +++ /dev/null @@ -1,104 +0,0 @@ -package ru.spcex.clearing.reports.services.collector; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.generated.ClearingMemberCategory; -import ru.clearing.classes.statics.data.misc.Listing; -import ru.clearing.classes.transaction.data.execution.LiabilitiesClaimsAssets; -import ru.clearing.platform.dictionary.ClearingStatusDictionary; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt_17_1.ReportBR_0420315_P1; -import ru.spcex.clearing.reports.services.ReportDataCollector; -import ru.spcex.platform.enumeration.ClearingStatus; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.math.BigDecimal; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.*; - -@Component -public class Bt17_1_collector extends ReportDataCollector { - private Imdg companyImdg; - private Imdg liabilitiesClaimsAssetsImdg; - private Imdg clearingMemberCategoryImdg; - private Imdg clearingStatusDictionaryImdg; - private Imdg listingImdg; - - @Autowired - public Bt17_1_collector(ImdgProvider imdgProvider) { - companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); - clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); - clearingStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingStatusDictionary, ClearingStatusDictionary.class); - listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); - } - - @Override - public List collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - if (startDate.isAfter(endDate)) { - throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")"); - } - List result = new ArrayList<>(); - - String ql = String.format("'%s' <= refundDate and refundDate <= '%s'", startDate, endDate); - Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); - for (LiabilitiesClaimsAssets liability : liabilities) { - final Long companyId = liability.getCompanyId(); - Company company = companyImdg.getSingleObjectByID(companyId); - if (company != null) { - ClearingMemberCategory cmc = clearingMemberCategoryImdg.getSingleObjectByFieldValues(Map.of("companyId", companyId)); - if (cmc == null || !Arrays.asList("I", "V", "I,V").contains(cmc.getClearingMemberCategory())) { - //todo уточнить фильтр need filter by I, V? - log.trace("Filtered ClearingMemberCategory[{}].ClearingMemberCategory={}", - cmc == null ? null : cmc.getId(), cmc == null ? null : cmc.getClearingMemberCategory()); - continue; - } - ClearingStatusDictionary clearingStatus = clearingStatusDictionaryImdg.getSingleObjectByID(liability.getClearingStatus()); - if (clearingStatus == null || !ClearingStatus.OK.getKey().equals(clearingStatus.getCode())) { - continue; - } - ReportBR_0420315_P1 reportBR_0420315_p1 = new ReportBR_0420315_P1(startDate, endDate, - "BR", - cmc.getClearingMemberCategory(), - clearingStatus.getCode()); - - Listing listing; - { - Map qParam = new HashMap<>(); - qParam.put("market", "MKRS"); // todo use const - qParam.put("securityId", liability.getSecurityId()); - listing = listingImdg.getSingleObjectByFieldValues(qParam); - } -// liability.getPrice()// todo как там с учётом валют это делать? - Integer contractorQty = StringUtils.isEmpty(liability.getContract()) ? 0 : 1; // todo то суммировать надо. Связь похоже много к 1. // liability.getContract() В данное поле необходимо записать общее количество исполненных договоров, шт. элемент contract из бизнес-объекта liabilitiesClaimsAssets - BigDecimal liabilitiesAmount = liability.getPrice() == null ? BigDecimal.ZERO : liability.getPrice(); // todo как правильно считать? - ReportBR_0420315_P1.Info_0420315_P1 info_0420315_p1 = new ReportBR_0420315_P1.Info_0420315_P1("companyId", - company.getFullName(), - listing == null ? null : listing.getMarket(), - contractorQty.toString(), - liabilitiesAmount.toString()); - reportBR_0420315_p1.getRows().add(info_0420315_p1); - - result.add(reportBR_0420315_p1); - } - } - - return result; - } - - @Override - public List collectReportWithClearingStatus(LocalDate startDate, LocalDate endDate, String clearingStatus) { - throw new IllegalStateException("clearingStatus not supported by this class"); - } - - - @Override - public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) { - return String.format("REPBR.0420315.P1.%s-%s.%s", DATE_FORMATTER.format(startDate), DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(dateTimeNow)); - } -} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java new file mode 100644 index 000000000..6081329ea --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java @@ -0,0 +1,82 @@ +package ru.spcex.clearing.reports.services.collector; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.company.relation.Relation; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.bt_17_2.ReportBR_0420317; +import ru.spcex.clearing.reports.services.ReportDataCollector; +import ru.spcex.platform.enumeration.DocumentTypes; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; + +@Component +public class Bt17_2_collector extends ReportDataCollector { + private Imdg companyImdg; + private Imdg relationImdg; + private Imdg companySymbolsImdg; + + @Autowired + public Bt17_2_collector(ImdgProvider imdgProvider) { + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); + companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + } + + @Override + public ReportBR_0420317 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { + if (startDate.isAfter(endDate)) { + throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")"); + } + + String ql = String.format("'%s' <= updated and updated <= '%s' and service='MKR'", startDate, endDate); + // todo обговорить про updatedAt updated, todo enum MKR + Collection relations = relationImdg.getCollectionObjectsBySQL(ql); + + ReportBR_0420317 reportBR_0420317 = new ReportBR_0420317(startDate, endDate, "BR"); + for (Relation relation: relations) { + Company company = relation.getConsumerId() == null ? null : companyImdg.getSingleObjectByID(relation.getConsumerId()); + if (company == null) { + log.warn("Company.id={} not found for relation.id={}", relation.getConsumerId(), relation.getId()); + continue; + } + CompanySymbols companySymbol = companySymbolsImdg.getSingleObjectByFieldValues(Map.of( + "companySymbol", DocumentTypes.inn.getKey(),// ИНН или TIN участника клиринга + "companyId", company.getId() + )); + ReportBR_0420317.Info_0420317 info_0420317 = new ReportBR_0420317.Info_0420317( + company.getClearingCode(), + toString(relation.getSupplierId()), + relation.getService(), + relation.getServiceStatus(), + toString(relation.getUpdated()), + company.getFullName(), + companySymbol == null ? null : companySymbol.getCompanySymbolValue(), + company.getProfile().getCountryCode(), + relation.getComment() + ); + reportBR_0420317.getRows().add(info_0420317); + } + + return reportBR_0420317; + } + + + @Override + public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) { + return String.format("REPBR.0420317.%s-%s.%s", DATE_FORMATTER.format(startDate), DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(dateTimeNow)); + } + + @Override + public Class getReportClass() { + return ReportBR_0420317.class; + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java new file mode 100644 index 000000000..463f6ba36 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java @@ -0,0 +1,69 @@ +package ru.spcex.clearing.reports.services.collector; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.company.relation.Relation; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.reports.reports.bt_17_2.ReportBR_0420317; +import ru.spcex.clearing.reports.reports.bt_17_5.ReportBR_0420312_P1; +import ru.spcex.clearing.reports.services.ReportDataCollector; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.Map; + +@Component +public class Bt17_5_P1_collector extends ReportDataCollector { + private Imdg companyImdg; + private Imdg relationImdg; + private Imdg companySymbolsImdg; + + @Autowired + public Bt17_5_P1_collector(ImdgProvider imdgProvider) { + companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); + companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + } + + @Override + public ReportBR_0420312_P1 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { + if (startDate.isAfter(endDate)) { + throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")"); + } + + // TODO ВСЁ по CLS-29... + String ql = String.format("'%s' <= updated and updated <= '%s' and service='MKR'", startDate, endDate); + // todo обговорить про updatedAt updated, todo enum MKR + Collection relations = relationImdg.getCollectionObjectsBySQL(ql); + + ReportBR_0420312_P1 reportBR_0420312P1 = new ReportBR_0420312_P1(LocalDate.now(), + LocalDate.now(), + "companyClearingCode", + "BR", + "liabilitesClaimsAssetsCompanyId", + "liabilitesClaimsAssetsFullName", + "companySymbolCode", + "companySymbolValue", + "companyInfoCountryCode", + "clearingMemberCategory"); + + return reportBR_0420312P1; + } + + + @Override + public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) { + return String.format("REPBR.0420312_р1-1.%s-%s.%s", DATE_FORMATTER.format(startDate), DATE_FORMATTER.format(endDate), + DATE_TIME_FORMATTER.format(dateTimeNow)); + } + + @Override + public Class getReportClass() { + return ReportBR_0420312_P1.class; + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/MapUtil.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/MapUtil.java new file mode 100644 index 000000000..2b9216819 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/MapUtil.java @@ -0,0 +1,33 @@ +package ru.spcex.clearing.reports.services.collector; + +import ru.spcex.platform.classes.base.interfaces.WithId; + +import java.util.*; +import java.util.function.Function; + +public class MapUtil { + + public static Map index(Collection from, Function indexFieldExtractor) { + Map index = new HashMap<>(); + for (V obj : from) { + K key = indexFieldExtractor.apply(obj); + V exist = index.put(key, obj); + if (exist != null) { + throw new IllegalStateException(String.format("%s with id=%s,%s has duplicate key=\"{}\"", + exist.getClass().getSimpleName(), exist.getId(), obj.getId(), key + )); + } + } + return index; + } + + public static Map> indexList(Collection from, Function indexFieldExtractor) { + Map> index = new HashMap<>(); + for (V obj : from) { + K key = indexFieldExtractor.apply(obj); + List lst = index.computeIfAbsent(key, (_key_) -> new ArrayList<>()); + lst.add(obj); + } + return index; + } +} diff --git a/clearing-parent/reports-service/src/main/resources/application.properties b/clearing-parent/reports-service/src/main/resources/application.properties index 514eaa82e..52d18bea7 100644 --- a/clearing-parent/reports-service/src/main/resources/application.properties +++ b/clearing-parent/reports-service/src/main/resources/application.properties @@ -2,6 +2,7 @@ server.port=8080 server.servlet.context-path=/reports_service spring.main.web-application-type=servlet -reports-service.hazelcast.cluster-members=127.0.0.1:5701 +reports-service.hazelcast.cluster-members=127.0.0.1:5701,10.200.200.181:5701 reports-service.hazelcast.login=dev reports-service.hazelcast.password=dev-pass +reports-service.ReportModuleOut=./report_out diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java new file mode 100644 index 000000000..7341332e7 --- /dev/null +++ b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java @@ -0,0 +1,45 @@ +package ru.spcex.clearing.reports.services; + +import org.junit.jupiter.api.Test; +import ru.spcex.clearing.reports.reports.AbstractReport; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; + +import static org.junit.jupiter.api.Assertions.*; + +class ReportDataCollectorTest extends ReportDataCollector { + + @Test + void testToString() { + ReportDataCollectorTest instance = new ReportDataCollectorTest(); + assertEquals(null, instance.toString((Long)null)); + assertEquals("1", instance.toString((Long)1L)); + assertEquals("1230", instance.toString((Long)1230L)); + + } + + @Test + void testToString1() { + ReportDataCollectorTest instance = new ReportDataCollectorTest(); + assertEquals(null, instance.toString((Instant)null)); + Instant val = Instant.ofEpochMilli(1672058774338L); + assertEquals("26.12.2022T15:46:14", instance.toString(val)); // msk timezone + } + + @Override + public AbstractReport collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { + throw new IllegalStateException("test"); + } + + @Override + public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) { + throw new IllegalStateException("test"); + } + + @Override + public Class getReportClass() { + return AbstractReport.class; + } +} \ No newline at end of file diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/impl/Bt17_1_collectorTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/impl/Bt17_1_collectorTest.java index 6b023cc50..cef49c50c 100644 --- a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/impl/Bt17_1_collectorTest.java +++ b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/impl/Bt17_1_collectorTest.java @@ -2,7 +2,7 @@ package ru.spcex.clearing.reports.services.impl; import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import ru.spcex.clearing.reports.services.collector.Bt17_1_collector; +import ru.spcex.clearing.reports.services.collector.Bt17_1_P1_collector; import java.time.LocalDate; import java.time.LocalDateTime; @@ -13,7 +13,7 @@ class Bt17_1_collectorTest { @Test void getFileName() { - Bt17_1_collector collector = Mockito.mock(Bt17_1_collector.class); + Bt17_1_P1_collector collector = Mockito.mock(Bt17_1_P1_collector.class); Mockito.when(collector.getFileName(Mockito.any(),Mockito.any(),Mockito.any())).thenCallRealMethod(); String str = collector.getFileName(LocalDate.of(2020,1,1), diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/ClearingCalendarService.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/ClearingCalendarService.java index 70bd24147..3a86684b7 100644 --- a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/ClearingCalendarService.java +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/ClearingCalendarService.java @@ -18,6 +18,8 @@ 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; + @Service public class ClearingCalendarService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -33,21 +35,23 @@ public class ClearingCalendarService extends QueueConsumer implements Initializi @Override public void afterPropertiesSet() { callback(ClearingCalendarNewRequest.class) - .setConsumer(this::newTradingCalendar) + .setConsumer(this::newClearingCalendar) .forDestination(Consts.DESTINATION_CLEARING_CALENDAR_NEW, callbacks::put); callback(ClearingCalendarUpdateRequest.class) - .setConsumer(this::updateTradingCalendar) + .setConsumer(this::updateClearingCalendar) .forDestination(Consts.DESTINATION_CLEARING_CALENDAR_UPDATE, callbacks::put); callback(CommonDeleteRequest.class) - .setConsumer(this::deleteTradingCalendar) + .setConsumer(this::deleteClearingCalendar) .forDestination(Consts.DESTINATION_CLEARING_CALENDAR_DELETE, callbacks::put); init(); } - private void newTradingCalendar(BaseRequest userRequest) { + private void newClearingCalendar(BaseRequest userRequest) { ClearingCalendarNewRequest req = userRequest.getRequestPayload(); log.debug("ClearingCalendarNewRequest received"); ClearingCalendar clearingCalendar = new ClearingCalendar(); + Instant created = Instant.now(); + clearingCalendar.setCreated(created); clearingCalendar.setClearingDate(req.getClearingDate()); clearingCalendar.setCompanyId(req.getCompanyId()); clearingCalendar.setDayStatus(req.getDayStatus()); @@ -55,18 +59,20 @@ public class ClearingCalendarService extends QueueConsumer implements Initializi log.debug("successfully processed, new id {}", clearingCalendar.getId()); } - private void updateTradingCalendar(BaseRequest userRequest) { + private void updateClearingCalendar(BaseRequest userRequest) { ClearingCalendarUpdateRequest req = userRequest.getRequestPayload(); log.debug("ClearingCalendarUpdateRequest received"); + Instant updated = Instant.now(); ClearingCalendar clearingCalendar = clearingCalendarMap.getSingleObjectByID(req.getId()); clearingCalendar.setClearingDate(req.getClearingDate()); clearingCalendar.setCompanyId(req.getCompanyId()); clearingCalendar.setDayStatus(req.getDayStatus()); + clearingCalendar.setUpdated(updated); clearingCalendarMap.update(clearingCalendar); log.debug("successfully processed, new id {}", clearingCalendar.getId()); } - private void deleteTradingCalendar(BaseRequest userRequest) { + private void deleteClearingCalendar(BaseRequest userRequest) { CommonDeleteRequest req = userRequest.getRequestPayload(); log.debug("CommonDeleteRequest received id = {}", req.getId()); ClearingCalendar clearingCalendar = clearingCalendarMap.getSingleObjectByID(req.getId()); 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 491e884dc..77a1466a0 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 @@ -50,7 +50,8 @@ public class PlannerTemplateService extends QueueConsumer implements Initializin PlannerTemplateNewRequest req = userRequest.getRequestPayload(); log.debug("PlannerTemplateNewRequest received"); PlannerTemplate plannerTemplate = new PlannerTemplate(); - plannerTemplate.setCreated(Instant.now()); + Instant created = Instant.now(); + plannerTemplate.setCreated(created); plannerTemplate.setTask(req.getTask()); plannerTemplate.setTaskTime(req.getTaskTime()); plannerTemplate.setTaskStatus(req.getTaskStatus()); @@ -64,7 +65,8 @@ public class PlannerTemplateService extends QueueConsumer implements Initializin PlannerTemplateUpdateRequest req = userRequest.getRequestPayload(); log.debug("PlannerTemplateUpdateRequest received"); PlannerTemplate plannerTemplate = plannerTemplateMap.getSingleObjectByID(req.getId()); - plannerTemplate.setUpdated(Instant.now()); + Instant updated = Instant.now(); + plannerTemplate.setUpdated(updated); plannerTemplate.setTask(req.getTask()); plannerTemplate.setTaskTime(req.getTaskTime()); plannerTemplate.setTaskStatus(req.getTaskStatus()); diff --git a/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/config/HazelcastServiceTestConfiguration.java b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/config/HazelcastServiceTestConfiguration.java new file mode 100644 index 000000000..af55150d0 --- /dev/null +++ b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/config/HazelcastServiceTestConfiguration.java @@ -0,0 +1,68 @@ +package ru.specx.clearing.scheduler.config; + +import com.hazelcast.config.*; +import com.hazelcast.core.Hazelcast; +import com.hazelcast.core.HazelcastInstance; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.spcex.platform.imdg.iml.hazelcast.util.HazelcastHelper; + +import java.util.List; +import java.util.Random; + +@Configuration +public class HazelcastServiceTestConfiguration { + private HazelcastInstance hazelcastInstance; + + 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; + } + + @Bean(name = "hazelcastServiceTest") + public HazelcastService hazelcastService(@Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, HazelcastClientParams params) { + Config cfg = new Config(); + cfg.setInstanceName("localhost"); + + NetworkConfig networkConfig = new NetworkConfig(); + JoinConfig joinConfig = new JoinConfig(); + joinConfig.setMulticastConfig(new MulticastConfig().setEnabled(false)); + joinConfig.setTcpIpConfig(new TcpIpConfig().setEnabled(true).setMembers(List.of("127.0.0.1"))); + networkConfig.setJoin(joinConfig); + cfg.setNetworkConfig(networkConfig); + hazelcastInstance = Hazelcast.newHazelcastInstance(cfg); + HazelcastHelper.otcSystem_setStorageState(true, hazelcastInstance); + return new HazelcastService(taskExecutorHazelcastClientInitializer, taskExecutorIdGeneratorAwaiter, params); + } + + @Bean(name = "taskExecutorHazelcastClientInitializer") + public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() { + return createThreadPoolTaskExecutor(1, true); + } + + @Bean(name = "taskExecutorIdGeneratorAwaiter") + public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() { + return createThreadPoolTaskExecutor(1, false); + } + + @Bean(name = "hazelcastClientParams") + public HazelcastClientParams getHazelcastClientParams() { + HazelcastClientParams params = new HazelcastClientParams(); + params.setLogin("dev"); + params.setPassword("dev-pass"); + params.setClusterMembers("127.0.0.1"); + params.setInstanceName("hzTestClient" + new Random().nextInt()); + params.setNearCacheConfig(new NearCacheConfig()); + return params; + } +} diff --git a/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/service/ClearingCalendarServiceTest.java b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/service/ClearingCalendarServiceTest.java new file mode 100644 index 000000000..7307966f9 --- /dev/null +++ b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/service/ClearingCalendarServiceTest.java @@ -0,0 +1,138 @@ +package ru.specx.clearing.scheduler.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.hazelcast.core.IMap; +import com.hazelcast.map.listener.EntryRemovedListener; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.consumer.OffsetResetStrategy; +import org.apache.kafka.clients.producer.MockProducer; +import org.apache.kafka.common.TopicPartition; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.clearing.classes.statics.data.profile.Contact; +import ru.clearing.classes.statics.data.scheduler.ClearingCalendar; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.ActionType; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.ClearingCalendarNewRequest; +import ru.spcex.clearing.scheduler.service.ClearingCalendarService; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.specx.clearing.scheduler.config.HazelcastServiceTestConfiguration; + +import java.time.Instant; +import java.time.LocalDate; +import java.util.Collections; +import java.util.HashMap; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + HazelcastServiceTestConfiguration.class}) +class ClearingCalendarServiceTest { + + private static final int PARTITION = 0; + private static final String TOPIC_CLEARING_CALENDAR_NEW = Consts.DESTINATION_CLEARING_CALENDAR_NEW; + private static final Long ID = 0L; + + @Autowired + @Qualifier("hazelcastServiceTest") + private HazelcastService hazelcastServiceTest; + private MockConsumer mockConsumer; + private MockProducer mockProducer; + + @BeforeEach + void setUp() { + mockConsumer = new MockConsumer<>(OffsetResetStrategy.EARLIEST); + mockProducer = new MockProducer<>(); + } + + /** + * {@link ClearingCalendarService#newTradingCalendar(BaseRequest)}(BaseRequest)}
+ * Тест проверяет создание сущности {@link ClearingCalendar} в Hazelcast при передаче из Apache Kafka.
+ * Входной запрос {@link ClearingCalendarNewRequest}:
+ */ + @Test + public void newClearingCalendarInQueue() throws InterruptedException { + //ARRANGE + + ClearingCalendar clearingCalendar = new ClearingCalendar(); + Instant created = Instant.now(); + clearingCalendar.setCreated(created); + clearingCalendar.setClearingDate(LocalDate.now()); + clearingCalendar.setCompanyId(0L); + clearingCalendar.setDayStatus("STATUS"); + + ClearingCalendarNewRequest clearingCalendarNewRequest = new ClearingCalendarNewRequest(); + clearingCalendarNewRequest.setClearingDate(clearingCalendar.getClearingDate()); + clearingCalendarNewRequest.setCompanyId(clearingCalendar.getCompanyId()); + clearingCalendarNewRequest.setDayStatus(clearingCalendar.getDayStatus()); + + BaseRequest baseNewRequest = new BaseRequest<>(); + baseNewRequest.setRequestPayload(clearingCalendarNewRequest); + baseNewRequest.setId(ID); + baseNewRequest.setActionType(ActionType.NEW); + String jsonBaseForRequest; + ObjectMapper objectMapper = new ObjectMapper(); + try { + jsonBaseForRequest = objectMapper.writeValueAsString(baseNewRequest); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + //ACT + //service set up + ClearingCalendarService clearingCalendarService = new ClearingCalendarService(mockConsumer, mockProducer, hazelcastServiceTest); + + //callbacks set up + clearingCalendarService.afterPropertiesSet(); + IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_ClearingCalendar); + //KAFKA + HashMap startOffsetsUpdating = new HashMap<>(); + TopicPartition topic = new TopicPartition(TOPIC_CLEARING_CALENDAR_NEW, PARTITION); + startOffsetsUpdating.put(topic, 0L); + mockConsumer.updateBeginningOffsets(startOffsetsUpdating); + + mockConsumer.schedulePollTask(() -> { + mockConsumer.rebalance(Collections.singletonList(new TopicPartition(TOPIC_CLEARING_CALENDAR_NEW, PARTITION))); + mockConsumer.addRecord(new ConsumerRecord<>(TOPIC_CLEARING_CALENDAR_NEW, PARTITION, 0, "key", jsonBaseForRequest)); + }); + + //waiting for hazelcast map item removes + Object waiter = new Object(); + String listenerID = iMap.addEntryListener((EntryRemovedListener) entryEvent -> { + System.out.println("Checking If pushed.."); + + try { + waiter.wait(100); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + synchronized (waiter) { + waiter.notify(); + } + }, false); + + synchronized (waiter) { + waiter.wait(100); + } + ClearingCalendar clearingCalendarRes = iMap.get(iMap.keySet().stream().findFirst().get()); + //ASSERT + Assertions.assertEquals(1, iMap.size()); + + Assertions.assertNotNull(clearingCalendarRes.getCreated()); + Assertions.assertEquals(clearingCalendar.getClearingDate(), clearingCalendarRes.getClearingDate()); + Assertions.assertEquals(clearingCalendar.getCompanyId(), clearingCalendarRes.getCompanyId()); + Assertions.assertEquals(clearingCalendar.getDayStatus(), clearingCalendarRes.getDayStatus()); + + //preparing hazelcastImdgProvider for next test + iMap.removeEntryListener(listenerID); + } +} \ No newline at end of file diff --git a/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/service/PlannerTemplateServiceTest.java b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/service/PlannerTemplateServiceTest.java new file mode 100644 index 000000000..ff5ac8109 --- /dev/null +++ b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/service/PlannerTemplateServiceTest.java @@ -0,0 +1,141 @@ +package ru.specx.clearing.scheduler.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.hazelcast.core.IMap; +import com.hazelcast.map.listener.EntryRemovedListener; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.consumer.OffsetResetStrategy; +import org.apache.kafka.clients.producer.MockProducer; +import org.apache.kafka.common.TopicPartition; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.clearing.classes.statics.data.profile.Contact; +import ru.clearing.classes.statics.data.scheduler.PlannerTemplate; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.ActionType; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.PlannerTemplateNewRequest; +import ru.spcex.clearing.scheduler.service.PlannerTemplateService; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.specx.clearing.scheduler.config.HazelcastServiceTestConfiguration; + +import java.time.Instant; +import java.time.LocalTime; +import java.util.Collections; +import java.util.HashMap; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + HazelcastServiceTestConfiguration.class}) +class PlannerTemplateServiceTest { + + private static final int PARTITION = 0; + private static final String TOPIC_PLANNER_TEMPLATE_NEW = Consts.DESTINATION_PLANNER_TEMPLATE_NEW; + private static final Long ID = 0L; + + @Autowired + @Qualifier("hazelcastServiceTest") + private HazelcastService hazelcastServiceTest; + private MockConsumer mockConsumer; + private MockProducer mockProducer; + + @BeforeEach + void setUp() { + mockConsumer = new MockConsumer<>(OffsetResetStrategy.EARLIEST); + mockProducer = new MockProducer<>(); + } + + /** + * {@link PlannerTemplateService#newTimetable(BaseRequest)}(BaseRequest)}
+ * Тест проверяет создание сущности {@link ru.clearing.classes.statics.data.scheduler.PlannerTemplate} в Hazelcast при передаче из Apache Kafka.
+ * Входной запрос {@link PlannerTemplateNewRequest}:
+ */ + @Test + public void newPlannerTemplateInQueue() throws InterruptedException { + //ARRANGE + Instant created = Instant.now(); + PlannerTemplate plannerTemplate = new PlannerTemplate(); + plannerTemplate.setTask("TASK"); + plannerTemplate.setTaskTime(LocalTime.MIDNIGHT); + plannerTemplate.setTaskStatus("TASK_STATUS"); + plannerTemplate.setCompanyId(0L); + plannerTemplate.setSecurityId(10L); + + PlannerTemplateNewRequest plannerTemplateNewRequest = new PlannerTemplateNewRequest(); + plannerTemplateNewRequest.setTask(plannerTemplate.getTask()); + plannerTemplateNewRequest.setTaskTime(plannerTemplate.getTaskTime()); + plannerTemplateNewRequest.setTaskStatus(plannerTemplate.getTaskStatus()); + plannerTemplateNewRequest.setCompanyId(plannerTemplate.getCompanyId()); + plannerTemplateNewRequest.setSecurityId(plannerTemplate.getSecurityId()); + + BaseRequest plannerTemplateRequest = new BaseRequest<>(); + plannerTemplateRequest.setRequestPayload(plannerTemplateNewRequest); + plannerTemplateRequest.setId(ID); + plannerTemplateRequest.setActionType(ActionType.NEW); + String jsonBaseForDeleteRequest; + ObjectMapper objectMapper = new ObjectMapper(); + try { + jsonBaseForDeleteRequest = objectMapper.writeValueAsString(plannerTemplateRequest); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + //ACT + //service set up + PlannerTemplateService plannerTemplateService = new PlannerTemplateService(mockConsumer, mockProducer, hazelcastServiceTest); + + //callbacks set up + plannerTemplateService.afterPropertiesSet(); + IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_PlannerTemplate); + //KAFKA + HashMap startOffsetsUpdating = new HashMap<>(); + TopicPartition topic = new TopicPartition(TOPIC_PLANNER_TEMPLATE_NEW, PARTITION); + startOffsetsUpdating.put(topic, 0L); + mockConsumer.updateBeginningOffsets(startOffsetsUpdating); + + mockConsumer.schedulePollTask(() -> { + mockConsumer.rebalance(Collections.singletonList(new TopicPartition(TOPIC_PLANNER_TEMPLATE_NEW, PARTITION))); + mockConsumer.addRecord(new ConsumerRecord<>(TOPIC_PLANNER_TEMPLATE_NEW, PARTITION, 0, "key", jsonBaseForDeleteRequest)); + }); + + //waiting for hazelcast map item removes + Object waiter = new Object(); + String listenerID = iMap.addEntryListener((EntryRemovedListener) entryEvent -> { + System.out.println("Checking If pushed.."); + + try { + waiter.wait(100); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + synchronized (waiter) { + waiter.notify(); + } + }, false); + + synchronized (waiter) { + waiter.wait(100); + } + PlannerTemplate plannerTemplateRes = iMap.get(iMap.keySet().stream().findFirst().get()); + //ASSERT + Assertions.assertEquals(1, iMap.size()); + + Assertions.assertNotNull(plannerTemplateRes.getCreated()); + Assertions.assertEquals(plannerTemplate.getTask(), plannerTemplateRes.getTask()); + Assertions.assertEquals(plannerTemplate.getTaskTime(), plannerTemplateRes.getTaskTime()); + Assertions.assertEquals(plannerTemplate.getTaskStatus(), plannerTemplateRes.getTaskStatus()); + Assertions.assertEquals(plannerTemplate.getCompanyId(), plannerTemplateRes.getCompanyId()); + Assertions.assertEquals(plannerTemplate.getSecurityId(), plannerTemplateRes.getSecurityId()); + //preparing hazelcastImdgProvider for next test + iMap.removeEntryListener(listenerID); + } +} \ No newline at end of file diff --git a/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/utils/MatcherFactory.java b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/utils/MatcherFactory.java new file mode 100644 index 000000000..c214393ea --- /dev/null +++ b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/utils/MatcherFactory.java @@ -0,0 +1,38 @@ +package ru.specx.clearing.scheduler.utils; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Factory for creating test matchers. + *

+ * Comparing actual and expected objects via AssertJ + */ +public class MatcherFactory { + + public static Matcher usingIgnoringFieldsComparator(String... fieldsToIgnore) { + return new Matcher<>(fieldsToIgnore); + } + + public static class Matcher { + private final String[] fieldsToIgnore; + + private Matcher(String... fieldsToIgnore) { + this.fieldsToIgnore = fieldsToIgnore; + } + + public void assertMatch(T actual, T expected) { + assertThat(actual).usingRecursiveComparison().ignoringFields(fieldsToIgnore).isEqualTo(expected); + } + + @SafeVarargs + public final void assertMatch(Iterable actual, T... expected) { + assertMatch(actual, Arrays.asList(expected)); + } + + public void assertMatch(Iterable actual, Iterable expected) { + assertThat(actual).usingRecursiveFieldByFieldElementComparatorIgnoringFields(fieldsToIgnore).isEqualTo(expected); + } + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ClearingCategory.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ClearingCategory.java new file mode 100644 index 000000000..6bab3d4ca --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ClearingCategory.java @@ -0,0 +1,27 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +/** + * CLEARING_CATEGORY_DICTIONARY + */ +public enum ClearingCategory implements IEnumKey { + C("C"), // Категория «Ц» - Банк России + B("B"), // Категория «Б» - Кредитная организация ДР + F("F"), // Категория «Ф» - Участник рынка РЦБ + I("I"), // Категория «И» - Инициатор по ТБС + V("V"), // Категория «В» - Инициатор по ТКС + T("T"), // Категория «Т» - Участник товарного рынка + K("K"); // Категория «К» - Участник клиринга - Контроллер + + private final String key; + + ClearingCategory(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/DocumentTypes.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/DocumentTypes.java new file mode 100644 index 000000000..5ece21d39 --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/DocumentTypes.java @@ -0,0 +1,39 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +/** + * DOCUMENT_TYPE_DICTIONARY + */ +public enum DocumentTypes implements IEnumKey { + pasp("PASP"), // Паспорт + icrt("ICRT"), // Удостоверение личности + prxy("PRXY"), // Доверенность + cntr("CNTR"), // Договор клиринга + regs("REGS"), // Регистрация + form("FORM"), // Анкета участника + ogrn("OGRN"), // ОГРН + licb("LICB"), // Банковская лицензия + licp("LICP"), // Лицензия проф. участника + plac("PLAC"), // Регистрация по месту пребывания + inn("INN"), // ИНН + cio("CIO"), // КИО + licr("LICR"), // Брокерская лицензия + fin("FIN"), // Финансовая отчетность + trst("TRST"), // Полномочия должностных лиц + pmkr("PMKR"), // Распоряжение на списание МКР + taut("TAUT"), // Допуск к торгам + edoc("EDOC"), // Договор об электронном взаимодействии + xcnt("XCNT"); // Документ о расторжении Договора клиринга + + private final String key; + + DocumentTypes(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/Market.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Market.java index 79d820bb0..8d20c67ef 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Market.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Market.java @@ -1,18 +1,18 @@ -package ru.spcex.platform.enumeration; - -import ru.spcex.platform.utils.enumeration.IEnumKey; - -public enum Market implements IEnumKey { - mkrs("MKRS"); - - private final String key; - - Market(String key) { - this.key = key; - } - - @Override - public String getKey() { - return key; - } -} +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum Market implements IEnumKey { + mkrs("MKRS"); + + private final String key; + + Market(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} 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 ac3b60fa3..43aad9a39 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 @@ -135,6 +135,15 @@ public class ImdgHazelcast implements Imdg { return searchResult; } + @Override + public Collection getCollectionObjectsBySQL(String paramString) { + SqlPredicate sqlPredicate = new SqlPredicate(paramString); + Set> found = map.entrySet(sqlPredicate); + List result = new ArrayList<>(found.size()); + for (Map.Entry entry : found) result.add(entry.getValue()); + return result; + } + @Override public Long nextIDSequenceFor() { return idGenerator.newId();