implements IDBObject {
+ private Registry object;
+
+ // No DB fields
+ private String houseName;
+ private String account;
+
+ @Override
+ public Registry getObject() {
+ return object;
+ }
+
+ @Override
+ public void setObject(Registry object) {
+ this.object = object;
+ }
+
+ public String getHouseName() {
+ return houseName;
+ }
+
+ public void setHouseName(String houseName) {
+ this.houseName = houseName;
+ }
+
+ public String getAccount() {
+ return account;
+ }
+
+ public void setAccount(String account) {
+ this.account = account;
+ }
+}
\ No newline at end of file
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryStatus.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryStatus.java
new file mode 100644
index 000000000..6f123b568
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryStatus.java
@@ -0,0 +1,28 @@
+package ru.spcex.clearing.registry.reports.bean;
+
+import ru.spcex.clearing.registry.reports.loaders.helpers.IEnumKey;
+
+public enum RegistryStatus implements IEnumKey {
+ OK("OK"),
+ CLRD("CLRD"),
+ PROC("PROC"),
+ NACK("NACK"),
+ NACC("NACC"),
+ FAIL("FAIL"),
+ UNCV("UNCV"),
+ MNG("MNG"),
+ POOL("POOL"),
+ SPLT("SPLT")
+ ;
+
+ private final String key;
+
+ RegistryStatus(String key) {
+ this.key = key;
+ }
+
+ @Override
+ public String getKey() {
+ return key;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryStatusDictionary.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryStatusDictionary.java
new file mode 100644
index 000000000..6a7775506
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryStatusDictionary.java
@@ -0,0 +1,11 @@
+package ru.spcex.clearing.registry.reports.bean;
+
+
+/**
+ * Справочник статусов регистров
+ *
+ * Dictionary DB table: REGISTRY_STATUS_DICTIONARY
+ **/
+public class RegistryStatusDictionary extends AbstractDictionary {
+
+}
\ No newline at end of file
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Security.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Security.java
new file mode 100644
index 000000000..7c596f3e8
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Security.java
@@ -0,0 +1,17 @@
+package ru.spcex.clearing.registry.reports.bean;
+
+/**
+ * Инструменты
+ * DB table: SECURITY
+ **/
+public class Security extends BusinessObject {
+ private String securitySymbol;
+
+ public String getSecuritySymbol() {
+ return securitySymbol;
+ }
+
+ public void setSecuritySymbol(String securitySymbol) {
+ this.securitySymbol = securitySymbol;
+ }
+}
\ No newline at end of file
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/SessionTypeDictionary.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/SessionTypeDictionary.java
new file mode 100644
index 000000000..09c956df4
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/SessionTypeDictionary.java
@@ -0,0 +1,10 @@
+package ru.spcex.clearing.registry.reports.bean;
+
+/**
+ * Справочник типов клиринговых сессий
+ *
+ * Dictionary DB table: SESSION_TYPE_DICTIONARY
+ **/
+public class SessionTypeDictionary extends AbstractDictionary {
+
+}
\ No newline at end of file
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Side.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Side.java
new file mode 100644
index 000000000..26554b34d
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Side.java
@@ -0,0 +1,21 @@
+package ru.spcex.clearing.registry.reports.bean;
+
+import ru.spcex.clearing.registry.reports.loaders.helpers.IEnumKey;
+
+public enum Side implements IEnumKey {
+ BUY("B"),
+ SELL("S"),
+ ;
+
+ private final String key;
+
+ Side(String key) {
+ this.key = key;
+ }
+
+ @Override
+ public String getKey() {
+ return key;
+ }
+
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/SpcexDBBase.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/SpcexDBBase.java
new file mode 100644
index 000000000..54faa895f
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/SpcexDBBase.java
@@ -0,0 +1,37 @@
+package ru.spcex.clearing.registry.reports.bean;
+
+import java.io.Serializable;
+
+public abstract class SpcexDBBase implements Serializable {
+
+ protected Long id;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s{id=%d}", getClass().getSimpleName(), getId());
+ }
+
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ SpcexDBBase clrxObject = (SpcexDBBase) o;
+
+ return id.equals(clrxObject.id);
+ }
+
+ @Override
+ public int hashCode() {
+ return id.hashCode();
+ }
+}
\ No newline at end of file
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/TradingClearingRegistry.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/TradingClearingRegistry.java
new file mode 100644
index 000000000..a3222691d
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/TradingClearingRegistry.java
@@ -0,0 +1,18 @@
+package ru.spcex.clearing.registry.reports.bean;
+
+/**
+ * Торгово-клиринговый регистр
+ *
+ * DB table: TRADING_CLEARING_REGISTRY
+ **/
+public class TradingClearingRegistry extends BusinessObject {
+ private String code;
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+}
\ No newline at end of file
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/CSVReportBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/CSVReportBuilder.java
deleted file mode 100644
index 55cbb29ae..000000000
--- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/CSVReportBuilder.java
+++ /dev/null
@@ -1,163 +0,0 @@
-package ru.spcex.clearing.registry.reports.builders;
-
-import com.opencsv.CSVWriter;
-import com.opencsv.ICSVWriter;
-import com.opencsv.bean.*;
-import com.opencsv.exceptions.CsvBadConverterException;
-import com.opencsv.exceptions.CsvChainedException;
-import com.opencsv.exceptions.CsvFieldAssignmentException;
-import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import ru.spcex.clearing.registry.reports.bean.FileReport;
-import ru.spcex.platform.classes.base.SpcexObjectBase;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.Writer;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.math.BigDecimal;
-import java.nio.charset.Charset;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.*;
-
-/**
- * Класс для построения отчетов в формате CSV
- */
-public abstract class CSVReportBuilder {
- protected final Logger log = LoggerFactory.getLogger(getClass());
- protected static DateTimeFormatter dateTimeFormatter_YYMMDDHHmmssSSS = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS");
-
- /**
- * Имя отчета (для имени файла)
- */
- protected abstract String reportName();
-
- /**
- * Преобразовать объект в строку отчета
- */
- protected abstract R toRow(I input);
-
- /**
- * Сортировка строк перед формированием отчета
- */
- protected Collection sortInput(Collection input) {
- return input;
- }
-
- /**
- * Сортировка строк после формирования отчета
- */
- protected Collection sortOutput(Collection rows) {
- return rows;
- }
-
- /**
- * Название отчета, используется для формирования имени отчета (без указания формата)
- */
- protected String getReportFilename() {
- return "%s_%s".formatted(reportName(), dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now()));
- }
-
- /**
- * Формирование отчета на основе объектов
- */
- public File buildReport(Collection inputObj, File outFolder, Charset outputEncoding) {
- assert outFolder != null && outFolder.isDirectory() && inputObj != null;
- List rows = new ArrayList<>(inputObj.size());
- inputObj = sortInput(inputObj);
- for (I input : inputObj) rows.add(toRow(input));
- rows = sortOutput(rows).stream().toList();
-
- File reportFile = new File(outFolder, normalizeFilenameForOS(getReportFilename() + ".csv"));
-
- try (Writer writer = new FileWriter(reportFile, outputEncoding);
- ICSVWriter icsvWriter = new CustomCSVWriter(writer)) {
- CustomStrategy customStrategy = new CustomStrategy<>();
- customStrategy.setType(getReportClass());
- StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(icsvWriter)
- .withMappingStrategy(customStrategy)
- .build();
- if (!rows.isEmpty()) sbc.write(rows);
- else {
- // Для записи заголовков в пустой файл
- Constructor extends R> constructor = Objects.requireNonNull(getReportClass()).getDeclaredConstructor();
- R obj = constructor.newInstance();
- String[] headers = customStrategy.generateHeader(obj);
- writer.write("\"" + String.join("\",\"", headers) + "\"");
- }
-
- } catch (Exception e) {
- log.error("Can't create CSV report", e);
- return null;
- }
-
- return reportFile;
- }
-
- protected abstract Class getReportClass();
-
- protected String normalizeFilenameForOS(String filename) {
- if (System.getProperty("os.name").toLowerCase().contains("windows"))
- return filename.replace(":", "_");
- return filename;
- }
-
- static class CustomCSVWriter extends CSVWriter {
- public CustomCSVWriter(Writer writer) {
- super(writer, ',', '\"', '\"', System.lineSeparator());
- }
-
- @Override
- protected void writeNext(String[] nextLine, boolean applyQuotesToAll, Appendable appendable) throws IOException {
- if (nextLine != null) {
- for (int i = 0; i < nextLine.length; i++) {
- if (StringUtils.isEmpty(nextLine[i])) {
- nextLine[i] = null;
- }
- }
- }
- super.writeNext(nextLine, applyQuotesToAll, appendable);
- }
- }
-
- static class CustomStrategy extends ColumnPositionMappingStrategy {
- public String[] generateHeader(T bean) throws CsvRequiredFieldEmptyException {
- super.generateHeader(bean);
- String[] headers = new String[this.getFieldMap().values().size()];
- for (BeanField field : this.getFieldMap().values()) {
- CsvBindByPosition positionAnnotation = field.getField().getAnnotation(CsvBindByPosition.class);
- CsvBindByName nameAnnotation = field.getField().getAnnotation(CsvBindByName.class);
- headers[positionAnnotation.position()] = nameAnnotation.column();
- }
- return headers;
- }
-
- @Override
- public String[] transmuteBean(T bean) throws CsvFieldAssignmentException, CsvChainedException {
- return super.transmuteBean(bean);
- }
-
- @Override
- protected CsvConverter determineConverter(Field field, Class> elementType, String locale, String writeLocale, Class extends AbstractCsvConverter> customConverter) throws CsvBadConverterException {
- CsvConverter csvConverter = super.determineConverter(field, elementType, locale, writeLocale, customConverter);
- if (csvConverter instanceof ConverterNumber && field.getType() == BigDecimal.class) {
- CsvNumber csvNumberAnnotation = field.getAnnotation(CsvNumber.class);
- String formatValue = csvNumberAnnotation.value();
- String writeFormat = csvNumberAnnotation.writeFormat();
- csvConverter = new ConverterNumber(BigDecimal.class,
- Locale.getDefault().toString(),
- Locale.getDefault().toString(),
- Locale.getDefault(),
- formatValue,
- writeFormat);
- }
- return csvConverter;
- }
-
- }
-}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoBalanceRegisterReportBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoBalanceRegisterReportBuilder.java
index 6516a836f..f3694d5f9 100644
--- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoBalanceRegisterReportBuilder.java
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoBalanceRegisterReportBuilder.java
@@ -1,15 +1,13 @@
package ru.spcex.clearing.registry.reports.builders;
-import ru.clearing.classes.objects.BusinessEvent;
-import ru.clearing.classes.statics.data.company.Company;
-import ru.clearing.classes.statics.data.registry.Registry;
-import ru.clearing.classes.statics.data.registry.RegistryHistory;
-import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.registry.reports.bean.DepoBalanceRegisterReport;
-import ru.spcex.platform.enumeration.AccountType;
-import ru.spcex.platform.imdg.api.Imdg;
-import ru.spcex.platform.imdg.api.ImdgProvider;
-import ru.spcex.platform.utils.enumeration.IEnumKey;
+
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.registry.reports.bean.BusinessEvent;
+import ru.spcex.clearing.registry.reports.bean.Registry;
+import ru.spcex.clearing.registry.reports.bean.RegistryHistory;
+import ru.spcex.clearing.registry.reports.loaders.helpers.AccountType;
+import ru.spcex.clearing.registry.reports.loaders.helpers.IEnumKey;
+import ru.spcex.clearing.registry.reports.report.DepoBalanceRegisterReport;
import java.time.LocalDate;
import java.time.LocalDateTime;
@@ -19,15 +17,10 @@ import java.util.Collection;
import java.util.Comparator;
import java.util.stream.Collectors;
+@Component
public class DepoBalanceRegisterReportBuilder extends XLSXReportBuilder {
private final static DateTimeFormatter yyyyMMddFormat = DateTimeFormatter.ofPattern("yyyyMMdd");
- private final Imdg companyImdg;
-
- public DepoBalanceRegisterReportBuilder(ImdgProvider imdgProvider) {
- companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
- }
-
@Override
protected String reportName() {
return "security_register";
@@ -41,19 +34,21 @@ public class DepoBalanceRegisterReportBuilder extends XLSXReportBuilder {
+ @Override
+ protected String reportName() {
+ return "rdc_register";
+ }
+
+ @Override
+ protected DepoPaymentInstructionRegisterReport toRow(PaymentInstruction input) {
+ DepoPaymentInstructionRegisterReport entity = new DepoPaymentInstructionRegisterReport();
+
+ if (input.getSessionId() != null) entity.setNumber(input.getSessionId());
+ else entity.setNumber(input.getId());
+
+ entity.setDate(input.getClearingDate());
+
+ if (input.getCreated() != null)
+ entity.setTime(LocalDateTime.from(input.getCreated().atZone(ZoneId.systemDefault())));
+
+ entity.setAccountSender(input.getCreditLegAccountStr());
+ entity.setAccountAddressee(input.getDebitLegAccountStr());
+
+ entity.setAddressee(input.getAddressee());
+ entity.setCodeAddressee(input.getAddresseeClearingCode());
+ entity.setSender(input.getSender());
+ entity.setCodeSender(input.getSenderClearingCode());
+
+ entity.setSecurity(input.getSecurity());
+ entity.setAmount(input.getCreditLeg_amount());
+
+ return entity;
+ }
+
+ @Override
+ protected Class getReportClass() {
+ return DepoPaymentInstructionRegisterReport.class;
+ }
+
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoPaymentInstructionRegisterReportBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoPaymentInstructionRegisterReportBuilder.java
deleted file mode 100644
index 6d3e4bbdb..000000000
--- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoPaymentInstructionRegisterReportBuilder.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package ru.spcex.clearing.registry.reports.builders;
-
-import ru.clearing.classes.statics.data.account.Account;
-import ru.clearing.classes.statics.data.company.Company;
-import ru.clearing.classes.statics.data.payment.PaymentInstruction;
-import ru.clearing.classes.statics.data.security.Security;
-import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.registry.reports.bean.DepoPaymentInstructionRegisterReport;
-import ru.spcex.platform.imdg.api.Imdg;
-import ru.spcex.platform.imdg.api.ImdgProvider;
-
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.stream.Collectors;
-
-public class DepoPaymentInstructionRegisterReportBuilder extends XLSXReportBuilder {
-
- private final Imdg accountImdg;
- private final Imdg companyImdg;
- private final Imdg securityImdg;
-
- public DepoPaymentInstructionRegisterReportBuilder(ImdgProvider imdgProvider) {
- companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
- accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
- securityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Security, Security.class);
- }
-
- @Override
- protected String reportName() {
- return "rdc_register";
- }
-
- @Override
- protected Class getReportClass() {
- return DepoPaymentInstructionRegisterReport.class;
- }
-
- @Override
- protected DepoPaymentInstructionRegisterReport toRow(PaymentInstruction input) {
- DepoPaymentInstructionRegisterReport entity = new DepoPaymentInstructionRegisterReport();
-
- if (input.getSessionId() == null)
- entity.setNumber(input.getId());
- else
- entity.setNumber(input.getSessionId());
- entity.setDate(input.getClearingDate());
-
- if (input.getCreated() != null) entity.setTime(LocalDateTime.from(input.getCreated().atZone(ZoneId.systemDefault())));
-
- if (input.getCreditLeg_accountId() != null) {
- Account account = accountImdg.getSingleObjectByID(input.getCreditLeg_accountId());
- if (account != null) entity.setAccountSender(account.getAccount());
- }
-
- if (input.getSenderId() != null) {
- Company company = companyImdg.getSingleObjectByID(input.getSenderId());
- if (company != null) {
- entity.setSender(company.getShortName());
- entity.setCodeSender(company.getClearingCode());
- }
- }
-
- if (input.getDebitLeg_accountId() != null) {
- Account account = accountImdg.getSingleObjectByID(input.getDebitLeg_accountId());
- if (account != null) entity.setAccountAddressee(account.getAccount());
- }
-
- if (input.getAddresseeId() != null) {
- Company company = companyImdg.getSingleObjectByID(input.getAddresseeId());
- if (company != null) {
- entity.setAddressee(company.getShortName());
- entity.setCodeAddressee(company.getClearingCode());
- }
- }
-
-
- if (input.getCreditLeg_securityId() != null) {
- Security security = securityImdg.getSingleObjectByID(input.getCreditLeg_securityId());
- if (security != null) entity.setSecurity(security.getSecuritySymbol());
- }
- entity.setAmount(input.getCreditLeg_amount());
-
- return entity;
- }
-
- @Override
- protected Collection sortInput(Collection input) {
- return input.stream()
- .sorted(Comparator.comparing(PaymentInstruction::getCreated))
- .collect(Collectors.toList());
- }
-
-}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/ExecutionRegisterReportBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/ExecutionRegisterReportBuilder.java
index a8762f3b9..0181c7405 100644
--- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/ExecutionRegisterReportBuilder.java
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/ExecutionRegisterReportBuilder.java
@@ -1,45 +1,20 @@
package ru.spcex.clearing.registry.reports.builders;
-import ru.clearing.classes.statics.data.company.Company;
-import ru.clearing.classes.statics.data.company.CompanySymbols;
-import ru.clearing.classes.statics.data.execution.ExecutionCommon;
-import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
-import ru.clearing.classes.statics.data.execution.ExecutionFond;
-import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
-import ru.clearing.platform.dictionary.AllowedDictionary;
-import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.registry.reports.bean.ExecutionRegisterReport;
-import ru.spcex.platform.enumeration.CompanySymbol;
-import ru.spcex.platform.enumeration.MoneyFlowSide;
-import ru.spcex.platform.enumeration.Side;
-import ru.spcex.platform.imdg.api.Imdg;
-import ru.spcex.platform.imdg.api.ImdgProvider;
-import ru.spcex.platform.utils.number.BigDecimalUtil;
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.registry.reports.bean.ExecutionCommon;
+import ru.spcex.clearing.registry.reports.bean.ExecutionDeposit;
+import ru.spcex.clearing.registry.reports.bean.ExecutionFond;
+import ru.spcex.clearing.registry.reports.report.ExecutionRegisterReport;
+import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneId;
-import java.time.format.DateTimeFormatter;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
-import java.util.Map;
import java.util.stream.Collectors;
+@Component
public class ExecutionRegisterReportBuilder extends XLSXReportBuilder {
- private final static DateTimeFormatter yyyyMMddFormat = DateTimeFormatter.ofPattern("yyyyMMdd");
-
- private final Imdg companyImdg;
- private final Imdg companySymbolsImdg;
- private final Imdg allowedDictionaryImdg;
- private final Imdg tradingClearingRegistryImdg;
-
- public ExecutionRegisterReportBuilder(ImdgProvider imdgProvider) {
- companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
- companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
- allowedDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AllowedDictionary, AllowedDictionary.class);
- tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
- }
-
@Override
protected String reportName() {
return "contract_register";
@@ -58,64 +33,12 @@ public class ExecutionRegisterReportBuilder extends XLSXReportBuilder {
- private final Imdg registryStatusDictionaryImdg;
- private final Imdg sessionTypesDictionaryImdg;
-
- public LiabilitiesRegistryReportBuilder(ImdgProvider imdgProvider) {
- registryStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryStatusDictionary, RegistryStatusDictionary.class);
- sessionTypesDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SessionTypeDictionary, SessionTypeDictionary.class);
- }
@Override
protected String reportName() {
@@ -41,46 +30,16 @@ public class LiabilitiesRegistryReportBuilder extends XLSXReportBuilder sortInput(Collection input) {
return input.stream()
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/MoneyBalanceRegisterReportBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/MoneyBalanceRegisterReportBuilder.java
index c805b6a55..9292d643d 100644
--- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/MoneyBalanceRegisterReportBuilder.java
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/MoneyBalanceRegisterReportBuilder.java
@@ -1,15 +1,12 @@
package ru.spcex.clearing.registry.reports.builders;
-import ru.clearing.classes.objects.BusinessEvent;
-import ru.clearing.classes.statics.data.company.Company;
-import ru.clearing.classes.statics.data.registry.Registry;
-import ru.clearing.classes.statics.data.registry.RegistryHistory;
-import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.registry.reports.bean.MoneyBalanceRegisterReport;
-import ru.spcex.platform.enumeration.AccountType;
-import ru.spcex.platform.imdg.api.Imdg;
-import ru.spcex.platform.imdg.api.ImdgProvider;
-import ru.spcex.platform.utils.enumeration.IEnumKey;
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.registry.reports.bean.BusinessEvent;
+import ru.spcex.clearing.registry.reports.bean.Registry;
+import ru.spcex.clearing.registry.reports.bean.RegistryHistory;
+import ru.spcex.clearing.registry.reports.loaders.helpers.AccountType;
+import ru.spcex.clearing.registry.reports.loaders.helpers.IEnumKey;
+import ru.spcex.clearing.registry.reports.report.MoneyBalanceRegisterReport;
import java.time.LocalDate;
import java.time.LocalDateTime;
@@ -19,15 +16,10 @@ import java.util.Collection;
import java.util.Comparator;
import java.util.stream.Collectors;
+@Component
public class MoneyBalanceRegisterReportBuilder extends XLSXReportBuilder {
private final static DateTimeFormatter yyyyMMddFormat = DateTimeFormatter.ofPattern("yyyyMMdd");
- private final Imdg companyImdg;
-
- public MoneyBalanceRegisterReportBuilder(ImdgProvider imdgProvider) {
- companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
- }
-
@Override
protected String reportName() {
return "money_register";
@@ -44,10 +36,7 @@ public class MoneyBalanceRegisterReportBuilder extends XLSXReportBuilder {
- private final Imdg accountImdg;
- private final Imdg companyImdg;
-
- public MoneyPaymentInstructionRegisterReportBuilder(ImdgProvider imdgProvider) {
- companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
- accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
- }
-
@Override
protected String reportName() {
return "prc_register";
@@ -38,39 +27,19 @@ public class MoneyPaymentInstructionRegisterReportBuilder extends XLSXReportBuil
protected MoneyPaymentInstructionRegisterReport toRow(PaymentInstruction input) {
MoneyPaymentInstructionRegisterReport entity = new MoneyPaymentInstructionRegisterReport();
- if (input.getSessionId() == null)
- entity.setNumber(input.getId());
- else
- entity.setNumber(input.getSessionId());
+ if (input.getSessionId() != null) entity.setNumber(input.getSessionId());
+ else entity.setNumber(input.getId());
+
entity.setDate(input.getClearingDate());
if (input.getCreated() != null) entity.setTime(LocalDateTime.from(input.getCreated().atZone(ZoneId.systemDefault())));
- if (input.getCreditLeg_accountId() != null) {
- Account account = accountImdg.getSingleObjectByID(input.getCreditLeg_accountId());
- if (account != null) entity.setAccountSender(account.getAccount());
- }
-
- if (input.getSenderId() != null) {
- Company company = companyImdg.getSingleObjectByID(input.getSenderId());
- if (company != null) {
- entity.setSender(company.getShortName());
- entity.setCodeSender(company.getClearingCode());
- }
- }
-
- if (input.getDebitLeg_accountId() != null) {
- Account account = accountImdg.getSingleObjectByID(input.getDebitLeg_accountId());
- if (account != null) entity.setAccountAddressee(account.getAccount());
- }
-
- if (input.getAddresseeId() != null) {
- Company company = companyImdg.getSingleObjectByID(input.getAddresseeId());
- if (company != null) {
- entity.setAddressee(company.getShortName());
- entity.setCodeAddressee(company.getClearingCode());
- }
- }
+ entity.setAccountSender(input.getCreditLegAccountStr());
+ entity.setSender(input.getSender());
+ entity.setCodeSender(input.getSenderClearingCode());
+ entity.setAccountAddressee(input.getDebitLegAccountStr());
+ entity.setAddressee(input.getAddressee());
+ entity.setCodeAddressee(input.getAddresseeClearingCode());
entity.setCurrencyCode(input.getCreditLeg_currencyCode());
entity.setSum(input.getCreditLeg_amount());
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/XLSXReportBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/XLSXReportBuilder.java
index 88cd78c03..8cf88b8f3 100644
--- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/XLSXReportBuilder.java
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/XLSXReportBuilder.java
@@ -1,15 +1,15 @@
package ru.spcex.clearing.registry.reports.builders;
-import com.opencsv.bean.CsvBindByName;
-import com.opencsv.bean.CsvBindByPosition;
-import com.opencsv.bean.CsvDate;
-import com.opencsv.bean.CsvNumber;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import ru.spcex.clearing.registry.reports.bean.FileReport;
-import ru.spcex.platform.classes.base.SpcexObjectBase;
+import ru.spcex.clearing.registry.annotation.BindByName;
+import ru.spcex.clearing.registry.annotation.BindByPosition;
+import ru.spcex.clearing.registry.annotation.ReportDate;
+import ru.spcex.clearing.registry.annotation.ReportNumber;
+import ru.spcex.clearing.registry.reports.bean.SpcexDBBase;
+import ru.spcex.clearing.registry.reports.report.FileReport;
import java.io.File;
import java.io.FileOutputStream;
@@ -24,7 +24,7 @@ import java.util.*;
/**
* Класс для построения отчетов в формате CSV
*/
-public abstract class XLSXReportBuilder {
+public abstract class XLSXReportBuilder {
protected final Logger log = LoggerFactory.getLogger(getClass());
protected static DateTimeFormatter dateTimeFormatter_YYMMDDHHmmssSSS = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS");
@@ -64,10 +64,18 @@ public abstract class XLSXReportBuilder inputObj, File outFolder) {
assert outFolder != null && outFolder.isDirectory() && inputObj != null;
- List rows = new ArrayList<>(inputObj.size());
- inputObj = sortInput(inputObj);
- for (I input : inputObj) rows.add(toRow(input));
- rows = sortOutput(rows).stream().toList();
+ List rows;
+ try {
+ rows = new ArrayList<>(inputObj.size());
+ inputObj = sortInput(inputObj);
+ for (I input : inputObj) {
+ R row = toRow(input);
+ if (row != null) rows.add(row);
+ }
+ rows = sortOutput(rows).stream().toList();
+ } catch (Exception e) {
+ throw new RuntimeException("Unknown exception", e);
+ }
File reportFile = new File(outFolder, normalizeFilenameForOS(getReportFilename() + ".xlsx"));
log.debug("Создание отчёта {} в файл \"{}\"", reportName(), reportFile.getPath());
@@ -78,8 +86,8 @@ public abstract class XLSXReportBuilder headers = new ArrayList<>();
for (Field field : declaredFields) {
- CsvBindByPosition positionAnnotation = field.getAnnotation(CsvBindByPosition.class);
- CsvBindByName nameAnnotation = field.getAnnotation(CsvBindByName.class);
+ BindByPosition positionAnnotation = field.getAnnotation(BindByPosition.class);
+ BindByName nameAnnotation = field.getAnnotation(BindByName.class);
if (positionAnnotation == null || nameAnnotation == null) continue;
int position = positionAnnotation.position();
String columnName = nameAnnotation.column();
@@ -101,7 +109,7 @@ public abstract class XLSXReportBuilder type = field.getType();
if (type == BigDecimal.class || type == Long.class || type == Integer.class) {
if (type == BigDecimal.class) {
- CsvNumber csvNumberAnnotation = field.getAnnotation(CsvNumber.class);
- String writeFormat = csvNumberAnnotation.writeFormat();
+ ReportNumber csvNumberAnnotation = field.getAnnotation(ReportNumber.class);
+ String writeFormat = csvNumberAnnotation.value();
CellStyle style = numberStyles.get(writeFormat);
if (style == null) {
style = workbook.createCellStyle();
@@ -129,7 +137,7 @@ public abstract class XLSXReportBuilder loadObjects() {
+ List result = super.loadObjects();
+ return result.stream()
+ .filter(registryHistory -> registryHistory.getObject().getDiffBalance().compareTo(BigDecimal.ZERO) == 0)
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ protected String sqlQuery() {
+ RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AS_T);
+ return "select * from REGISTRY_HISTORY where EVENT_TIME >= :startDate and EVENT_TIME < :endDate and (%s) and TRADING_CLEARING_REGISTRY is not null"
+ .formatted(registryCodeSqlBuilder.buildSql());
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/DepoInstructionLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/DepoInstructionLoader.java
new file mode 100644
index 000000000..276ebdec8
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/DepoInstructionLoader.java
@@ -0,0 +1,113 @@
+package ru.spcex.clearing.registry.reports.loaders;
+
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.registry.conf.properties.AProperties;
+import ru.spcex.clearing.registry.reports.bean.Account;
+import ru.spcex.clearing.registry.reports.bean.Company;
+import ru.spcex.clearing.registry.reports.bean.PaymentInstruction;
+import ru.spcex.clearing.registry.reports.bean.Security;
+import ru.spcex.clearing.registry.reports.loaders.helpers.AccountRowMapper;
+import ru.spcex.clearing.registry.reports.loaders.helpers.AccountType;
+import ru.spcex.clearing.registry.reports.loaders.helpers.CompanyRowMapper;
+import ru.spcex.clearing.registry.reports.loaders.helpers.SecurityRowMapper;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Component
+public class DepoInstructionLoader extends PaymentInstructionLoader {
+ private final Set DEPO_ACCOUNT_TYPES = Set.of(AccountType.Depo.getKey(), AccountType.Dtrn.getKey());
+
+ protected DepoInstructionLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) {
+ super(properties, clearingJdbc);
+ }
+
+ @Override
+ public List loadObjects() {
+ List result = new ArrayList<>();
+
+ List paymentInstructions = super.loadObjects();
+ if (paymentInstructions.isEmpty()) {
+ log.warn("PaymentInstructions not found.");
+ return result;
+ }
+ Map> groupedPaymentInstruction = paymentInstructions.stream()
+ .collect(Collectors.groupingBy(PaymentInstruction::getCreditLeg_accountId));
+ List ids = paymentInstructions.stream().map(PaymentInstruction::getCreditLeg_accountId).toList();
+ MapSqlParameterSource parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("ids", ids);
+ List accounts = clearingJdbc.query(
+ "select ID, ACCOUNT_TYPE from ACCOUNT where ID in (:ids)",
+ parameterSource, new AccountRowMapper()
+ );
+ for (Account account : accounts) {
+ if (account.getAccountType() != null && !DEPO_ACCOUNT_TYPES.contains(account.getAccountType().toUpperCase()))
+ continue;
+ Long id = account.getId();
+ List payments = groupedPaymentInstruction.get(id);
+ if (!payments.isEmpty()) result.addAll(payments);
+ }
+
+ Map> groupedBySenderIds = paymentInstructions.stream()
+ .collect(Collectors.groupingBy(PaymentInstruction::getSenderId));
+ Map> groupedByAddresseeIds = paymentInstructions.stream()
+ .collect(Collectors.groupingBy(PaymentInstruction::getAddresseeId));
+ List senderIds = new ArrayList<>(groupedBySenderIds.keySet());
+ List addresseeIds = new ArrayList<>(groupedByAddresseeIds.keySet());
+ parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("ids", senderIds);
+ List companiesSenderIds = clearingJdbc.query(
+ "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)",
+ parameterSource, new CompanyRowMapper()
+ );
+ for (Company company : companiesSenderIds) {
+ List payments = groupedBySenderIds.get(company.getId());
+ if (payments != null) {
+ for (PaymentInstruction paymentInstruction : payments) {
+ paymentInstruction.setSender(company.getShortName());
+ paymentInstruction.setSenderClearingCode(company.getClearingCode());
+ }
+ }
+ }
+ parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("ids", addresseeIds);
+ List companiesAddresseeId = clearingJdbc.query(
+ "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)",
+ parameterSource, new CompanyRowMapper()
+ );
+ for (Company company : companiesAddresseeId) {
+ List payments = groupedByAddresseeIds.get(company.getId());
+ if (payments != null) {
+ for (PaymentInstruction paymentInstruction : payments) {
+ paymentInstruction.setAddressee(company.getShortName());
+ paymentInstruction.setAddresseeClearingCode(company.getClearingCode());
+ }
+ }
+ }
+
+ Map> groupedBySecurityId = paymentInstructions.stream()
+ .collect(Collectors.groupingBy(PaymentInstruction::getCreditLeg_securityId));
+ Set securityIds = groupedBySecurityId.keySet();
+ MapSqlParameterSource parameterSourceSecurityIds = new MapSqlParameterSource();
+ parameterSourceSecurityIds.addValue("ids", securityIds);
+ List securities = clearingJdbc.query(
+ "select ID, SECURITY_SYMBOL from SECURITY where ID in (:ids)",
+ parameterSourceSecurityIds, new SecurityRowMapper()
+ );
+ for (Security security : securities) {
+ List paymentInstructionList = groupedBySecurityId.get(security.getId());
+ if (paymentInstructionList != null) {
+ for (PaymentInstruction paymentInstruction : paymentInstructionList) {
+ paymentInstruction.setSecurity(security.getSecuritySymbol());
+ }
+ }
+ }
+
+ return result;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionDepositLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionDepositLoader.java
new file mode 100644
index 000000000..c7ae2ba2d
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionDepositLoader.java
@@ -0,0 +1,221 @@
+package ru.spcex.clearing.registry.reports.loaders;
+
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.registry.conf.properties.AProperties;
+import ru.spcex.clearing.registry.reports.ReportUtils;
+import ru.spcex.clearing.registry.reports.bean.*;
+import ru.spcex.clearing.registry.reports.loaders.helpers.AllowedDictionaryRowMapper;
+import ru.spcex.clearing.registry.reports.loaders.helpers.CompanyRowMapper;
+import ru.spcex.clearing.registry.reports.loaders.helpers.CompanySymbolsRowMapper;
+import ru.spcex.clearing.registry.reports.loaders.helpers.TradingClearingRegistryRowMapper;
+
+import java.math.BigDecimal;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Component
+public class ExecutionDepositLoader extends IDBLoader {
+ public ExecutionDepositLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) {
+ super(properties.getPeriod(), clearingJdbc);
+ }
+
+ @Override
+ public String sqlQuery() {
+ return "select * from EXECUTION_DEPOSIT where CLEARING_DATE >= :startDate and CLEARING_DATE < :endDate";
+ }
+
+ @Override
+ protected Class getDBObjectClass() {
+ return ExecutionDeposit.class;
+ }
+
+ @Override
+ public List loadObjects() {
+ try {
+ List executionDeposits = super.loadObjects();
+
+ Map> groupedExecutionDepositForTKR = executionDeposits.stream()
+ .collect(Collectors.groupingBy(ExecutionDeposit::getTradingClearingRegistryId));
+ if (executionDeposits.isEmpty()) {
+ log.warn("ExecutionDeposit not found.");
+ return new ArrayList<>();
+ }
+ Set tkrIds = groupedExecutionDepositForTKR.keySet();
+ MapSqlParameterSource parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("ids", tkrIds);
+ List tradingClearingRegistries = clearingJdbc.query(
+ "select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)",
+ parameterSource, new TradingClearingRegistryRowMapper()
+ );
+ for (TradingClearingRegistry tkr : tradingClearingRegistries) {
+ List executionDepositList = groupedExecutionDepositForTKR.get(tkr.getId());
+ for (ExecutionDeposit deposit : executionDepositList) {
+ deposit.setSellerTkrCode(tkr.getCode());
+ }
+ }
+
+ Map> companySymbolsForCompanyIdMap;
+ {
+ Set companyIds = executionDeposits.stream().map(ExecutionDeposit::getCompanyId).collect(Collectors.toSet());
+ parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("ids", companyIds);
+ parameterSource.addValue("cs", CompanySymbol.CLRC.getKey());
+ List companySymbolsForCompanyId = clearingJdbc.query(
+ "select ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE from COMPANY_SYMBOLS where COMPANY_ID in (:ids) and COMPANY_SYMBOL = :cs",
+ parameterSource, new CompanySymbolsRowMapper()
+ );
+ companySymbolsForCompanyIdMap = companySymbolsForCompanyId.stream().collect(Collectors.groupingBy(CompanySymbols::getCompanyId));
+ }
+
+ Map> companySymbolsForCounterPartyIdMap;
+ {
+ Set counterPartyIds = executionDeposits.stream().map(ExecutionDeposit::getCounterPartyId).collect(Collectors.toSet());
+ parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("ids", counterPartyIds);
+ parameterSource.addValue("companySymbol", CompanySymbol.CLRC.getKey());
+ List companySymbolsForCounterPartyId = clearingJdbc.query(
+ "select ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE from COMPANY_SYMBOLS where COMPANY_ID in (:ids) and COMPANY_SYMBOL = :companySymbol",
+ parameterSource, new CompanySymbolsRowMapper()
+ );
+ companySymbolsForCounterPartyIdMap = companySymbolsForCounterPartyId.stream().collect(Collectors.groupingBy(CompanySymbols::getCompanyId));
+ }
+
+ Map companyById;
+ {
+ Set allCompanyIds = Stream.concat(
+ executionDeposits.stream().map(ExecutionDeposit::getCompanyId),
+ executionDeposits.stream().map(ExecutionDeposit::getCounterPartyId))
+ .collect(Collectors.toSet());
+ parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("ids", allCompanyIds);
+ List companyForCompanyId = clearingJdbc.query(
+ "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)",
+ parameterSource, new CompanyRowMapper()
+ );
+ companyById = companyForCompanyId.stream()
+ .collect(Collectors.toMap(Company::getId, o -> o));
+ }
+
+ Set coverageStatuses = executionDeposits.stream().map(ExecutionDeposit::getCoverageStatus).collect(Collectors.toSet());
+ parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("coverageStatuses", coverageStatuses);
+ List allowedDictionaries = clearingJdbc.query(
+ "select * from ALLOWED_DICTIONARY where CODE in (:coverageStatuses)",
+ parameterSource, new AllowedDictionaryRowMapper()
+ );
+ Map> allowedDictionariesByCode = allowedDictionaries.stream()
+ .collect(Collectors.groupingBy(AllowedDictionary::getCode));
+
+ for (ExecutionDeposit executionDeposit : executionDeposits) {
+ Company companyByCompanyId = companyById.get(executionDeposit.getCompanyId());
+ Company companyByCounterPartyId = companyById.get(executionDeposit.getCounterPartyId());
+ String side = executionDeposit.getSide() == null ? null : executionDeposit.getSide().toUpperCase();
+ if (MoneyFlowSide.SELL.equalsByKey(side) || Side.SELL.equalsByKey(side)) {
+ if (companyByCompanyId != null) {
+ executionDeposit.setSeller(companyByCompanyId.getShortName());
+ }
+ if (companyByCounterPartyId != null) {
+ executionDeposit.setBuyer(companyByCounterPartyId.getShortName());
+ }
+ {
+ List cSymbols = companySymbolsForCompanyIdMap.get(executionDeposit.getCompanyId());
+ if (cSymbols != null && !cSymbols.isEmpty()) {
+ CompanySymbols companySymbols = cSymbols.iterator().next();
+ executionDeposit.setSellerCode(companySymbols.getCompanySymbolValue());
+ }
+ }
+ {
+ List cSymbols = companySymbolsForCounterPartyIdMap.get(executionDeposit.getCounterPartyId());
+ if (cSymbols != null && !cSymbols.isEmpty()) {
+ CompanySymbols companySymbols = cSymbols.iterator().next();
+ executionDeposit.setBuyerCode(companySymbols.getCompanySymbolValue());
+ }
+ }
+ executionDeposit.setBuyerTkrCode(executionDeposit.getCounterPartyTradingClearingRegistry());
+ } else if (MoneyFlowSide.BUY.equalsByKey(side) || Side.BUY.equalsByKey(side)) {
+ if (companyByCompanyId != null) {
+ executionDeposit.setBuyer(companyByCompanyId.getShortName());
+ }
+ if (companyByCounterPartyId != null) {
+ executionDeposit.setSeller(companyByCounterPartyId.getShortName());
+ }
+ {
+ List cSymbols = companySymbolsForCompanyIdMap.get(executionDeposit.getCompanyId());
+ if (cSymbols != null && !cSymbols.isEmpty()) {
+ CompanySymbols companySymbols = cSymbols.iterator().next();
+ executionDeposit.setBuyerCode(companySymbols.getCompanySymbolValue());
+ }
+ }
+ {
+ List cSymbols = companySymbolsForCounterPartyIdMap.get(executionDeposit.getCounterPartyId());
+ if (cSymbols != null && !cSymbols.isEmpty()) {
+ CompanySymbols companySymbols = cSymbols.iterator().next();
+ executionDeposit.setSellerCode(companySymbols.getCompanySymbolValue());
+ }
+ }
+ executionDeposit.setBuyerTkrCode(executionDeposit.getPartyTradingClearingRegistry());
+ } else {
+ log.warn("Unknown executionDeposit[{}].side={}", executionDeposit.getId(), executionDeposit.getSide());
+ }
+ List allowed = allowedDictionariesByCode.get(executionDeposit.getCoverageStatus());
+ if (allowed != null && !allowed.isEmpty()) {
+ executionDeposit.setStatus(allowed.iterator().next().getName());
+ }
+ }
+
+ return executionDeposits;
+ } catch (Exception e) {
+ log.error("Can not load ExecutionDeposit: ", e);
+ throw new RuntimeException("At ExecutionDeposit", e);
+ }
+ }
+
+ @Override
+ public ExecutionDeposit fromRS(ResultSet resultSet) throws SQLException {
+ ExecutionDeposit object = new ExecutionDeposit();
+ object.setId(resultSet.getObject("ID", Long.class));
+ object.setCreated(ReportUtils.getInstantFromTimestamp(resultSet, "CREATED_AT"));
+ object.setUpdated(ReportUtils.getInstantFromTimestamp(resultSet, "UPDATED_AT"));
+ object.setExchangeExecutionId(resultSet.getObject("EXCHANGE_EXECUTION_ID", Long.class));
+ object.setExchangeExecutionTime(ReportUtils.getInstantFromTimestamp(resultSet, "EXCHANGE_EXECUTION_TIME"));
+ object.setTradingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "TRADING_DATE"));
+ object.setTradingClearingRegistryId(resultSet.getObject("TRADING_CLEARING_REGISTRY_ID", Long.class));
+ object.setPartyTradingClearingRegistry(resultSet.getObject("PARTY_TRADING_CLEARING_REGISTRY", String.class));
+ object.setCounterPartyTradingClearingRegistry(resultSet.getObject("COUNTER_PARTY_TRADING_CLEARING_REGISTRY", String.class));
+ object.setMarket(resultSet.getObject("MARKET", String.class));
+ object.setPrice(resultSet.getObject("PRICE", BigDecimal.class));
+ object.setLots(resultSet.getObject("LOTS", BigDecimal.class));
+ object.setQuantity(resultSet.getObject("QUANTITY", BigDecimal.class));
+ object.setFirstLegAmount(resultSet.getObject("FIRST_LEG_AMOUNT", BigDecimal.class));
+ object.setSecondLegAmount(resultSet.getObject("SECOND_LEG_AMOUNT", BigDecimal.class));
+ object.setInterestAmount(resultSet.getObject("INTEREST_AMOUNT", BigDecimal.class));
+ object.setSide(resultSet.getObject("SIDE", String.class));
+ object.setSettlementCurrency(resultSet.getObject("SETTLEMENT_CURRENCY", String.class));
+ object.setCompanyId(resultSet.getObject("COMPANY_ID", Long.class));
+ object.setDuration(resultSet.getObject("DURATION", Long.class));
+ object.setFirstLegSettlementDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "FIRST_LEG_SETTLEMENT_DATE"));
+ object.setSecondLegSettlementDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "SECOND_LEG_SETTLEMENT_DATE"));
+ object.setFirstLegSettlementCode(resultSet.getObject("FIRST_LEG_SETTLEMENT_CODE", String.class));
+ object.setSecondLegSettlementCode(resultSet.getObject("SECOND_LEG_SETTLEMENT_CODE", String.class));
+ object.setSecurityFullName(resultSet.getObject("SECURITY_FULL_NAME", String.class));
+ object.setSecuritySymbol(resultSet.getObject("SECURITY_SYMBOL", String.class));
+ object.setSecurityCode(resultSet.getObject("SECURITY_CODE", String.class));
+ object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class));
+ object.setContract(resultSet.getObject("CONTRACT", String.class));
+ object.setCounterPartyId(resultSet.getObject("COUNTER_PARTY_ID", Long.class));
+ object.setCoverageStatus(resultSet.getObject("COVERAGE_STATUS", String.class));
+ object.setSessionId(resultSet.getObject("SESSION_ID", Long.class));
+ object.setClearingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "CLEARING_DATE"));
+ object.setCounterPartyTradingClearingRegistryId(resultSet.getObject("COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID", Long.class));
+ return object;
+ }
+
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionFondLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionFondLoader.java
new file mode 100644
index 000000000..4fcb487e7
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionFondLoader.java
@@ -0,0 +1,220 @@
+package ru.spcex.clearing.registry.reports.loaders;
+
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.registry.conf.properties.AProperties;
+import ru.spcex.clearing.registry.reports.ReportUtils;
+import ru.spcex.clearing.registry.reports.bean.*;
+import ru.spcex.clearing.registry.reports.loaders.helpers.AllowedDictionaryRowMapper;
+import ru.spcex.clearing.registry.reports.loaders.helpers.CompanyRowMapper;
+import ru.spcex.clearing.registry.reports.loaders.helpers.CompanySymbolsRowMapper;
+import ru.spcex.clearing.registry.reports.loaders.helpers.TradingClearingRegistryRowMapper;
+
+import java.math.BigDecimal;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Component
+public class ExecutionFondLoader extends IDBLoader {
+ protected ExecutionFondLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) {
+ super(properties.getPeriod(), clearingJdbc);
+ }
+
+
+ @Override
+ public List loadObjects() {
+ try {
+ List executionFonds = super.loadObjects();
+ if (executionFonds.isEmpty()) {
+ log.warn("ExecutionFond not found.");
+ return new ArrayList<>();
+ }
+
+ Map> groupedExecutionFondForTKR = executionFonds.stream()
+ .collect(Collectors.groupingBy(ExecutionFond::getTradingClearingRegistryId));
+ Set tkrIds = groupedExecutionFondForTKR.keySet();
+ MapSqlParameterSource parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("ids", tkrIds);
+ List tradingClearingRegistries = clearingJdbc.query(
+ "select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)",
+ parameterSource, new TradingClearingRegistryRowMapper()
+ );
+ for (TradingClearingRegistry tkr : tradingClearingRegistries) {
+ List executionFondList = groupedExecutionFondForTKR.get(tkr.getId());
+ for (ExecutionFond fond : executionFondList) {
+ fond.setSellerTkrCode(tkr.getCode());
+ }
+ }
+
+ Map> companySymbolsForCompanyIdMap;
+ {
+ Set companyIds = executionFonds.stream().map(ExecutionFond::getCompanyId).collect(Collectors.toSet());
+ parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("ids", companyIds);
+ parameterSource.addValue("cs", CompanySymbol.CLRC.getKey());
+ List companySymbolsForCompanyId = clearingJdbc.query(
+ "select ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE from COMPANY_SYMBOLS where COMPANY_ID in (:ids) and COMPANY_SYMBOL = :cs",
+ parameterSource, new CompanySymbolsRowMapper()
+ );
+ companySymbolsForCompanyIdMap = companySymbolsForCompanyId.stream().collect(Collectors.groupingBy(CompanySymbols::getCompanyId));
+ }
+
+ Map> companySymbolsForCounterPartyIdMap;
+ {
+ Set counterPartyIds = executionFonds.stream().map(ExecutionFond::getCounterPartyId).collect(Collectors.toSet());
+ parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("ids", counterPartyIds);
+ parameterSource.addValue("companySymbol", CompanySymbol.CLRC.getKey());
+ List companySymbolsForCounterPartyId = clearingJdbc.query(
+ "select ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE from COMPANY_SYMBOLS where COMPANY_ID in (:ids) and COMPANY_SYMBOL = :companySymbol",
+ parameterSource, new CompanySymbolsRowMapper()
+ );
+ companySymbolsForCounterPartyIdMap = companySymbolsForCounterPartyId.stream().collect(Collectors.groupingBy(CompanySymbols::getCompanyId));
+ }
+
+ Map companyById;
+ {
+ Set allCompanyIds = Stream.concat(
+ executionFonds.stream().map(ExecutionFond::getCompanyId),
+ executionFonds.stream().map(ExecutionFond::getCounterPartyId))
+ .collect(Collectors.toSet());
+ parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("ids", allCompanyIds);
+ List companyForCompanyId = clearingJdbc.query(
+ "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)",
+ parameterSource, new CompanyRowMapper()
+ );
+ companyById = companyForCompanyId.stream()
+ .collect(Collectors.toMap(Company::getId, o -> o));
+ }
+
+ Set coverageStatuses = executionFonds.stream().map(ExecutionFond::getCoverageStatus).collect(Collectors.toSet());
+ parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("coverageStatuses", coverageStatuses);
+ List allowedDictionaries = clearingJdbc.query(
+ "select CODE, NAME from ALLOWED_DICTIONARY where CODE in (:coverageStatuses)",
+ parameterSource, new AllowedDictionaryRowMapper()
+ );
+ Map> allowedDictionariesByCode = allowedDictionaries.stream()
+ .collect(Collectors.groupingBy(AllowedDictionary::getCode));
+
+ for (ExecutionFond executionFond : executionFonds) {
+ Company companyByCompanyId = companyById.get(executionFond.getCompanyId());
+ Company companyByCounterPartyId = companyById.get(executionFond.getCounterPartyId());
+ String side = executionFond.getSide() == null ? null : executionFond.getSide().toUpperCase();
+ if (MoneyFlowSide.SELL.equalsByKey(side) || Side.SELL.equalsByKey(side)) {
+ if (companyByCompanyId != null) {
+ executionFond.setSeller(companyByCompanyId.getShortName());
+ }
+ if (companyByCounterPartyId != null) {
+ executionFond.setBuyer(companyByCounterPartyId.getShortName());
+ }
+ {
+ List cSymbols = companySymbolsForCompanyIdMap.get(executionFond.getCompanyId());
+ if (cSymbols != null && !cSymbols.isEmpty()) {
+ CompanySymbols companySymbols = cSymbols.iterator().next();
+ executionFond.setSellerCode(companySymbols.getCompanySymbolValue());
+ }
+ }
+ {
+ List cSymbols = companySymbolsForCounterPartyIdMap.get(executionFond.getCounterPartyId());
+ if (cSymbols != null && !cSymbols.isEmpty()) {
+ CompanySymbols companySymbols = cSymbols.iterator().next();
+ executionFond.setBuyerCode(companySymbols.getCompanySymbolValue());
+ }
+ }
+ executionFond.setBuyerTkrCode(executionFond.getCounterPartyTradingClearingRegistry());
+ } else if (MoneyFlowSide.BUY.equalsByKey(side) || Side.BUY.equalsByKey(side)) {
+ if (companyByCompanyId != null) {
+ executionFond.setBuyer(companyByCompanyId.getShortName());
+ }
+ if (companyByCounterPartyId != null) {
+ executionFond.setSeller(companyByCounterPartyId.getShortName());
+ }
+ {
+ List cSymbols = companySymbolsForCompanyIdMap.get(executionFond.getCompanyId());
+ if (cSymbols != null && !cSymbols.isEmpty()) {
+ CompanySymbols companySymbols = cSymbols.iterator().next();
+ executionFond.setBuyerCode(companySymbols.getCompanySymbolValue());
+ }
+ }
+ {
+ List cSymbols = companySymbolsForCounterPartyIdMap.get(executionFond.getCounterPartyId());
+ if (cSymbols != null && !cSymbols.isEmpty()) {
+ CompanySymbols companySymbols = cSymbols.iterator().next();
+ executionFond.setSellerCode(companySymbols.getCompanySymbolValue());
+ }
+ }
+ executionFond.setBuyerTkrCode(executionFond.getPartyTradingClearingRegistry());
+ } else {
+ log.warn("Unknown executionFond[{}].side={}", executionFond.getId(), executionFond.getSide());
+ }
+ List allowed = allowedDictionariesByCode.get(executionFond.getCoverageStatus());
+ if (allowed != null && !allowed.isEmpty()) {
+ executionFond.setStatus(allowed.iterator().next().getName());
+ }
+ }
+
+ return executionFonds;
+ } catch (Exception e) {
+ throw new RuntimeException("At ExecutionFondLoader", e);
+ }
+ }
+
+
+ @Override
+ protected ExecutionFond fromRS(ResultSet resultSet) throws SQLException {
+ ExecutionFond object = new ExecutionFond();
+ object.setId(resultSet.getObject("ID", Long.class));
+ object.setCreated(ReportUtils.getInstantFromTimestamp(resultSet, "CREATED_AT"));
+ object.setUpdated(ReportUtils.getInstantFromTimestamp(resultSet, "UPDATED_AT"));
+ object.setClearingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "CLEARING_DATE"));
+ object.setExchangeExecutionId(resultSet.getObject("EXCHANGE_EXECUTION_ID", Long.class));
+ object.setSide(resultSet.getObject("SIDE", String.class));
+ object.setMarket(resultSet.getObject("MARKET", String.class));
+ object.setTradingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "TRADING_DATE"));
+ object.setSecuritySymbol(resultSet.getObject("SECURITY_SYMBOL", String.class));
+ object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class));
+ object.setInterestAmount(resultSet.getObject("INTEREST_AMOUNT", BigDecimal.class));
+ object.setExchangeOrderId(resultSet.getObject("EXCHANGE_ORDER_ID", Long.class));
+ object.setPrice(resultSet.getObject("PRICE", BigDecimal.class));
+ object.setSettlementAmount(resultSet.getObject("SETTLEMENT_AMOUNT", BigDecimal.class));
+ object.setLots(resultSet.getObject("LOTS", BigDecimal.class));
+ object.setQuantity(resultSet.getObject("QUANTITY", BigDecimal.class));
+ object.setExchangeExecutionTime(ReportUtils.getInstantFromTimestamp(resultSet, "EXCHANGE_EXECUTION_TIME"));
+ object.setDuration(resultSet.getObject("DURATION", Long.class));
+ object.setTradingClearingRegistryId(resultSet.getObject("TRADING_CLEARING_REGISTRY_ID", Long.class));
+ object.setPartyTradingClearingRegistry(resultSet.getObject("PARTY_TRADING_CLEARING_REGISTRY", String.class));
+ object.setCounterPartyTradingClearingRegistry(resultSet.getObject("COUNTER_PARTY_TRADING_CLEARING_REGISTRY", String.class));
+ object.setComment(resultSet.getObject("COMMENT", String.class));
+ object.setClientCodeId(resultSet.getObject("CLIENT_CODE_ID", Long.class));
+ object.setSettlementCode(resultSet.getObject("SETTLEMENT_CODE", String.class));
+ object.setCompanyId(resultSet.getObject("COMPANY_ID", Long.class));
+ object.setCounterPartyId(resultSet.getObject("COUNTER_PARTY_ID", Long.class));
+ object.setSecurityFullName(resultSet.getObject("SECURITY_FULL_NAME", String.class));
+ object.setSettlementDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "SETTLEMENT_DATE"));
+ object.setSettlementCurrency(resultSet.getObject("SETTLEMENT_CURRENCY", String.class));
+ object.setExchangeExecutionMicroseconds(ReportUtils.getInstantFromTimestamp(resultSet, "EXCHANGE_EXECUTION_MICROSECONDS"));
+ object.setCoverageStatus(resultSet.getObject("COVERAGE_STATUS", String.class));
+ object.setSessionId(resultSet.getObject("SESSION_ID", Long.class));
+ object.setCounterPartyTradingClearingRegistryId(resultSet.getObject("COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID", Long.class));
+ return object;
+ }
+
+ @Override
+ protected String sqlQuery() {
+ return "select * from EXECUTION_FOND where CLEARING_DATE >= :startDate and CLEARING_DATE < :endDate";
+ }
+
+ @Override
+ protected Class getDBObjectClass() {
+ return ExecutionFond.class;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/IDBLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/IDBLoader.java
new file mode 100644
index 000000000..b4c14f366
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/IDBLoader.java
@@ -0,0 +1,59 @@
+package ru.spcex.clearing.registry.reports.loaders;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import ru.spcex.clearing.registry.conf.properties.PeriodProperties;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.time.LocalDate;
+import java.util.List;
+
+public abstract class IDBLoader {
+ protected final Logger log = LoggerFactory.getLogger(getClass());
+ protected final PeriodProperties periodProperties;
+ protected final NamedParameterJdbcTemplate clearingJdbc;
+
+ protected IDBLoader(PeriodProperties periodProperties, NamedParameterJdbcTemplate clearingJdbc) {
+ this.periodProperties = periodProperties;
+ this.clearingJdbc = clearingJdbc;
+ }
+
+ public List loadObjects() {
+ log.trace("Загрузчик {}", getClass().getSimpleName());
+ long timer = System.currentTimeMillis();
+ try {
+ String sql = sqlQuery();
+ assert sql.contains(":startDate") && sql.contains(":endDate");
+ MapSqlParameterSource parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("startDate", periodProperties.getStartDate());
+ LocalDate endDate = periodProperties.getEndDate();
+ endDate = endDate.plusDays(1); // startDate <= x < endDate, в базе может быть как DATE, TIMESTAMP
+ parameterSource.addValue("endDate", endDate);
+ log.debug("Запрос SQL: \"{}\", с параметрами: startDate={}, endDate={}",
+ sql, periodProperties.getStartDate(), endDate);
+ return clearingJdbc.query(sql, parameterSource, (rs, rowNum) -> fromRS(rs));
+ } catch (Exception e) {
+ log.error("Не могу загрузить объект класса %s, причина:".formatted(getDBObjectClass()), e);
+ throw new RuntimeException(e);
+ } finally {
+ timer = System.currentTimeMillis() - timer;
+ log.debug("Загрузка {} завершена за {} ms", getDBObjectClass().getSimpleName(), timer);
+ }
+ }
+
+ /**
+ * Метод должен возвращать либо объект, либо null если объект не подходит под условия
+ * (тогда он не будет включен в выборку)
+ */
+ protected abstract T fromRS(ResultSet rs) throws SQLException;
+
+ /**
+ * В созданном запросе обязательно должны быть параметры startDate и endDate
+ */
+ protected abstract String sqlQuery();
+
+ protected abstract Class getDBObjectClass();
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/IDBObject.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/IDBObject.java
new file mode 100644
index 000000000..7739ce002
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/IDBObject.java
@@ -0,0 +1,4 @@
+package ru.spcex.clearing.registry.reports.loaders;
+
+public interface IDBObject {
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/MoneyBalanceLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/MoneyBalanceLoader.java
new file mode 100644
index 000000000..9b621105a
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/MoneyBalanceLoader.java
@@ -0,0 +1,62 @@
+package ru.spcex.clearing.registry.reports.loaders;
+
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.registry.conf.properties.AProperties;
+import ru.spcex.clearing.registry.exceptions.ConfigurationException;
+import ru.spcex.clearing.registry.reports.bean.Company;
+import ru.spcex.clearing.registry.reports.bean.RegistryHistory;
+import ru.spcex.clearing.registry.reports.loaders.helpers.*;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+public class MoneyBalanceLoader extends RegistryHistoryLoader {
+ private String houseName = "";
+
+ protected MoneyBalanceLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) {
+ super(properties, clearingJdbc);
+ MapSqlParameterSource parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("houseId", 2L);
+ List result = null;
+ try {
+ result = clearingJdbc.query(
+ "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where id = :houseId",
+ parameterSource, new CompanyRowMapper()
+ );
+ } catch (Exception e) {
+ throw new ConfigurationException("Не могу получить объект companyId = 2 из БД");
+ }
+ if (!result.isEmpty()) houseName = result.iterator().next().getShortName();
+ }
+
+ @Override
+ public List loadObjects() {
+ List result = super.loadObjects();
+ result = result.stream()
+ .filter(registryHistory -> registryHistory.getObject().getDiffBalance().compareTo(BigDecimal.ZERO) == 0)
+ .collect(Collectors.toList());
+ for (RegistryHistory registryHistory : result) {
+ registryHistory.setHouseName(houseName);
+ AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registryHistory.getObject().getAccountType());
+ String account;
+ if (accountType == AccountType.Clrn || accountType == AccountType.Info) {
+ account = registryHistory.getObject().getAccount();
+ registryHistory.setAccount(account);
+ }
+ }
+ return result;
+ }
+
+ @Override
+ protected String sqlQuery() {
+ RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM_T);
+ return ("select * from REGISTRY_HISTORY where EVENT_TIME >= :startDate and EVENT_TIME < :endDate and (%s) " +
+ "and TRADING_CLEARING_REGISTRY is not null and (diff_balance=0 or account_type='INFO')")
+ // diff_balance=0 то же что и check_balance=balance
+ .formatted(registryCodeSqlBuilder.buildSql());
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/MoneyInstructionLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/MoneyInstructionLoader.java
new file mode 100644
index 000000000..42b0f6d43
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/MoneyInstructionLoader.java
@@ -0,0 +1,128 @@
+package ru.spcex.clearing.registry.reports.loaders;
+
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.registry.conf.properties.AProperties;
+import ru.spcex.clearing.registry.reports.bean.Account;
+import ru.spcex.clearing.registry.reports.bean.Company;
+import ru.spcex.clearing.registry.reports.bean.PaymentInstruction;
+import ru.spcex.clearing.registry.reports.bean.Security;
+import ru.spcex.clearing.registry.reports.loaders.helpers.AccountRowMapper;
+import ru.spcex.clearing.registry.reports.loaders.helpers.AccountType;
+import ru.spcex.clearing.registry.reports.loaders.helpers.CompanyRowMapper;
+import ru.spcex.clearing.registry.reports.loaders.helpers.SecurityRowMapper;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Component
+public class MoneyInstructionLoader extends PaymentInstructionLoader {
+ private final Set MONEY_ACCOUNT_TYPES = Set.of(
+ AccountType.Clrn.getKey(),
+ AccountType.Info.getKey(),
+ AccountType.Anlt.getKey(),
+ AccountType.Tran.getKey()
+ );
+
+ protected MoneyInstructionLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) {
+ super(properties, clearingJdbc);
+ }
+
+ @Override
+ public List loadObjects() {
+ List result = new ArrayList<>();
+
+ List paymentInstructions = super.loadObjects();
+ if (paymentInstructions.isEmpty()) {
+ log.warn("PaymentInstructions not found.");
+ return result;
+ }
+ Map> groupedPaymentInstruction = paymentInstructions.stream()
+ .collect(Collectors.groupingBy(PaymentInstruction::getCreditLeg_accountId));
+ List ids = paymentInstructions.stream().map(PaymentInstruction::getCreditLeg_accountId).toList();
+ MapSqlParameterSource parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("ids", ids);
+ List accounts = clearingJdbc.query(
+ "select ID, ACCOUNT_TYPE from ACCOUNT where ID in (:ids)",
+ parameterSource, new AccountRowMapper()
+ );
+ for (Account account : accounts) {
+ if (account.getAccountType() != null && !MONEY_ACCOUNT_TYPES.contains(account.getAccountType().toUpperCase()))
+ continue;
+ Long id = account.getId();
+ List payments = groupedPaymentInstruction.get(id);
+ if (!payments.isEmpty()) result.addAll(payments);
+ }
+
+ {
+ Map> groupedPaymentInstructionBySenderId = paymentInstructions.stream()
+ .collect(Collectors.groupingBy(PaymentInstruction::getSenderId));
+ List senderIds = new ArrayList<>(groupedPaymentInstructionBySenderId.keySet());
+ parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("ids", senderIds);
+ List companies = clearingJdbc.query(
+ "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)",
+ parameterSource, new CompanyRowMapper()
+ );
+ for (Company company : companies) {
+ Long id = company.getId();
+ List payments = groupedPaymentInstructionBySenderId.get(id);
+ if (payments != null) {
+ for (PaymentInstruction paymentInstruction : payments) {
+ paymentInstruction.setSender(company.getShortName());
+ paymentInstruction.setSenderClearingCode(company.getClearingCode());
+ paymentInstruction.setSenderCompanyClearingCode(company.getClearingCode());
+ paymentInstruction.setSenderCompanyShortName(company.getShortName());
+ }
+ }
+ }
+ }
+
+ {
+ Map> groupedPaymentInstructionByAddresseeId = paymentInstructions.stream()
+ .collect(Collectors.groupingBy(PaymentInstruction::getAddresseeId));
+ List addresseeIds = new ArrayList<>(groupedPaymentInstructionByAddresseeId.keySet());
+ parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("ids", addresseeIds);
+ List companies = clearingJdbc.query(
+ "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)",
+ parameterSource, new CompanyRowMapper()
+ );
+ for (Company company : companies) {
+ Long id = company.getId();
+ List payments = groupedPaymentInstructionByAddresseeId.get(id);
+ if (payments != null) {
+ for (PaymentInstruction paymentInstruction : payments) {
+ paymentInstruction.setAddressee(company.getShortName());
+ paymentInstruction.setAddresseeClearingCode(company.getClearingCode());
+ paymentInstruction.setAddresseeCompanyClearingCode(company.getClearingCode());
+ paymentInstruction.setAddresseeCompanyShortName(company.getShortName());
+ }
+ }
+ }
+ }
+
+ Map> groupedBySecurityId = paymentInstructions.stream()
+ .collect(Collectors.groupingBy(PaymentInstruction::getCreditLeg_securityId));
+ Set securityIds = groupedBySecurityId.keySet();
+ MapSqlParameterSource parameterSourceSecurityIds = new MapSqlParameterSource();
+ parameterSourceSecurityIds.addValue("ids", securityIds);
+ List securities = clearingJdbc.query(
+ "select ID, SECURITY_SYMBOL from SECURITY where ID in (:ids)",
+ parameterSourceSecurityIds, new SecurityRowMapper()
+ );
+ for (Security security : securities) {
+ List paymentInstructionList = groupedBySecurityId.get(security.getId());
+ if (paymentInstructionList != null) {
+ for (PaymentInstruction paymentInstruction : paymentInstructionList) {
+ paymentInstruction.setSecurity(security.getSecuritySymbol());
+ }
+ }
+ }
+ return result;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/PaymentInstructionLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/PaymentInstructionLoader.java
new file mode 100644
index 000000000..fbd20c67d
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/PaymentInstructionLoader.java
@@ -0,0 +1,108 @@
+package ru.spcex.clearing.registry.reports.loaders;
+
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.registry.conf.properties.AProperties;
+import ru.spcex.clearing.registry.reports.ReportUtils;
+import ru.spcex.clearing.registry.reports.bean.Account;
+import ru.spcex.clearing.registry.reports.bean.PaymentInstruction;
+import ru.spcex.clearing.registry.reports.loaders.helpers.Account2RowMapper;
+
+import java.math.BigDecimal;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Component
+public abstract class PaymentInstructionLoader extends IDBLoader {
+ protected PaymentInstructionLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) {
+ super(properties.getPeriod(), clearingJdbc);
+ }
+
+ @Override
+ public List loadObjects() {
+ List paymentInstructions = super.loadObjects();
+ if (paymentInstructions.isEmpty()) {
+ log.warn("PaymentInstruction not found.");
+ return new ArrayList<>();
+ }
+
+ Collection allAccountIds = paymentInstructions.stream()
+ .map(PaymentInstruction::getCreditLeg_accountId)
+ .collect(Collectors.toSet());
+ allAccountIds.addAll(paymentInstructions.stream()
+ .map(PaymentInstruction::getDebitLeg_accountId)
+ .collect(Collectors.toSet()));
+
+ MapSqlParameterSource parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("ids", allAccountIds);
+ List accounts = clearingJdbc.query(
+ "select ID, ACCOUNT_TYPE, ACCOUNT from ACCOUNT where ID in (:ids)",
+ parameterSource, new Account2RowMapper()
+ );
+ Map accountIdMap = accounts.stream().collect(Collectors.toMap(Account::getId, o -> o));
+
+ for (PaymentInstruction p : paymentInstructions) {
+ Account creditLegAccount = accountIdMap.get(p.getCreditLeg_accountId());
+ if (creditLegAccount != null)
+ p.setCreditLegAccountStr(creditLegAccount.getAccount());
+ Account debitLegAccount = accountIdMap.get(p.getDebitLeg_accountId());
+ if (debitLegAccount != null)
+ p.setDebitLegAccountStr(debitLegAccount.getAccount());
+ }
+
+ return paymentInstructions;
+ }
+
+ @Override
+ protected PaymentInstruction fromRS(ResultSet resultSet) throws SQLException {
+ PaymentInstruction object = new PaymentInstruction();
+ object.setId(resultSet.getObject("ID", Long.class));
+ object.setSenderId(resultSet.getObject("SENDER_ID", Long.class));
+ object.setAddresseeId(resultSet.getObject("ADDRESSEE_ID", Long.class));
+ object.setPayeeBic(resultSet.getObject("PAYEE_BIC", String.class));
+ object.setAddresseeBic(resultSet.getObject("ADRESSEE_BIC", String.class));
+ object.setPayeeBankName(resultSet.getObject("PAYEE_BANK_NAME", String.class));
+ object.setAddresseeBankName(resultSet.getObject("ADDRESSEE_BANK_NAME", String.class));
+ object.setPaymentDate(ReportUtils.getInstantFromTimestamp(resultSet, "PAYMENT_DATE"));
+ object.setPaymentPurpose(resultSet.getObject("PAYMENT_PURPOSE", String.class));
+ object.setSettlementDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "SETTLEMENT_DATE"));
+ object.setCreditLeg_amount(resultSet.getObject("CREDIT_LEG_AMOUNT", BigDecimal.class));
+ object.setDebitLeg_amount(resultSet.getObject("DEBIT_LEG_AMOUNT", BigDecimal.class));
+ object.setCreditLeg_accountId(resultSet.getObject("CREDIT_LEG_ACCOUNT_ID", Long.class));
+ object.setCredit_csAccount(resultSet.getObject("CREDIT_CS_ACCOUNT", String.class));
+ object.setCreditLeg_account(resultSet.getObject("CREDIT_LEG_ACCOUNT", String.class));
+ object.setDebitLeg_accountId(resultSet.getObject("DEBIT_LEG_ACCOUNT_ID", Long.class));
+ object.setDebit_csAccount(resultSet.getObject("DEBIT_CS_ACCOUNT", String.class));
+ object.setDebitLeg_account(resultSet.getObject("DEBIT_LEG_ACCOUNT", String.class));
+ object.setCreditLeg_direction(resultSet.getObject("CREDIT_LEG_DIRECTION", String.class));
+ object.setDebitLeg_direction(resultSet.getObject("DEBIT_LEG_DIRECTION", String.class));
+ object.setCreditLeg_currencyCode(resultSet.getObject("CREDIT_LEG_CURRENCY_CODE", String.class));
+ object.setDebitLeg_currencyCode(resultSet.getObject("DEBIT_LEG_CURRENCY_CODE", String.class));
+ object.setCreditLeg_securityId(resultSet.getObject("CREDIT_LEG_SECURITY_ID", Long.class));
+ object.setDebitLeg_securityId(resultSet.getObject("DEBIT_LEG_SECURITY_ID", Long.class));
+ object.setTransactionStatus(resultSet.getObject("TRANSACTION_STATUS", String.class));
+ object.setDocumentNumber(resultSet.getObject("DOCUMENT_NUMBER", String.class));
+ object.setCreated(ReportUtils.getInstantFromTimestamp(resultSet, "CREATED_AT"));
+ object.setUpdated(ReportUtils.getInstantFromTimestamp(resultSet, "UPDATED_AT"));
+ object.setClearingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "CLEARING_DATE"));
+ object.setSessionId(resultSet.getObject("SESSION_ID", Long.class));
+ return object;
+ }
+
+ @Override
+ protected Class getDBObjectClass() {
+ return PaymentInstruction.class;
+ }
+
+
+ @Override
+ protected String sqlQuery() {
+ return "select * from PAYMENT_INSTRUCTION where CLEARING_DATE >= :startDate and CLEARING_DATE < :endDate";
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/RegistryHistoryLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/RegistryHistoryLoader.java
new file mode 100644
index 000000000..21899cdbf
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/RegistryHistoryLoader.java
@@ -0,0 +1,100 @@
+package ru.spcex.clearing.registry.reports.loaders;
+
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.registry.conf.properties.AProperties;
+import ru.spcex.clearing.registry.reports.ReportUtils;
+import ru.spcex.clearing.registry.reports.bean.Registry;
+import ru.spcex.clearing.registry.reports.bean.RegistryHistory;
+
+import java.math.BigDecimal;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+@Component
+public abstract class RegistryHistoryLoader extends IDBLoader {
+ protected RegistryHistoryLoader(AProperties properties,
+ NamedParameterJdbcTemplate clearingJdbc) {
+ super(properties.getPeriod(), clearingJdbc);
+ }
+
+ @Override
+ protected RegistryHistory fromRS(ResultSet resultSet) throws SQLException {
+ RegistryHistory historyObject = new RegistryHistory();
+ Registry object = new Registry();
+
+ historyObject.setId(resultSet.getObject("ID", Long.class));
+ historyObject.setEventTime(ReportUtils.getInstantFromTimestamp(resultSet, "EVENT_TIME"));
+ historyObject.setUserId(resultSet.getObject("EVENT_USER_ID", Long.class));
+ historyObject.setEventType(resultSet.getObject("EVENT_TYPE", String.class));
+
+ object.setCreated(ReportUtils.getInstantFromTimestamp(resultSet, "CREATED_AT"));
+ object.setUpdated(ReportUtils.getInstantFromTimestamp(resultSet, "UPDATED_AT"));
+
+ object.setId(resultSet.getObject("REGISTRY_ID", Long.class));
+ object.setCompanyId(resultSet.getObject("COMPANY_ID", Long.class));
+ object.setTradingCode(resultSet.getObject("TRADING_CODE", String.class));
+ object.setClearingCode(resultSet.getObject("CLEARING_CODE", String.class));
+ object.setShortName(resultSet.getObject("SHORT_NAME", String.class));
+ object.setFullName(resultSet.getObject("FULL_NAME", String.class));
+ object.setAccountId(resultSet.getObject("ACCOUNT_ID", Long.class));
+
+ object.setAccountType(resultSet.getObject("ACCOUNT_TYPE", String.class));
+ object.setAccount(resultSet.getObject("ACCOUNT", String.class));
+ object.setRegistryDesignation(resultSet.getObject("REGISTRY_DESIGNATION", String.class));
+ object.setRegistryInstrumentType(resultSet.getObject("REGISTRY_INSTRUMENT_TYPE", String.class));
+ object.setRegistryCapacity(resultSet.getObject("REGISTRY_CAPACITY", String.class));
+
+ object.setRegistryUnit(resultSet.getObject("REGISTRY_UNIT", String.class));
+ object.setRegistryCode(resultSet.getObject("REGISTRY_CODE", String.class));
+ object.setTradingClearingRegistryId(resultSet.getObject("TRADING_CLEARING_REGISTRY_ID", Long.class));
+ object.setTradingClearingRegistry(resultSet.getObject("TRADING_CLEARING_REGISTRY", String.class));
+
+ object.setRegistryStatus(resultSet.getObject("REGISTRY_STATUS", String.class));
+ object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class));
+ object.setSecuritySymbol(resultSet.getObject("SECURITY_SYMBOL", String.class));
+ object.setBalance(resultSet.getObject("BALANCE", BigDecimal.class));
+ object.setOpenBalance(resultSet.getObject("OPEN_BALANCE", BigDecimal.class));
+ object.setCloseBalance(resultSet.getObject("CLOSE_BALANCE", BigDecimal.class));
+
+ object.setCredit(resultSet.getObject("CREDIT", BigDecimal.class));
+ object.setDebit(resultSet.getObject("DEBIT", BigDecimal.class));
+ object.setSettledCredit(resultSet.getObject("SETTLED_CREDIT", BigDecimal.class));
+ object.setSettledDebit(resultSet.getObject("SETTLED_DEBIT", BigDecimal.class));
+ object.setCheckBalance(resultSet.getObject("CHECK_BALANCE", BigDecimal.class));
+ object.setDiffBalance(resultSet.getObject("DIFF_BALANCE", BigDecimal.class));
+ object.setPlanBalance(resultSet.getObject("PLAN_BALANCE", BigDecimal.class));
+
+ object.setBalanceDimension(resultSet.getObject("BALANCE_DIMENSION", String.class));
+ object.setSettlementDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "SETTLEMENT_DATE"));
+ object.setSettlementCode(resultSet.getObject("SETTLEMENT_CODE", String.class));
+ object.setTradingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "TRADING_DATE"));
+ object.setClearingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "CLEARING_DATE"));
+ object.setRefundDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "REFUND_DATE"));
+
+ object.setValueDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "VALUE_DATE"));
+ object.setPrice(resultSet.getObject("PRICE", BigDecimal.class));
+ object.setContract(resultSet.getObject("CONTRACT", String.class));
+ object.setCounterPartyId(resultSet.getObject("COUNTER_PARTY_ID", Long.class));
+ object.setComment(resultSet.getObject("COMMENT", String.class));
+ object.setParentId(resultSet.getObject("PARENT_ID", Long.class));
+ object.setGroupId(resultSet.getObject("GROUP_ID", Long.class));
+ object.setSessionId(resultSet.getObject("SESSION_ID", Long.class));
+
+ object.setSessionType(resultSet.getObject("SESSION_TYPE", String.class));
+ object.setPaymentId(resultSet.getObject("PAYMENT_ID", Long.class));
+
+ historyObject.setObject(object);
+ return historyObject;
+ }
+
+ @Override
+ protected String sqlQuery() {
+ return "select * from REGISTRY_HISTORY where EVENT_TIME >= :startDate and EVENT_TIME < :endDate";
+ }
+
+ @Override
+ protected Class getDBObjectClass() {
+ return RegistryHistory.class;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/RegistryLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/RegistryLoader.java
new file mode 100644
index 000000000..0f8426c83
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/RegistryLoader.java
@@ -0,0 +1,141 @@
+package ru.spcex.clearing.registry.reports.loaders;
+
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.stereotype.Component;
+import ru.spcex.clearing.registry.conf.properties.AProperties;
+import ru.spcex.clearing.registry.reports.ReportUtils;
+import ru.spcex.clearing.registry.reports.bean.*;
+import ru.spcex.clearing.registry.reports.loaders.helpers.ADictionaryRowMapper;
+import ru.spcex.clearing.registry.reports.loaders.helpers.RegistryCodeSqlBuilder;
+import ru.spcex.clearing.registry.reports.loaders.helpers.RegistryTradingParams;
+
+import java.math.BigDecimal;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.*;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Component
+public class RegistryLoader extends IDBLoader {
+ protected RegistryLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) {
+ super(properties.getPeriod(), clearingJdbc);
+ }
+
+ @Override
+ public List loadObjects() {
+ List result = super.loadObjects();
+ if (result.isEmpty()) {
+ log.warn("Registries not found.");
+ return new ArrayList<>();
+ }
+
+ // Мэппинг словаря здесь, а не в LiabilitiesRegistryReportBuilder
+ {
+ Set registryStatuses = result.stream().map(Registry::getRegistryStatus).collect(Collectors.toSet());
+ MapSqlParameterSource parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("expectedStatuses", registryStatuses);
+ List registryStatusDictionaries = clearingJdbc.query(
+ "select CODE, NAME from registry_status_dictionary where CODE in (:expectedStatuses)",
+ parameterSource, ADictionaryRowMapper.forRegistryStatusDictionary()
+ );
+ mappingField(result, registryStatusDictionaries, Registry::getRegistryStatus, Registry::setRegistryStatus_dictionary);
+ }
+ {
+ Set sessionTypes = result.stream().map(Registry::getSessionType).collect(Collectors.toSet());
+ MapSqlParameterSource parameterSource = new MapSqlParameterSource();
+ parameterSource.addValue("sessionTypes", sessionTypes);
+ List sessionTypeDictionaries = clearingJdbc.query(
+ "select CODE, NAME from session_type_dictionary where CODE in (:sessionTypes)",
+ parameterSource, ADictionaryRowMapper.forSessionTypeDictionary()
+ );
+ mappingField(result, sessionTypeDictionaries, Registry::getSessionType, Registry::setSessionType_dictionary);
+ }
+
+ return result;
+ }
+
+ private void mappingField(Collection inRows,
+ List dictionaryLst,
+ Function getter, BiConsumer setter) {
+ Map> registryStatusDictionariesByCode = dictionaryLst.stream()
+ .collect(Collectors.groupingBy(D::getCode));
+ for (Registry registry : inRows) {
+ String key = getter.apply(registry);
+ List regStatuses = registryStatusDictionariesByCode.get(key);
+ String value = key;
+ if (regStatuses != null && !regStatuses.isEmpty()) {
+ value = regStatuses.iterator().next().getName();
+ }
+ setter.accept(registry, value);
+ }
+ }
+
+ @Override
+ protected String sqlQuery() {
+ RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.OM_T, RegistryTradingParams.OS_T);
+ return ("select * from REGISTRY where SETTLEMENT_DATE >= :startDate and SETTLEMENT_DATE < :endDate " +
+ "and %s and REGISTRY_STATUS='%s'") // and TRADING_CLEARING_REGISTRY is not null
+ .formatted(registryCodeSqlBuilder.buildSql(), RegistryStatus.CLRD.getKey());
+ }
+
+ @Override
+ protected Class getDBObjectClass() {
+ return Registry.class;
+ }
+
+ @Override
+ protected Registry fromRS(ResultSet resultSet) throws SQLException {
+ Registry object = new Registry();
+ object.setCompanyId(resultSet.getObject("COMPANY_ID", Long.class));
+ object.setTradingCode(resultSet.getObject("TRADING_CODE", String.class));
+ object.setClearingCode(resultSet.getObject("CLEARING_CODE", String.class));
+ object.setShortName(resultSet.getObject("SHORT_NAME", String.class));
+ object.setFullName(resultSet.getObject("FULL_NAME", String.class));
+ object.setAccountId(resultSet.getObject("ACCOUNT_ID", Long.class));
+ object.setAccountType(resultSet.getObject("ACCOUNT_TYPE", String.class));
+ object.setAccount(resultSet.getObject("ACCOUNT", String.class));
+ object.setRegistryDesignation(resultSet.getObject("REGISTRY_DESIGNATION", String.class));
+ object.setRegistryInstrumentType(resultSet.getObject("REGISTRY_INSTRUMENT_TYPE", String.class));
+ object.setRegistryCapacity(resultSet.getObject("REGISTRY_CAPACITY", String.class));
+ object.setRegistryUnit(resultSet.getObject("REGISTRY_UNIT", String.class));
+ object.setRegistryCode(resultSet.getObject("REGISTRY_CODE", String.class));
+ object.setTradingClearingRegistryId(resultSet.getObject("TRADING_CLEARING_REGISTRY_ID", Long.class));
+ object.setTradingClearingRegistry(resultSet.getObject("TRADING_CLEARING_REGISTRY", String.class));
+ object.setRegistryStatus(resultSet.getObject("REGISTRY_STATUS", String.class));
+ object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class));
+ object.setSecuritySymbol(resultSet.getObject("SECURITY_SYMBOL", String.class));
+ object.setBalance(resultSet.getObject("BALANCE", BigDecimal.class));
+ object.setOpenBalance(resultSet.getObject("OPEN_BALANCE", BigDecimal.class));
+ object.setCloseBalance(resultSet.getObject("CLOSE_BALANCE", BigDecimal.class));
+ object.setCredit(resultSet.getObject("CREDIT", BigDecimal.class));
+ object.setDebit(resultSet.getObject("DEBIT", BigDecimal.class));
+ object.setSettledCredit(resultSet.getObject("SETTLED_CREDIT", BigDecimal.class));
+ object.setSettledDebit(resultSet.getObject("SETTLED_DEBIT", BigDecimal.class));
+ object.setCheckBalance(resultSet.getObject("CHECK_BALANCE", BigDecimal.class));
+ object.setDiffBalance(resultSet.getObject("DIFF_BALANCE", BigDecimal.class));
+ object.setPlanBalance(resultSet.getObject("PLAN_BALANCE", BigDecimal.class));
+ object.setBalanceDimension(resultSet.getObject("BALANCE_DIMENSION", String.class));
+ object.setSettlementDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "SETTLEMENT_DATE"));
+ object.setSettlementCode(resultSet.getObject("SETTLEMENT_CODE", String.class));
+ object.setTradingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "TRADING_DATE"));
+ object.setClearingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "CLEARING_DATE"));
+ object.setRefundDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "REFUND_DATE"));
+ object.setValueDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "VALUE_DATE"));
+ object.setPrice(resultSet.getObject("PRICE", BigDecimal.class));
+ object.setContract(resultSet.getObject("CONTRACT", String.class));
+ object.setCounterPartyId(resultSet.getObject("COUNTER_PARTY_ID", Long.class));
+ object.setComment(resultSet.getObject("COMMENT", String.class));
+ object.setParentId(resultSet.getObject("PARENT_ID", Long.class));
+ object.setGroupId(resultSet.getObject("GROUP_ID", Long.class));
+ object.setSessionId(resultSet.getObject("SESSION_ID", Long.class));
+ object.setSessionType(resultSet.getObject("SESSION_TYPE", String.class));
+ object.setPaymentId(resultSet.getObject("PAYMENT_ID", Long.class));
+ object.setId(resultSet.getObject("ID", Long.class));
+ object.setCreated(ReportUtils.getInstantFromTimestamp(resultSet, "CREATED_AT"));
+ object.setUpdated(ReportUtils.getInstantFromTimestamp(resultSet, "UPDATED_AT"));
+ return object;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/ADictionaryRowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/ADictionaryRowMapper.java
new file mode 100644
index 000000000..eb1d4c00d
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/ADictionaryRowMapper.java
@@ -0,0 +1,41 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+import org.springframework.jdbc.core.RowMapper;
+import ru.spcex.clearing.registry.reports.bean.AbstractDictionary;
+import ru.spcex.clearing.registry.reports.bean.AllowedDictionary;
+import ru.spcex.clearing.registry.reports.bean.RegistryStatusDictionary;
+import ru.spcex.clearing.registry.reports.bean.SessionTypeDictionary;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Objects;
+import java.util.function.Supplier;
+
+public class ADictionaryRowMapper implements RowMapper {
+ protected final Supplier objectCreator;
+
+ public ADictionaryRowMapper(Supplier objectCreator) {
+ this.objectCreator = Objects.requireNonNull(objectCreator);
+ }
+
+ @Override
+ public T mapRow(ResultSet rs, int rowNum) throws SQLException {
+ T registryStatusDictionary = objectCreator.get();
+ registryStatusDictionary.setCode(rs.getString("CODE"));
+ registryStatusDictionary.setName(rs.getString("NAME"));
+ return registryStatusDictionary;
+ }
+
+ public static ADictionaryRowMapper forAllowedDictionary() {
+ return new ADictionaryRowMapper<>(AllowedDictionary::new);
+ }
+
+ public static ADictionaryRowMapper forRegistryStatusDictionary() {
+ return new ADictionaryRowMapper<>(RegistryStatusDictionary::new);
+ }
+
+ public static ADictionaryRowMapper forSessionTypeDictionary() {
+ return new ADictionaryRowMapper<>(SessionTypeDictionary::new);
+ }
+
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/Account2RowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/Account2RowMapper.java
new file mode 100644
index 000000000..d3893160f
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/Account2RowMapper.java
@@ -0,0 +1,18 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+import org.springframework.jdbc.core.RowMapper;
+import ru.spcex.clearing.registry.reports.bean.Account;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class Account2RowMapper implements RowMapper {
+ @Override
+ public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
+ Account account = new Account();
+ account.setId(rs.getLong("ID"));
+ account.setAccountType(rs.getString("ACCOUNT_TYPE"));
+ account.setAccount(rs.getString("ACCOUNT"));
+ return account;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AccountRowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AccountRowMapper.java
new file mode 100644
index 000000000..f4175dce3
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AccountRowMapper.java
@@ -0,0 +1,17 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+import org.springframework.jdbc.core.RowMapper;
+import ru.spcex.clearing.registry.reports.bean.Account;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class AccountRowMapper implements RowMapper {
+ @Override
+ public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
+ Account account = new Account();
+ account.setId(rs.getLong("ID"));
+ account.setAccountType(rs.getString("ACCOUNT_TYPE"));
+ return account;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AccountType.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AccountType.java
new file mode 100644
index 000000000..7bfce0651
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AccountType.java
@@ -0,0 +1,17 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+public enum AccountType implements IEnumKey {
+ Clrn("CLRN"), Bank("BANK"), Info("INFO"), Tran("TRAN"), Corr("CORR"), Anlt("ANLT"), Depo("DEPO"),
+ Dtrn("DTRN");
+
+ private final String key;
+
+ AccountType(String key) {
+ this.key = key;
+ }
+
+ @Override
+ public String getKey() {
+ return key;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AllowedDictionaryRowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AllowedDictionaryRowMapper.java
new file mode 100644
index 000000000..b876552a3
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AllowedDictionaryRowMapper.java
@@ -0,0 +1,17 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+import org.springframework.jdbc.core.RowMapper;
+import ru.spcex.clearing.registry.reports.bean.AllowedDictionary;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class AllowedDictionaryRowMapper implements RowMapper {
+ @Override
+ public AllowedDictionary mapRow(ResultSet rs, int rowNum) throws SQLException {
+ AllowedDictionary allowedDictionary = new AllowedDictionary();
+ allowedDictionary.setCode(rs.getString("CODE"));
+ allowedDictionary.setName(rs.getString("NAME"));
+ return allowedDictionary;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/CompanyRowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/CompanyRowMapper.java
new file mode 100644
index 000000000..224bab76d
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/CompanyRowMapper.java
@@ -0,0 +1,18 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+import org.springframework.jdbc.core.RowMapper;
+import ru.spcex.clearing.registry.reports.bean.Company;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class CompanyRowMapper implements RowMapper {
+ @Override
+ public Company mapRow(ResultSet rs, int rowNum) throws SQLException {
+ Company company = new Company();
+ company.setId(rs.getLong("ID"));
+ company.setClearingCode(rs.getString("CLEARING_CODE"));
+ company.setShortName(rs.getString("SHORT_NAME"));
+ return company;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/CompanySymbolsRowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/CompanySymbolsRowMapper.java
new file mode 100644
index 000000000..a89994162
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/CompanySymbolsRowMapper.java
@@ -0,0 +1,19 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+import org.springframework.jdbc.core.RowMapper;
+import ru.spcex.clearing.registry.reports.bean.CompanySymbols;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class CompanySymbolsRowMapper implements RowMapper {
+ @Override
+ public CompanySymbols mapRow(ResultSet rs, int rowNum) throws SQLException {
+ CompanySymbols companySymbols = new CompanySymbols();
+ companySymbols.setId(rs.getLong("ID"));
+ companySymbols.setCompanyId(rs.getLong("COMPANY_ID"));
+ companySymbols.setCompanySymbol(rs.getString("COMPANY_SYMBOL"));
+ companySymbols.setCompanySymbolValue(rs.getString("COMPANY_SYMBOL_VALUE"));
+ return companySymbols;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/IEnumKey.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/IEnumKey.java
new file mode 100644
index 000000000..fdbb8ba4e
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/IEnumKey.java
@@ -0,0 +1,77 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public interface IEnumKey extends Serializable {
+ String getKey();
+
+ default boolean equalsByKey(String key) {
+ return key != null && getKey().equalsIgnoreCase(key);
+ }
+
+ /**
+ * Проверяет что среди данного набора Enum, присутствует элемент с данным id
+ * id может быть null
+ */
+ static & IEnumKey> boolean contains(String id, T... enumSet) {
+ for (T e : enumSet) {
+ if (Objects.equals(id, e.getKey()))
+ return true;
+ }
+ return false;
+ }
+
+ static & IEnumKey> boolean contains(T e, T... enumSet) {
+ for (T enumEl : enumSet) {
+ if (enumEl.equals(e))
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Проверяет что среди всех Enum данного класса, присутствует элемент с данным id
+ * id может быть null
+ */
+ static & IEnumKey> boolean contains(String key, Class enumClass) {
+ for (T e : enumClass.getEnumConstants()) {
+ if (Objects.equals(key, e.getKey()))
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Возвращает Enum по id, если в заданном классе такой определен
+ * id может быть null
+ *
+ * @return Enum если нашел, иначе null
+ */
+ static & IEnumKey> T getEnumByKey(Class enumClass, String key) {
+ for (T e : enumClass.getEnumConstants()) {
+ if (Objects.equals(key, e.getKey()))
+ return e;
+ }
+ return null;
+ }
+
+ static & IEnumKey> T getEnumByKeyOrUndefined(Class enumClass, String key) {
+ T enumByKey = getEnumByKey(enumClass, key);
+ return enumByKey == null ? getUndefined(enumClass) : enumByKey;
+ }
+
+ static & IEnumKey> T getUndefined(Class enumClass) {
+ T enumByKey = getEnumByKey(enumClass, UNDEFINED_VALUE);
+ if (enumByKey == null) {
+ throw new IllegalArgumentException("Undefined value not found in enum " + enumClass);
+ }
+ return enumByKey;
+ }
+
+ static String getKeyOrNull(IEnumKey enumVal) {
+ return enumVal == null ? null : enumVal.getKey();
+ }
+
+ String UNDEFINED_VALUE = "_Undefined";
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryCapacity.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryCapacity.java
new file mode 100644
index 000000000..683f21307
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryCapacity.java
@@ -0,0 +1,22 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+public enum RegistryCapacity implements IEnumKey {
+ A("A"),
+ B("B"),
+ Z("Z"),
+ C("C"),
+ E("E"),
+ P("P")
+ ;
+
+ private final String key;
+
+ RegistryCapacity(String key) {
+ this.key = key;
+ }
+
+ @Override
+ public String getKey() {
+ return key;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryCodeSqlBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryCodeSqlBuilder.java
new file mode 100644
index 000000000..e9781b037
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryCodeSqlBuilder.java
@@ -0,0 +1,65 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class RegistryCodeSqlBuilder {
+
+ private List registryTradingParams;
+
+ public static RegistryCodeSqlBuilder getInstance(RegistryTradingParams... tradingParams) {
+ return new RegistryCodeSqlBuilder(Arrays.asList(tradingParams));
+ }
+
+ private RegistryCodeSqlBuilder(List tradingParams) {
+ this.registryTradingParams = tradingParams;
+ }
+
+ public String buildSql() {
+ List conditions = new ArrayList<>();
+ String REGISTRY_DESIGNATION_FORMAT = "REGISTRY_DESIGNATION = '%s'";
+ String REGISTRY_INSTRUMENT_TYPE_FORMAT = "REGISTRY_INSTRUMENT_TYPE = '%s'";
+ String REGISTRY_CAPACITY_FORMAT = "REGISTRY_CAPACITY = '%s'";
+ String REGISTRY_UNIT_FORMAT = "REGISTRY_UNIT = '%s'";
+ for (RegistryTradingParams tradingParams : this.registryTradingParams) {
+ StringBuilder condition = new StringBuilder();
+ boolean wasAddedCondition = false;
+ if (tradingParams.registryDesignation() != null) {
+ condition.append(String.format(REGISTRY_DESIGNATION_FORMAT, tradingParams.registryDesignation().getKey()));
+ wasAddedCondition = true;
+ }
+ if (wasAddedCondition) {
+ condition.append(" and ");
+ wasAddedCondition = false;
+ }
+ if (tradingParams.registryInstrumentType() != null) {
+ condition.append(String.format(REGISTRY_INSTRUMENT_TYPE_FORMAT, tradingParams.registryInstrumentType().getKey()));
+ wasAddedCondition = true;
+ }
+ if (wasAddedCondition) {
+ condition.append(" and ");
+ wasAddedCondition = false;
+ }
+ if (tradingParams.registryCapacity() != null) {
+ condition.append(String.format(REGISTRY_CAPACITY_FORMAT, tradingParams.registryCapacity().getKey()));
+ wasAddedCondition = true;
+ }
+ if (wasAddedCondition) {
+ condition.append(" and ");
+ wasAddedCondition = false;
+ }
+ if (tradingParams.registryUnit() != null) {
+ condition.append(String.format(REGISTRY_UNIT_FORMAT, tradingParams.registryUnit().getKey()));
+ wasAddedCondition = true;
+ }
+ if (!wasAddedCondition) {
+ condition.delete(condition.length() - " and ".length(), condition.length());
+ }
+ conditions.add(condition);
+ }
+ return conditions.stream().collect(Collectors.joining(") or (", "(", ")"));
+ }
+
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryDesignation.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryDesignation.java
new file mode 100644
index 000000000..ae36127cb
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryDesignation.java
@@ -0,0 +1,22 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+public enum RegistryDesignation implements IEnumKey {
+ A("A"),
+ O("O"),
+ T("T"),
+ D("D"),
+ L("L"),
+ C("C")
+ ;
+
+ private final String key;
+
+ RegistryDesignation(String key) {
+ this.key = key;
+ }
+
+ @Override
+ public String getKey() {
+ return key;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryInstrumentType.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryInstrumentType.java
new file mode 100644
index 000000000..4c57f9d0a
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryInstrumentType.java
@@ -0,0 +1,18 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+public enum RegistryInstrumentType implements IEnumKey {
+ M("M"),
+ S("S"),
+ ;
+
+ private final String key;
+
+ RegistryInstrumentType(String key) {
+ this.key = key;
+ }
+
+ @Override
+ public String getKey() {
+ return key;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryTradingParams.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryTradingParams.java
new file mode 100644
index 000000000..82fb0eba1
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryTradingParams.java
@@ -0,0 +1,263 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+public record RegistryTradingParams(RegistryDesignation registryDesignation,
+ RegistryInstrumentType registryInstrumentType,
+ RegistryCapacity registryCapacity,
+ RegistryUnit registryUnit) {
+
+ public boolean equalByRegistry(RegistryDesignation registryDesignation, RegistryInstrumentType registryInstrumentType,
+ RegistryCapacity registryCapacity, RegistryUnit registryUnit) {
+ boolean isEqualDesignation = this.registryDesignation == null || registryDesignation == this.registryDesignation;
+ boolean isEqualInstrumentType = this.registryInstrumentType == null || registryInstrumentType == this.registryInstrumentType;
+ boolean isEqualCapacity = this.registryCapacity == null || registryCapacity == this.registryCapacity;
+ boolean isEqualUnit = this.registryUnit == null || registryUnit == this.registryUnit;
+ return isEqualDesignation && isEqualInstrumentType && isEqualCapacity && isEqualUnit;
+ }
+
+ public RegistryTradingParams dsgn(RegistryDesignation registryDesignation) {
+ return new RegistryTradingParams(registryDesignation,
+ registryInstrumentType,
+ registryCapacity,
+ registryUnit);
+ }
+
+ public RegistryTradingParams dsgn(String registryDesignationS) {
+ RegistryDesignation registryDesignation = IEnumKey.getEnumByKey(RegistryDesignation.class, registryDesignationS);
+ return new RegistryTradingParams(registryDesignation,
+ registryInstrumentType,
+ registryCapacity,
+ registryUnit);
+ }
+
+ public RegistryTradingParams type(RegistryInstrumentType registryInstrumentType) {
+ return new RegistryTradingParams(registryDesignation,
+ registryInstrumentType,
+ registryCapacity,
+ registryUnit);
+ }
+
+ public RegistryTradingParams type(String registryInstrumentTypeS) {
+ RegistryInstrumentType registryInstrumentType = IEnumKey.getEnumByKey(RegistryInstrumentType.class,
+ registryInstrumentTypeS);
+ return new RegistryTradingParams(registryDesignation,
+ registryInstrumentType,
+ registryCapacity,
+ registryUnit);
+ }
+
+ public RegistryTradingParams cpcty(RegistryCapacity registryCapacity) {
+ return new RegistryTradingParams(registryDesignation,
+ registryInstrumentType,
+ registryCapacity,
+ registryUnit);
+ }
+
+ public RegistryTradingParams cpcty(String registryCapacityS) {
+ RegistryCapacity registryCapacity = IEnumKey.getEnumByKey(RegistryCapacity.class, registryCapacityS);
+ return new RegistryTradingParams(registryDesignation,
+ registryInstrumentType,
+ registryCapacity,
+ registryUnit);
+ }
+
+ public RegistryTradingParams unit(RegistryUnit registryUnit) {
+ return new RegistryTradingParams(registryDesignation,
+ registryInstrumentType,
+ registryCapacity,
+ registryUnit);
+ }
+
+ public RegistryTradingParams unit(String registryUnitS) {
+ RegistryUnit registryUnit = IEnumKey.getEnumByKey(RegistryUnit.class, registryUnitS);
+ return new RegistryTradingParams(registryDesignation,
+ registryInstrumentType,
+ registryCapacity,
+ registryUnit);
+ }
+
+ public final static RegistryTradingParams OS_T;
+ public final static RegistryTradingParams OM_T;
+ public final static RegistryTradingParams TS_T;
+ public final static RegistryTradingParams TM_T;
+ public final static RegistryTradingParams DM_X;
+ public final static RegistryTradingParams DM_T;
+ public final static RegistryTradingParams DM_I;
+ public final static RegistryTradingParams AM_F;
+ public final static RegistryTradingParams AM_T;
+ public final static RegistryTradingParams AM_B;
+ public final static RegistryTradingParams A__B;
+ public final static RegistryTradingParams A__F;
+ public final static RegistryTradingParams A__T;
+ public final static RegistryTradingParams AS_T;
+ public final static RegistryTradingParams DS_I;
+ public final static RegistryTradingParams DS_T;
+ public final static RegistryTradingParams AS_B;
+ public final static RegistryTradingParams AS_F;
+ public final static RegistryTradingParams CM_T;
+ public final static RegistryTradingParams LM_T;
+ public final static RegistryTradingParams CS_T;
+ public final static RegistryTradingParams LS_T;
+ public final static RegistryTradingParams L__T;
+ public final static RegistryTradingParams DM__;
+ public final static RegistryTradingParams AM__;
+ public final static RegistryTradingParams AS__;
+ public final static RegistryTradingParams CM__;
+ public final static RegistryTradingParams C__T;
+ public final static RegistryTradingParams O__T;
+ public final static RegistryTradingParams T__T;
+ public final static RegistryTradingParams LM__;
+ public final static RegistryTradingParams DMAU;
+ public final static RegistryTradingParams DMAI;
+ public final static RegistryTradingParams D__I;
+ public final static RegistryTradingParams D__V;
+ public final static RegistryTradingParams _S_T;
+
+ static {
+ OS_T = new RegistryTradingParams(RegistryDesignation.O,
+ RegistryInstrumentType.S,
+ null,
+ RegistryUnit.T);
+ OM_T = new RegistryTradingParams(RegistryDesignation.O,
+ RegistryInstrumentType.M,
+ null,
+ RegistryUnit.T);
+ TS_T = new RegistryTradingParams(RegistryDesignation.T,
+ RegistryInstrumentType.S,
+ null,
+ RegistryUnit.T);
+
+ TM_T = new RegistryTradingParams(RegistryDesignation.T,
+ RegistryInstrumentType.M,
+ null,
+ RegistryUnit.T);
+ DM_X = new RegistryTradingParams(RegistryDesignation.D,
+ RegistryInstrumentType.M,
+ null,
+ RegistryUnit.X);
+ DM_T = new RegistryTradingParams(RegistryDesignation.D,
+ RegistryInstrumentType.M,
+ null,
+ RegistryUnit.T);
+ DM_I = new RegistryTradingParams(RegistryDesignation.D,
+ RegistryInstrumentType.M,
+ null,
+ RegistryUnit.I);
+ AM_F = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.M,
+ null,
+ RegistryUnit.F);
+ AM_T = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.M,
+ null,
+ RegistryUnit.T);
+ AM_B = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.M,
+ null,
+ RegistryUnit.B);
+ A__B = new RegistryTradingParams(RegistryDesignation.A,
+ null,
+ null,
+ RegistryUnit.B);
+ A__F = new RegistryTradingParams(RegistryDesignation.A,
+ null,
+ null,
+ RegistryUnit.F);
+ A__T = new RegistryTradingParams(RegistryDesignation.A,
+ null,
+ null,
+ RegistryUnit.T);
+ AS_T = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.S,
+ null,
+ RegistryUnit.T);
+ AS_B = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.S,
+ null,
+ RegistryUnit.B);
+ AS_F = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.S,
+ null,
+ RegistryUnit.F);
+ CM_T = new RegistryTradingParams(RegistryDesignation.C,
+ RegistryInstrumentType.M,
+ null,
+ RegistryUnit.T);
+ LM_T = new RegistryTradingParams(RegistryDesignation.L,
+ RegistryInstrumentType.M,
+ null,
+ RegistryUnit.T);
+ CS_T = new RegistryTradingParams(RegistryDesignation.C,
+ RegistryInstrumentType.S,
+ null,
+ RegistryUnit.T);
+ LS_T = new RegistryTradingParams(RegistryDesignation.L,
+ RegistryInstrumentType.S,
+ null,
+ RegistryUnit.T);
+ L__T = new RegistryTradingParams(RegistryDesignation.L,
+ null,
+ null,
+ RegistryUnit.T);
+ DM__ = new RegistryTradingParams(RegistryDesignation.D,
+ RegistryInstrumentType.M,
+ null,
+ null);
+ AM__ = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.M,
+ null,
+ null);
+ AS__ = new RegistryTradingParams(RegistryDesignation.A,
+ RegistryInstrumentType.S,
+ null,
+ null);
+ CM__ = new RegistryTradingParams(RegistryDesignation.C,
+ RegistryInstrumentType.M,
+ null,
+ null);
+ LM__ = new RegistryTradingParams(RegistryDesignation.L,
+ RegistryInstrumentType.M,
+ null,
+ null);
+ DMAU = new RegistryTradingParams(RegistryDesignation.D,
+ RegistryInstrumentType.M,
+ RegistryCapacity.A,
+ RegistryUnit.U);
+ DMAI = new RegistryTradingParams(RegistryDesignation.D,
+ RegistryInstrumentType.M,
+ RegistryCapacity.A,
+ RegistryUnit.I);
+ DS_I = new RegistryTradingParams(RegistryDesignation.D,
+ RegistryInstrumentType.S,
+ null,
+ RegistryUnit.I);
+ DS_T = new RegistryTradingParams(RegistryDesignation.D,
+ RegistryInstrumentType.S,
+ null,
+ RegistryUnit.T);
+ D__I = new RegistryTradingParams(RegistryDesignation.D,
+ null,
+ null,
+ RegistryUnit.I);
+ D__V = new RegistryTradingParams(RegistryDesignation.D,
+ null,
+ null,
+ RegistryUnit.V);
+ C__T = new RegistryTradingParams(RegistryDesignation.C,
+ null,
+ null,
+ RegistryUnit.T);
+ O__T = new RegistryTradingParams(RegistryDesignation.O,
+ null,
+ null,
+ RegistryUnit.T);
+ T__T = new RegistryTradingParams(RegistryDesignation.T,
+ null,
+ null,
+ RegistryUnit.T);
+ _S_T = new RegistryTradingParams(null,
+ RegistryInstrumentType.S,
+ null,
+ RegistryUnit.T);
+ }
+
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryUnit.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryUnit.java
new file mode 100644
index 000000000..bbeffd033
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryUnit.java
@@ -0,0 +1,25 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+public enum RegistryUnit implements IEnumKey {
+ T("T"),
+ A("A"),
+ R("R"),
+ F("F"),
+ B("B"),
+ X("X"),
+ U("U"),
+ I("I"),
+ V("V"),
+ ;
+
+ private final String key;
+
+ RegistryUnit(String key) {
+ this.key = key;
+ }
+
+ @Override
+ public String getKey() {
+ return key;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/SecurityRowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/SecurityRowMapper.java
new file mode 100644
index 000000000..fc9d366d6
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/SecurityRowMapper.java
@@ -0,0 +1,17 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+import org.springframework.jdbc.core.RowMapper;
+import ru.spcex.clearing.registry.reports.bean.Security;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class SecurityRowMapper implements RowMapper {
+ @Override
+ public Security mapRow(ResultSet rs, int rowNum) throws SQLException {
+ Security security = new Security();
+ security.setId(rs.getLong("ID"));
+ security.setSecuritySymbol(rs.getString("SECURITY_SYMBOL"));
+ return security;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/TradingClearingRegistryRowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/TradingClearingRegistryRowMapper.java
new file mode 100644
index 000000000..da29848a2
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/TradingClearingRegistryRowMapper.java
@@ -0,0 +1,17 @@
+package ru.spcex.clearing.registry.reports.loaders.helpers;
+
+import org.springframework.jdbc.core.RowMapper;
+import ru.spcex.clearing.registry.reports.bean.TradingClearingRegistry;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class TradingClearingRegistryRowMapper implements RowMapper {
+ @Override
+ public TradingClearingRegistry mapRow(ResultSet rs, int rowNum) throws SQLException {
+ TradingClearingRegistry tkr = new TradingClearingRegistry();
+ tkr.setId(rs.getLong("ID"));
+ tkr.setCode(rs.getString("CODE"));
+ return tkr;
+ }
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/DepoBalanceRegisterReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/DepoBalanceRegisterReport.java
similarity index 56%
rename from clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/DepoBalanceRegisterReport.java
rename to clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/DepoBalanceRegisterReport.java
index ffbf30564..e01cd59b6 100644
--- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/DepoBalanceRegisterReport.java
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/DepoBalanceRegisterReport.java
@@ -1,48 +1,48 @@
-package ru.spcex.clearing.registry.reports.bean;
+package ru.spcex.clearing.registry.reports.report;
-import com.opencsv.bean.CsvBindByName;
-import com.opencsv.bean.CsvBindByPosition;
-import com.opencsv.bean.CsvDate;
-import com.opencsv.bean.CsvNumber;
+import ru.spcex.clearing.registry.annotation.BindByName;
+import ru.spcex.clearing.registry.annotation.BindByPosition;
+import ru.spcex.clearing.registry.annotation.ReportDate;
+import ru.spcex.clearing.registry.annotation.ReportNumber;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class DepoBalanceRegisterReport implements FileReport {
- @CsvBindByName(column = "Наименование Расчетного депозитария")
- @CsvBindByPosition(position = 0)
+ @BindByName(column = "Наименование Расчетного депозитария")
+ @BindByPosition(position = 0)
private String houseName;
- @CsvBindByName(column = "Номер отчета")
- @CsvBindByPosition(position = 1)
+ @BindByName(column = "Номер отчета")
+ @BindByPosition(position = 1)
private String number;
- @CsvBindByName(column = "Дата")
- @CsvBindByPosition(position = 2)
- @CsvDate(value = "dd.MM.yyyy")
+ @BindByName(column = "Дата")
+ @BindByPosition(position = 2)
+ @ReportDate(value = "dd.MM.yyyy")
private LocalDate date;
- @CsvBindByName(column = "Время")
- @CsvBindByPosition(position = 3)
- @CsvDate(value = "HH:mm:ss")
+ @BindByName(column = "Время")
+ @BindByPosition(position = 3)
+ @ReportDate(value = "HH:mm:ss")
private LocalDateTime time;
- @CsvBindByName(column = "Краткое наименование УК")
- @CsvBindByPosition(position = 4)
+ @BindByName(column = "Краткое наименование УК")
+ @BindByPosition(position = 4)
private String company;
- @CsvBindByName(column = "Номер торгового раздела счета депо/ код раздела «к размещению/выкупу»")
- @CsvBindByPosition(position = 5)
+ @BindByName(column = "Номер торгового раздела счета депо/ код раздела «к размещению/выкупу»")
+ @BindByPosition(position = 5)
private String account;
- @CsvBindByName(column = "Код ЦБ")
- @CsvBindByPosition(position = 6)
+ @BindByName(column = "Код ЦБ")
+ @BindByPosition(position = 6)
private String security;
- @CsvBindByName(column = "Количество ЦБ")
- @CsvBindByPosition(position = 7)
- @CsvNumber(value = "#0", writeFormat = "#0")
+ @BindByName(column = "Количество ЦБ")
+ @BindByPosition(position = 7)
+ @ReportNumber(value = "#0")
private BigDecimal sum;
public String getHouseName() {
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/DepoPaymentInstructionRegisterReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/DepoPaymentInstructionRegisterReport.java
similarity index 57%
rename from clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/DepoPaymentInstructionRegisterReport.java
rename to clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/DepoPaymentInstructionRegisterReport.java
index 4db555439..ee962c452 100644
--- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/DepoPaymentInstructionRegisterReport.java
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/DepoPaymentInstructionRegisterReport.java
@@ -1,60 +1,60 @@
-package ru.spcex.clearing.registry.reports.bean;
+package ru.spcex.clearing.registry.reports.report;
-import com.opencsv.bean.CsvBindByName;
-import com.opencsv.bean.CsvBindByPosition;
-import com.opencsv.bean.CsvDate;
-import com.opencsv.bean.CsvNumber;
+import ru.spcex.clearing.registry.annotation.BindByName;
+import ru.spcex.clearing.registry.annotation.BindByPosition;
+import ru.spcex.clearing.registry.annotation.ReportDate;
+import ru.spcex.clearing.registry.annotation.ReportNumber;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class DepoPaymentInstructionRegisterReport implements FileReport {
- @CsvBindByName(column = "Номер распоряжения")
- @CsvBindByPosition(position = 0)
+ @BindByName(column = "Номер распоряжения")
+ @BindByPosition(position = 0)
private Long number;
- @CsvBindByName(column = "Дата распоряжения")
- @CsvBindByPosition(position = 1)
- @CsvDate(value = "dd.MM.yyyy")
+ @BindByName(column = "Дата распоряжения")
+ @BindByPosition(position = 1)
+ @ReportDate(value = "dd.MM.yyyy")
private LocalDate date;
- @CsvBindByName(column = "Время формирования")
- @CsvBindByPosition(position = 2)
- @CsvDate(value = "HH:mm:ss")
+ @BindByName(column = "Время формирования")
+ @BindByPosition(position = 2)
+ @ReportDate(value = "HH:mm:ss")
private LocalDateTime time;
- @CsvBindByName(column = "Номер торгового банковского/клирингового счета списания")
- @CsvBindByPosition(position = 3)
+ @BindByName(column = "Номер торгового банковского/клирингового счета списания")
+ @BindByPosition(position = 3)
private String accountSender;
- @CsvBindByName(column = "Наименование владельца счета списания")
- @CsvBindByPosition(position = 4)
+ @BindByName(column = "Наименование владельца счета списания")
+ @BindByPosition(position = 4)
private String sender;
- @CsvBindByName(column = "Код владельца счета списания")
- @CsvBindByPosition(position = 5)
+ @BindByName(column = "Код владельца счета списания")
+ @BindByPosition(position = 5)
private String codeSender;
- @CsvBindByName(column = "Номер торгового банковского/клирингового счета зачисления")
- @CsvBindByPosition(position = 6)
+ @BindByName(column = "Номер торгового банковского/клирингового счета зачисления")
+ @BindByPosition(position = 6)
private String accountAddressee;
- @CsvBindByName(column = "Наименование владельца счета зачисления")
- @CsvBindByPosition(position = 7)
+ @BindByName(column = "Наименование владельца счета зачисления")
+ @BindByPosition(position = 7)
private String addressee;
- @CsvBindByName(column = "Код владельца счета зачисления")
- @CsvBindByPosition(position = 8)
+ @BindByName(column = "Код владельца счета зачисления")
+ @BindByPosition(position = 8)
private String codeAddressee;
- @CsvBindByName(column = "Код ЦБ")
- @CsvBindByPosition(position = 9)
+ @BindByName(column = "Код ЦБ")
+ @BindByPosition(position = 9)
private String security;
- @CsvBindByName(column = "Количество ЦБ")
- @CsvBindByPosition(position = 10)
- @CsvNumber(value = "#0", writeFormat = "#0")
+ @BindByName(column = "Количество ЦБ")
+ @BindByPosition(position = 10)
+ @ReportNumber(value = "#0")
private BigDecimal amount;
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionRegisterReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/ExecutionRegisterReport.java
similarity index 61%
rename from clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionRegisterReport.java
rename to clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/ExecutionRegisterReport.java
index a8dd7c7cb..6e95634bb 100644
--- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionRegisterReport.java
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/ExecutionRegisterReport.java
@@ -1,87 +1,87 @@
-package ru.spcex.clearing.registry.reports.bean;
+package ru.spcex.clearing.registry.reports.report;
-import com.opencsv.bean.CsvBindByName;
-import com.opencsv.bean.CsvBindByPosition;
-import com.opencsv.bean.CsvDate;
-import com.opencsv.bean.CsvNumber;
+import ru.spcex.clearing.registry.annotation.BindByName;
+import ru.spcex.clearing.registry.annotation.BindByPosition;
+import ru.spcex.clearing.registry.annotation.ReportDate;
+import ru.spcex.clearing.registry.annotation.ReportNumber;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class ExecutionRegisterReport implements FileReport {
- @CsvBindByName(column = "Наименование биржи")
- @CsvBindByPosition(position = 0)
+ @BindByName(column = "Наименование биржи")
+ @BindByPosition(position = 0)
private String clearingOrganization;
- @CsvBindByName(column = "Дата заключения сделки")
- @CsvBindByPosition(position = 1)
- @CsvDate(value = "dd.MM.yyyy")
+ @BindByName(column = "Дата заключения сделки")
+ @BindByPosition(position = 1)
+ @ReportDate(value = "dd.MM.yyyy")
private LocalDate tradingDate;
- @CsvBindByName(column = "Дата исполнения")
- @CsvBindByPosition(position = 2)
- @CsvDate(value = "dd.MM.yyyy")
+ @BindByName(column = "Дата исполнения")
+ @BindByPosition(position = 2)
+ @ReportDate(value = "dd.MM.yyyy")
private LocalDate settlementDate;
- @CsvBindByName(column = "Идентификационный номер сделки в Торговой системе")
- @CsvBindByPosition(position = 3)
+ @BindByName(column = "Идентификационный номер сделки в Торговой системе")
+ @BindByPosition(position = 3)
private Long exchangeExecutionId;
- @CsvBindByName(column = "Время заключения сделки в Торговой системе")
- @CsvBindByPosition(position = 4)
- @CsvDate(value = "HH:mm:ss")
+ @BindByName(column = "Время заключения сделки в Торговой системе")
+ @BindByPosition(position = 4)
+ @ReportDate(value = "HH:mm:ss")
private LocalDateTime exchangeExecutionTime;
- @CsvBindByName(column = "Код БИ")
- @CsvBindByPosition(position = 5)
+ @BindByName(column = "Код БИ")
+ @BindByPosition(position = 5)
private String security;
- @CsvBindByName(column = "Дата возврата")
- @CsvBindByPosition(position = 6)
- @CsvDate(value = "dd.MM.yyyy")
+ @BindByName(column = "Дата возврата")
+ @BindByPosition(position = 6)
+ @ReportDate(value = "dd.MM.yyyy")
private LocalDate refundDate;
- @CsvBindByName(column = "Код УК - продавца")
- @CsvBindByPosition(position = 7)
+ @BindByName(column = "Код УК - продавца")
+ @BindByPosition(position = 7)
private String sellerCode;
- @CsvBindByName(column = "Наименование УК - продавца")
- @CsvBindByPosition(position = 8)
+ @BindByName(column = "Наименование УК - продавца")
+ @BindByPosition(position = 8)
private String seller;
- @CsvBindByName(column = "ТКР продавца")
- @CsvBindByPosition(position = 9)
+ @BindByName(column = "ТКР продавца")
+ @BindByPosition(position = 9)
private String sellerTkr;
- @CsvBindByName(column = "Клиринговый код покупателя")
- @CsvBindByPosition(position = 10)
+ @BindByName(column = "Клиринговый код покупателя")
+ @BindByPosition(position = 10)
private String buyerCode;
- @CsvBindByName(column = "Наименование компании-покупателя")
- @CsvBindByPosition(position = 11)
+ @BindByName(column = "Наименование компании-покупателя")
+ @BindByPosition(position = 11)
private String buyer;
- @CsvBindByName(column = "Торгово-клиринговый регистр покупателя")
- @CsvBindByPosition(position = 12)
+ @BindByName(column = "Торгово-клиринговый регистр покупателя")
+ @BindByPosition(position = 12)
private String buyerTkr;
- @CsvBindByName(column = "Сумма сделки")
- @CsvBindByPosition(position = 13)
- @CsvNumber(value = "#0.00", writeFormat = "#0.00")
+ @BindByName(column = "Сумма сделки")
+ @BindByPosition(position = 13)
+ @ReportNumber(value = "#0.00")
private BigDecimal amount;
- @CsvBindByName(column = "Количество ценных бумаг")
- @CsvBindByPosition(position = 14)
- @CsvNumber(value = "#0", writeFormat = "#0")
+ @BindByName(column = "Количество ценных бумаг")
+ @BindByPosition(position = 14)
+ @ReportNumber(value = "#0")
private BigDecimal quantity;
- @CsvBindByName(column = "Статус")
- @CsvBindByPosition(position = 15)
+ @BindByName(column = "Статус")
+ @BindByPosition(position = 15)
private String status;
- @CsvBindByName(column = "Код режима")
- @CsvBindByPosition(position = 16)
+ @BindByName(column = "Код режима")
+ @BindByPosition(position = 16)
private String market;
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/FileReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/FileReport.java
new file mode 100644
index 000000000..8011ef41d
--- /dev/null
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/FileReport.java
@@ -0,0 +1,4 @@
+package ru.spcex.clearing.registry.reports.report;
+
+public interface FileReport {
+}
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/LiabilitiesRegistryReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/LiabilitiesRegistryReport.java
similarity index 65%
rename from clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/LiabilitiesRegistryReport.java
rename to clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/LiabilitiesRegistryReport.java
index ea669fa98..4d79234b1 100644
--- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/LiabilitiesRegistryReport.java
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/LiabilitiesRegistryReport.java
@@ -1,54 +1,54 @@
-package ru.spcex.clearing.registry.reports.bean;
+package ru.spcex.clearing.registry.reports.report;
-import com.opencsv.bean.CsvBindByName;
-import com.opencsv.bean.CsvBindByPosition;
-import com.opencsv.bean.CsvDate;
-import com.opencsv.bean.CsvNumber;
+import ru.spcex.clearing.registry.annotation.BindByName;
+import ru.spcex.clearing.registry.annotation.BindByPosition;
+import ru.spcex.clearing.registry.annotation.ReportDate;
+import ru.spcex.clearing.registry.annotation.ReportNumber;
import java.math.BigDecimal;
import java.time.LocalDate;
public class LiabilitiesRegistryReport implements FileReport {
- @CsvBindByName(column = "имя")
- @CsvBindByPosition(position = 0)
+ @BindByName(column = "имя")
+ @BindByPosition(position = 0)
private String short_name;
- @CsvBindByName(column = "клиринговый код")
- @CsvBindByPosition(position = 0)
+ @BindByName(column = "клиринговый код")
+ @BindByPosition(position = 1)
private String clearing_code;
- @CsvBindByName(column = "счет")
- @CsvBindByPosition(position = 1)
+ @BindByName(column = "счет")
+ @BindByPosition(position = 2)
private String account;
- @CsvBindByName(column = "код регистра")
- @CsvBindByPosition(position = 2)
+ @BindByName(column = "код регистра")
+ @BindByPosition(position = 3)
private String registry_code;
- @CsvBindByName(column = "статус")
- @CsvBindByPosition(position = 3)
+ @BindByName(column = "статус")
+ @BindByPosition(position = 4)
private String registry_status;
- @CsvBindByName(column = "инструмент валюта")
- @CsvBindByPosition(position = 4)
+ @BindByName(column = "инструмент валюта")
+ @BindByPosition(position = 5)
private String security_symbol;
- @CsvBindByName(column = "баланс")
- @CsvBindByPosition(position = 5)
- @CsvNumber(value = "#0.00", writeFormat = "#0.00")
+ @BindByName(column = "баланс")
+ @BindByPosition(position = 6)
+ @ReportNumber(value = "#0.00")
private BigDecimal balance;
- @CsvBindByName(column = "дата расчета")
- @CsvBindByPosition(position = 6)
- @CsvDate(value = "dd.MM.yyyy")
+ @BindByName(column = "дата расчета")
+ @BindByPosition(position = 7)
+ @ReportDate(value = "dd.MM.yyyy")
private LocalDate settlement_date;
- @CsvBindByName(column = "продукт")
- @CsvBindByPosition(position = 7)
+ @BindByName(column = "продукт")
+ @BindByPosition(position = 8)
private String contract;
- @CsvBindByName(column = "тип сессии")
- @CsvBindByPosition(position = 8)
+ @BindByName(column = "тип сессии")
+ @BindByPosition(position = 9)
private String session_type;
public String getShort_name() {
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyBalanceRegisterReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/MoneyBalanceRegisterReport.java
similarity index 55%
rename from clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyBalanceRegisterReport.java
rename to clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/MoneyBalanceRegisterReport.java
index b60115ee7..07c453257 100644
--- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyBalanceRegisterReport.java
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/MoneyBalanceRegisterReport.java
@@ -1,48 +1,48 @@
-package ru.spcex.clearing.registry.reports.bean;
+package ru.spcex.clearing.registry.reports.report;
-import com.opencsv.bean.CsvBindByName;
-import com.opencsv.bean.CsvBindByPosition;
-import com.opencsv.bean.CsvDate;
-import com.opencsv.bean.CsvNumber;
+import ru.spcex.clearing.registry.annotation.BindByName;
+import ru.spcex.clearing.registry.annotation.BindByPosition;
+import ru.spcex.clearing.registry.annotation.ReportDate;
+import ru.spcex.clearing.registry.annotation.ReportNumber;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class MoneyBalanceRegisterReport implements FileReport {
- @CsvBindByName(column = "Наименование Расчетного депозитария")
- @CsvBindByPosition(position = 0)
+ @BindByName(column = "Наименование Расчетного депозитария")
+ @BindByPosition(position = 0)
private String houseName;
- @CsvBindByName(column = "Номер отчета")
- @CsvBindByPosition(position = 1)
+ @BindByName(column = "Номер отчета")
+ @BindByPosition(position = 1)
private String number;
- @CsvBindByName(column = "Дата")
- @CsvBindByPosition(position = 2)
- @CsvDate(value = "dd.MM.yyyy")
+ @BindByName(column = "Дата")
+ @BindByPosition(position = 2)
+ @ReportDate(value = "dd.MM.yyyy")
private LocalDate date;
- @CsvBindByName(column = "Время")
- @CsvBindByPosition(position = 3)
- @CsvDate(value = "HH:mm:ss")
+ @BindByName(column = "Время")
+ @BindByPosition(position = 3)
+ @ReportDate(value = "HH:mm:ss")
private LocalDateTime time;
- @CsvBindByName(column = "Код валюты")
- @CsvBindByPosition(position = 4)
+ @BindByName(column = "Код валюты")
+ @BindByPosition(position = 4)
private String currency;
- @CsvBindByName(column = "Краткое наименование УК")
- @CsvBindByPosition(position = 5)
+ @BindByName(column = "Краткое наименование УК")
+ @BindByPosition(position = 5)
private String company;
- @CsvBindByName(column = "Номер торгового /клирингового счета/ счета внутреннего учета СПВБ")
- @CsvBindByPosition(position = 6)
+ @BindByName(column = "Номер торгового /клирингового счета/ счета внутреннего учета СПВБ")
+ @BindByPosition(position = 6)
private String account;
- @CsvBindByName(column = "Остаток денежных средств")
- @CsvBindByPosition(position = 7)
- @CsvNumber(value = "#0.00", writeFormat = "#0.00")
+ @BindByName(column = "Остаток денежных средств")
+ @BindByPosition(position = 7)
+ @ReportNumber(value = "#0.00")
private BigDecimal sum;
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyPaymentInstructionRegisterReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/MoneyPaymentInstructionRegisterReport.java
similarity index 57%
rename from clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyPaymentInstructionRegisterReport.java
rename to clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/MoneyPaymentInstructionRegisterReport.java
index ed6ada0a0..87ccd834b 100644
--- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyPaymentInstructionRegisterReport.java
+++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/MoneyPaymentInstructionRegisterReport.java
@@ -1,60 +1,60 @@
-package ru.spcex.clearing.registry.reports.bean;
+package ru.spcex.clearing.registry.reports.report;
-import com.opencsv.bean.CsvBindByName;
-import com.opencsv.bean.CsvBindByPosition;
-import com.opencsv.bean.CsvDate;
-import com.opencsv.bean.CsvNumber;
+import ru.spcex.clearing.registry.annotation.BindByName;
+import ru.spcex.clearing.registry.annotation.BindByPosition;
+import ru.spcex.clearing.registry.annotation.ReportDate;
+import ru.spcex.clearing.registry.annotation.ReportNumber;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class MoneyPaymentInstructionRegisterReport implements FileReport {
- @CsvBindByName(column = "Номер распоряжения")
- @CsvBindByPosition(position = 0)
+ @BindByName(column = "Номер распоряжения")
+ @BindByPosition(position = 0)
private Long number;
- @CsvBindByName(column = "Дата распоряжения")
- @CsvBindByPosition(position = 1)
- @CsvDate(value = "dd.MM.yyyy")
+ @BindByName(column = "Дата распоряжения")
+ @BindByPosition(position = 1)
+ @ReportDate(value = "dd.MM.yyyy")
private LocalDate date;
- @CsvBindByName(column = "Время формирования")
- @CsvBindByPosition(position = 2)
- @CsvDate(value = "HH:mm:ss")
+ @BindByName(column = "Время формирования")
+ @BindByPosition(position = 2)
+ @ReportDate(value = "HH:mm:ss")
private LocalDateTime time;
- @CsvBindByName(column = "Номер торгового банковского/клирингового счета списания")
- @CsvBindByPosition(position = 3)
+ @BindByName(column = "Номер торгового банковского/клирингового счета списания")
+ @BindByPosition(position = 3)
private String accountSender;
- @CsvBindByName(column = "Наименование владельца счета списания")
- @CsvBindByPosition(position = 4)
+ @BindByName(column = "Наименование владельца счета списания")
+ @BindByPosition(position = 4)
private String sender;
- @CsvBindByName(column = "Код владельца счета списания")
- @CsvBindByPosition(position = 5)
+ @BindByName(column = "Код владельца счета списания")
+ @BindByPosition(position = 5)
private String codeSender;
- @CsvBindByName(column = "Номер торгового банковского/клирингового счета зачисления")
- @CsvBindByPosition(position = 6)
+ @BindByName(column = "Номер торгового банковского/клирингового счета зачисления")
+ @BindByPosition(position = 6)
private String accountAddressee;
- @CsvBindByName(column = "Наименование владельца счета зачисления")
- @CsvBindByPosition(position = 7)
+ @BindByName(column = "Наименование владельца счета зачисления")
+ @BindByPosition(position = 7)
private String addressee;
- @CsvBindByName(column = "Код владельца счета зачисления")
- @CsvBindByPosition(position = 8)
+ @BindByName(column = "Код владельца счета зачисления")
+ @BindByPosition(position = 8)
private String codeAddressee;
- @CsvBindByName(column = "Код валюты")
- @CsvBindByPosition(position = 9)
+ @BindByName(column = "Код валюты")
+ @BindByPosition(position = 9)
private String currencyCode;
- @CsvBindByName(column = "Сумма денежных средств")
- @CsvBindByPosition(position = 10)
- @CsvNumber(value = "#0.00", writeFormat = "#0.00")
+ @BindByName(column = "Сумма денежных средств")
+ @BindByPosition(position = 10)
+ @ReportNumber(value = "#0.00")
private BigDecimal sum;
diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java
deleted file mode 100644
index 3527370f0..000000000
--- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package ru.spcex.clearing.registry.service;
-
-import org.apache.kafka.clients.consumer.Consumer;
-import org.apache.kafka.clients.producer.Producer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import ru.clearing.classes.statics.data.company.Company;
-import ru.clearing.classes.statics.data.register.AdmittedLiabilitiesRegister;
-import ru.clearing.classes.statics.data.registry.Registry;
-import ru.clearing.classes.statics.data.security.Security;
-import ru.spcex.clearing.imdg.IMDGDistributedNames;
-import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
-import ru.spcex.clearing.platform.messaging.domain.Consts;
-import ru.spcex.clearing.platform.messaging.domain.cud.registry.AdmittedLiabilitiesRegisterNewRequest;
-import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
-import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
-import ru.spcex.clearing.registry.util.PreClearMap;
-import ru.spcex.platform.enumeration.RegistryDesignation;
-import ru.spcex.platform.enumeration.RegistryInstrumentType;
-import ru.spcex.platform.enumeration.RegistryStatus;
-import ru.spcex.platform.enumeration.RegistryUnit;
-import ru.spcex.platform.imdg.api.Imdg;
-import ru.spcex.platform.imdg.api.ImdgProvider;
-import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector;
-import ru.spcex.platform.utils.validation.IValidator;
-
-import java.time.Instant;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Optional;
-import java.util.function.Function;
-
-import static ru.spcex.platform.enumeration.Task.createRegistry_ADLR;
-
-@Service
-public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate {
- private final Logger log = LoggerFactory.getLogger(getClass());
-
- private final Imdg admittedLiabilitiesRegisterMap;
- private final Imdg registryMap;
- private final Imdg companyMap;
- private final SecuritySelector securitySelector;
- private final Function