diff --git a/clearing-parent/registry-service/README.md b/clearing-parent/registry-service/README.md new file mode 100644 index 000000000..2bf44faa9 --- /dev/null +++ b/clearing-parent/registry-service/README.md @@ -0,0 +1,38 @@ +registry-service +================ + +Описание +-------- +Утилита для создания отчётов за разные даты registry-service. Использует jdbc (прямое соединение с базой) вместо imdg. + +Запуск +------ +java -jar registry-service.jar "--spring.config.location=E:\MFD_GIT_REPO\clearing\registry-service" --report --startDate=24.01.2024 --endDate=31.01.2024 + +#####Параметры запуска +* --service запуск в режиме сервиса (по умолчанию) +* --report запуск для формирования одного отчёта, выключиться по завершении +* --startDate=24.01.2024 в режиме --report дата начала (включительно) +* --endDate=31.01.2024 в режиме --report дата завершения (включительно) + +Для запуска в режиме сервиса надо добавить в настройки параметры кафки. + +Настройки в application.properties. +registry-service.kafka-consumer.* и registry-service.kafka-producer.* не обязательны, если не запускается в режиме --service + +Структура кода +-------------- + +* RegisterUtilityRunner - порядок выгрузки и создания отчётов +* loaders/* - загрузчики данных, почти как MapStore, но грузят все связанные объекты. +* builders/* - построители отчётов +* bean/* - классы, enum + +Соответствие отчётам +-------------------- +executionDepositLoader + executionFondLoader = executionRegisterReportBuilder (contract_register) +depoInstructionLoader = depoPaymentInstructionBuilder (rdc_register) +moneyPaymentInstructionLoader = moneyPaymentInstructionRegisterReportBuilder (prc_register) +moneyBalanceLoader = moneyBalanceRegisterReportBuilder (money_register) +depoBalanceLoader = depoBalanceRegisterReportBuilder (security_register) +registryLoader = liabilitiesRegistryReportBuilder (registry) diff --git a/clearing-parent/registry-service/pom.xml b/clearing-parent/registry-service/pom.xml index fefdbd928..d63c9497c 100644 --- a/clearing-parent/registry-service/pom.xml +++ b/clearing-parent/registry-service/pom.xml @@ -15,46 +15,63 @@ 17 17 5.2.5 + UTF-8 + + ru.spcex.platform platform-messaging + 1.0.0 ru.spcex.platform - platform-imdg-api-hazelcast-impl + platform-enum - ru.spcex.clearing - classes + ru.spcex.platform + platform-classes-base + + + + org.springframework.boot spring-boot-starter - com.fasterxml.jackson.core - jackson-databind + org.springframework + spring-jdbc + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.springframework.boot + spring-boot-starter-data-ldap org.springframework.integration spring-integration-sftp + + - org.springframework.boot - spring-boot-starter-test - test + com.mchange + c3p0 + 0.9.5.5 - ru.spcex.clearing - dictionary - - - ru.spcex.clearing - test-clearing - test + org.postgresql + postgresql @@ -76,7 +93,56 @@ ${poi.version} - + + + ru.spcex.clearing + test-clearing + test + + + org.junit.jupiter + junit-jupiter + test + + + org.mockito + mockito-core + test + + + org.springframework.boot + spring-boot-test + test + + + org.springframework.boot + spring-boot-starter-test + test + + + com.h2database + h2 + test + + + + + org.slf4j + slf4j-api + + + ch.qos.logback + logback-classic + + + com.fasterxml.jackson.core + jackson-databind + + + org.apache.commons + commons-lang3 + 3.7 + net.logstash.logback logstash-logback-encoder diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/RegistryServiceApplication.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/RegistryServiceApplication.java index 5f596d2bd..4700ce559 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/RegistryServiceApplication.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/RegistryServiceApplication.java @@ -1,12 +1,60 @@ package ru.spcex.clearing.registry; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; +import ru.spcex.clearing.registry.service.RegisterUtilityRunner; +import ru.spcex.clearing.registry.service.RegisterUtilityService; +import java.util.Arrays; + +/** + * Параметры запуска: + * --service запуск как сервис (по умолчанию); + * --report запустить один раз, выполнить все отчёты и завершиться. + */ @SpringBootApplication -public class RegistryServiceApplication { +public class RegistryServiceApplication implements CommandLineRunner { + final Logger log = LoggerFactory.getLogger(getClass()); + private final RegisterUtilityRunner runner; + @Autowired + ConfigurableApplicationContext context; + + public RegistryServiceApplication(RegisterUtilityRunner runner) { + this.runner = runner; + } + public static void main(String[] args) { - SpringApplication springApplication = new SpringApplication(RegistryServiceApplication.class); - springApplication.run(args); + SpringApplication.run(RegistryServiceApplication.class, args); + } + + @Override + public void run(String... args) throws InterruptedException { + log.info("{} start with CMD: \"{}\"", this.getClass().getSimpleName(), Arrays.toString(args)); + log.info("Available CMD option: --report or --service"); + boolean asService = true; + for (String arg : args) { + if ("--service".equalsIgnoreCase(arg)) + asService = true; + if ("--report".equalsIgnoreCase(arg)) + asService = false; + } + try { + if (!asService) { + log.info("Запуск всех отчётов."); + runner.process(); + } else { + log.info("Запуск в режиме ожидания команд, как сервис."); + RegisterUtilityService service = context.getBean(RegisterUtilityService.class); + } + } catch (Throwable e) { + log.error("{}", ExceptionUtils.getStackTrace(e)); + throw e; + } } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/BindByName.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/BindByName.java new file mode 100644 index 000000000..a95db0d4b --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/BindByName.java @@ -0,0 +1,12 @@ +package ru.spcex.clearing.registry.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface BindByName { + String column(); +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/BindByPosition.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/BindByPosition.java new file mode 100644 index 000000000..86d629123 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/BindByPosition.java @@ -0,0 +1,12 @@ +package ru.spcex.clearing.registry.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface BindByPosition { + int position(); +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/ReportDate.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/ReportDate.java new file mode 100644 index 000000000..19fba754b --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/ReportDate.java @@ -0,0 +1,12 @@ +package ru.spcex.clearing.registry.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface ReportDate { + String value() default "yyyyMMdd'T'HHmmss"; +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/ReportNumber.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/ReportNumber.java new file mode 100644 index 000000000..821e09255 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/ReportNumber.java @@ -0,0 +1,12 @@ +package ru.spcex.clearing.registry.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface ReportNumber { + String value(); +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/BeanConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/BeanConfig.java new file mode 100644 index 000000000..74838b877 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/BeanConfig.java @@ -0,0 +1,57 @@ +package ru.spcex.clearing.registry.conf; + +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.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.clearing.registry.exceptions.ConfigurationException; +import ru.spcex.clearing.registry.service.RegisterUtilityRunner; +import ru.spcex.clearing.registry.service.RegisterUtilityService; + +import java.io.File; + +@Configuration +public class BeanConfig { + Logger log = LoggerFactory.getLogger(getClass()); + + @Bean("outFolder") + public File outFolder(AProperties properties) { + File outFolder = new File(properties.getOutFolder()); + if (outFolder.exists() && !outFolder.isDirectory()) + throw new ConfigurationException("Путь %s не является директорией".formatted(properties.getOutFolder())); + if (!outFolder.exists()) { + boolean mkdirs = outFolder.mkdirs(); + if (!mkdirs) throw new ConfigurationException("Не удалось создать директорию для отчетов"); + } + return outFolder; + } + + @Autowired(required = false) + @Lazy + @Bean + public RegisterUtilityService RegisterUtilityService(RegisterUtilityRunner runner, + AProperties properties, CmdArgsParser cmdArgsParser, + Consumer kafkaQueue, + Producer kafkaResponseQueue) { + if (kafkaQueue == null) { + log.info("KafkaQueue was not configured."); + return null; + } + if (kafkaResponseQueue == null) { + log.info("kafkaResponseQueue was not configured."); + return null; + } + if (runner == null) + throw new IllegalStateException("Required bean RegisterUtilityRunner"); + if (properties == null) + throw new IllegalStateException("Required bean AProperties"); + RegisterUtilityService service = new RegisterUtilityService(runner, properties, cmdArgsParser, + kafkaQueue, kafkaResponseQueue); + return service; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/CmdArgsParser.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/CmdArgsParser.java new file mode 100644 index 000000000..ac150836d --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/CmdArgsParser.java @@ -0,0 +1,76 @@ +package ru.spcex.clearing.registry.conf; + +import org.springframework.boot.ApplicationArguments; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.conf.properties.PeriodProperties; +import ru.spcex.clearing.registry.exceptions.CmdArgsParserException; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Set; + +@Component +public class CmdArgsParser { + private final ApplicationArguments applicationArguments; + public final String START_DATE_OPTION = "startDate"; + public final String END_DATE_OPTION = "endDate"; + + public CmdArgsParser(ApplicationArguments applicationArguments) { + this.applicationArguments = applicationArguments; + } + + public PeriodProperties parsePeriodProperties() { + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); + Set optionNames = applicationArguments.getOptionNames(); + PeriodProperties periodProperties = new PeriodProperties(); + String startDateStr; + String endDateStr; + for (String option : optionNames) { + if (option.equalsIgnoreCase(START_DATE_OPTION)) { + if (periodProperties.getStartDate() != null) throw new CmdArgsParserException("Более одной опции --start"); + List optionValues = applicationArguments.getOptionValues(option); + if (optionValues.size() != 1) + throw new CmdArgsParserException("Для опции --"+START_DATE_OPTION+" должно быть указано одно значение в формате ДД.ММ.ГГГГ"); + startDateStr = optionValues.iterator().next(); + try { + LocalDate startDate = LocalDate.parse(startDateStr, dateFormatter); + periodProperties.setStartDate(startDate); + } catch (Exception e) { + throw new CmdArgsParserException("Опция --"+START_DATE_OPTION+" должна быть указана в формате ДД.ММ.ГГГГ"); + } + } + if (option.equalsIgnoreCase(END_DATE_OPTION)) { + if (periodProperties.getEndDate() != null) throw new CmdArgsParserException("Более одной опции --end"); + List optionValues = applicationArguments.getOptionValues(option); + if (optionValues.size() != 1) + throw new CmdArgsParserException("Для опции --"+END_DATE_OPTION+" должно быть указано одно значение в формате ДД.ММ.ГГГГ"); + endDateStr = optionValues.iterator().next(); + try { + LocalDate endDate = LocalDate.parse(endDateStr, dateFormatter); + periodProperties.setEndDate(endDate); + } catch (Exception e) { + throw new CmdArgsParserException("Опция --"+END_DATE_OPTION+" должна быть указана в формате ДД.ММ.ГГГГ"); + } + } + } + if (periodProperties.getStartDate() == null && periodProperties.getEndDate() == null) { + periodProperties.setStartDate(LocalDate.now()); + periodProperties.setEndDate(LocalDate.now()); + } + if (periodProperties.getEndDate() == null) periodProperties.setEndDate(periodProperties.getStartDate()); + validatePeriodProperties(periodProperties); + + return periodProperties; + } + + public void validatePeriodProperties(PeriodProperties periodProperties) throws CmdArgsParserException { + if (periodProperties.getStartDate()==null) + throw new CmdArgsParserException("Дата " + START_DATE_OPTION + " должна быть указана."); + if (periodProperties.getEndDate()==null) + throw new CmdArgsParserException("Дата " + END_DATE_OPTION + " должна быть указана."); + if (periodProperties.getStartDate().isAfter(periodProperties.getEndDate())) { + throw new CmdArgsParserException("Дата " + START_DATE_OPTION + "=" + periodProperties.getStartDate() + " должна быть до " + END_DATE_OPTION + "=" + periodProperties.getEndDate()); + } + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/DBConfiguration.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/DBConfiguration.java new file mode 100644 index 000000000..e23c4116e --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/DBConfiguration.java @@ -0,0 +1,36 @@ +package ru.spcex.clearing.registry.conf; + +import com.mchange.v2.c3p0.ComboPooledDataSource; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.clearing.registry.conf.properties.DevProperties; + +import javax.sql.DataSource; +import java.beans.PropertyVetoException; + +@Configuration +public class DBConfiguration { + + @Bean("indicJdbcTemplate") + public NamedParameterJdbcTemplate indicJdbcTemplate(@Qualifier("clearingDataSource") DataSource indicDataSource) { + return new NamedParameterJdbcTemplate(indicDataSource); + } + + @Bean("clearingDataSource") + public DataSource indicDataSource(AProperties properties, DevProperties devProperties) throws PropertyVetoException { + ComboPooledDataSource clearingDataSource = new ComboPooledDataSource(); + clearingDataSource.setDriverClass(properties.getDbClearing().getDriver()); + clearingDataSource.setJdbcUrl(properties.getDbClearing().getUrl()); + clearingDataSource.setUser(properties.getDbClearing().getUsername()); + clearingDataSource.setPassword(properties.getDbClearing().getPassword()); + clearingDataSource.setAcquireIncrement(devProperties.getC3p0AcquireIncrement()); + clearingDataSource.setInitialPoolSize(devProperties.getC3p0InitialPoolSize()); + clearingDataSource.setMinPoolSize(devProperties.getC3p0MinPoolSize()); + clearingDataSource.setMaxPoolSize(devProperties.getC3p0MaxPoolSize()); + return clearingDataSource; + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/KafkaConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/KafkaConfig.java new file mode 100644 index 000000000..efbc424ec --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/KafkaConfig.java @@ -0,0 +1,59 @@ +package ru.spcex.clearing.registry.conf; + +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.core.ProducerFactory; +import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory; +import ru.spcex.clearing.platform.messaging.config.KafkaProducerFactory; +import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings; +import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings; +import ru.spcex.clearing.registry.conf.properties.AProperties; + +@Configuration +public class KafkaConfig { + @Autowired + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + @Bean + public Consumer createConsumer(AProperties settings) { + KafkaConsumerSettings kafkaSettings = settings.getKafkaConsumer(); + if (kafkaSettings == null || kafkaSettings.getBootstrapServers() == null) { + return null; + } + return KafkaConsumerFactory.consumer(kafkaSettings); + } + + @Autowired + @Bean + public Producer createProducer(AProperties settings) { + KafkaProducerSettings kafkaSettings = settings.getKafkaProducer(); + if (kafkaSettings == null || kafkaSettings.getBootstrapServers() == null) { + return null; + } + return KafkaProducerFactory.producer(kafkaSettings); + } + + @Autowired + @Bean + public ProducerFactory pf(AProperties settings) { + KafkaProducerSettings kafkaSettings = settings.getKafkaProducer(); + if (kafkaSettings == null || kafkaSettings.getBootstrapServers() == null) { + return null; + } + return KafkaProducerFactory.producerFactory(kafkaSettings); + } + + @Autowired(required = false) + @Bean + public KafkaTemplate kafkaTemplate(ProducerFactory pf) { + if (pf == null) + return null; + return new KafkaTemplate<>(pf); + } + +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/SFTPReportsConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/SFTPReportsConfig.java new file mode 100644 index 000000000..de4bdaa5f --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/SFTPReportsConfig.java @@ -0,0 +1,127 @@ +package ru.spcex.clearing.registry.conf; + +import com.jcraft.jsch.ChannelSftp; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.expression.common.LiteralExpression; +import org.springframework.integration.annotation.Gateway; +import org.springframework.integration.annotation.MessagingGateway; +import org.springframework.integration.annotation.ServiceActivator; +import org.springframework.integration.channel.DirectChannel; +import org.springframework.integration.dsl.IntegrationFlow; +import org.springframework.integration.dsl.IntegrationFlows; +import org.springframework.integration.file.remote.session.CachingSessionFactory; +import org.springframework.integration.file.remote.session.SessionFactory; +import org.springframework.integration.sftp.gateway.SftpOutboundGateway; +import org.springframework.integration.sftp.outbound.SftpMessageHandler; +import org.springframework.integration.sftp.session.DefaultSftpSessionFactory; +import org.springframework.integration.sftp.session.SftpFileInfo; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.MessageHandler; +import ru.spcex.clearing.registry.conf.properties.AProperties; + +import java.io.File; +import java.util.List; + +import static org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway.Command.LS; + +//@Configuration +public class SFTPReportsConfig { +// protected Logger log = LoggerFactory.getLogger(getClass()); +// private final AProperties settings; +// +// @Autowired(required = false) +// public SFTPReportsConfig(AProperties settings) { +// this.settings = settings; +// } +// +// @Bean("reportsSftpSessionFactory") +// public SessionFactory sftpSessionFactory() { +// if (settings.getReportsStore()==null) { +// log.info("SFTP reports-store not set in config. Disabled."); +// return null; +// } +// DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true); +// factory.setHost(settings.getReportsStore().getServerIp()); +// factory.setPort(settings.getReportsStore().getServerPort()); +// factory.setUser(settings.getReportsStore().getUser()); +// factory.setPassword(settings.getReportsStore().getPassword()); +// factory.setAllowUnknownKeys(true); +// return new CachingSessionFactory<>(factory); +// } +// +// @Bean("reportsSftpHandler") +// @Autowired(required = false) +// @ServiceActivator(inputChannel = "reportsToSftpChannel") +// public MessageHandler handler(@Qualifier("reportsSftpSessionFactory") SessionFactory sessionFactory) { +// if (sessionFactory == null || settings.getReportsStore()==null) { +// log.info("reportsToSftpChannel disabled."); +// return null; +// } +// SftpMessageHandler handler = new SftpMessageHandler(sessionFactory); +// handler.setRemoteDirectoryExpression(new LiteralExpression(settings.getReportsStore().getOutDir())); +// log.info("Configure sftp output directory \"{}\"", settings.getReportsStore().getOutDir()); +// handler.setAutoCreateDirectory(true); +// handler.setFileNameGenerator(message -> { +// if (message.getPayload() instanceof File) { +// return ((File) message.getPayload()).getName(); +// } else { +// throw new IllegalArgumentException("File must expected as payload."); +// } +// }); +// return handler; +// } +// +// @Autowired(required = false) +// @Bean("reportsListSftpChannel") +// public MessageChannel listSftpChannel(@Qualifier("reportsSftpHandlerList") MessageHandler handler) { +// if (handler==null) +// return null; +// DirectChannel dc = new DirectChannel(); +// dc.subscribe(handler); +// return dc; +// } +// +// @Autowired(required = false) +// @Bean("reportsToSftpChannel") +// public MessageChannel toSftpChannel(@Qualifier("reportsSftpHandler") MessageHandler handler) { +// if (handler==null) +// return null; +// DirectChannel dc = new DirectChannel(); +// dc.subscribe(handler); +// return dc; +// } +// +// @Autowired(required = false) +// @Bean("reportsSftpHandlerList") +// @ServiceActivator(inputChannel = "reportsListSftpChannel") +// public MessageHandler handlerList(@Qualifier("reportsSftpSessionFactory") SessionFactory sessionFactory) { +// if (sessionFactory==null) +// return null; +// String expression = "'/%s'".formatted(settings.getReportsStore().getOutDir()); +// return new SftpOutboundGateway(sessionFactory, LS.getCommand(), expression); +// } +// +// @Autowired(required = false) +// @Bean("reportsSftpOutboundListFlow") +// public IntegrationFlow sftpOutboundListFlow(@Qualifier("reportsSftpSessionFactory") SessionFactory sessionFactory) { +// if (sessionFactory==null) +// return null; +// return IntegrationFlows.from("reportsListSftpChannel") +// .handle(new SftpOutboundGateway(sessionFactory, "ls", "payload")) +// .get(); +// } +// + @MessagingGateway(name = "reportsSftpGateway") + public interface ReportsGateway { + @Gateway(requestChannel = "reportsToSftpChannel") + void sendToSftp(File file); + + @Gateway(requestChannel = "reportsListSftpChannel") + List listFiles(String dir); + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/AProperties.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/AProperties.java new file mode 100644 index 000000000..0b71a626d --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/AProperties.java @@ -0,0 +1,78 @@ +package ru.spcex.clearing.registry.conf.properties; + +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings; +import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings; +import ru.spcex.clearing.registry.conf.CmdArgsParser; + +@Configuration +@ConfigurationProperties(prefix = "registry-service") +@PropertySource(value = {"file:${spring.config.location}/application.properties"}) +public class AProperties { + private DBProperties dbClearing; + private PeriodProperties period; + private ReportsStore reportsStore; // localTempDir + + private KafkaConsumerSettings kafkaConsumer; + private KafkaProducerSettings kafkaProducer; + + @Value("${registry-service.outFolder}") + private String outFolder; + + public AProperties(CmdArgsParser argsParser) { + period = argsParser.parsePeriodProperties(); + LoggerFactory.getLogger(getClass()).info("Period from CMD: {}", period); + } + + public DBProperties getDbClearing() { + return dbClearing; + } + + public void setDbClearing(DBProperties dbClearing) { + this.dbClearing = dbClearing; + } + + public PeriodProperties getPeriod() { + return period; + } + + public void setPeriod(PeriodProperties period) { + this.period = period; + } + + public String getOutFolder() { + return outFolder; + } + + public void setOutFolder(String outFolder) { + this.outFolder = outFolder; + } + + public ReportsStore getReportsStore() { + return reportsStore; + } + + public void setReportsStore(ReportsStore reportsStore) { + this.reportsStore = reportsStore; + } + + public KafkaConsumerSettings getKafkaConsumer() { + return kafkaConsumer; + } + + public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) { + this.kafkaConsumer = kafkaConsumer; + } + + public KafkaProducerSettings getKafkaProducer() { + return kafkaProducer; + } + + public void setKafkaProducer(KafkaProducerSettings kafkaProducer) { + this.kafkaProducer = kafkaProducer; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/DBProperties.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/DBProperties.java new file mode 100644 index 000000000..06aa27a90 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/DBProperties.java @@ -0,0 +1,40 @@ +package ru.spcex.clearing.registry.conf.properties; + +public class DBProperties { + private String url; + private String driver; + private String username; + private String password; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getDriver() { + return driver; + } + + public void setDriver(String driver) { + this.driver = driver; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/DevProperties.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/DevProperties.java new file mode 100644 index 000000000..3ee16f968 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/DevProperties.java @@ -0,0 +1,48 @@ +package ru.spcex.clearing.registry.conf.properties; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +@Configuration +@ConfigurationProperties(prefix = "registry-service.dev") +@PropertySource(value = "classpath:dev.properties") +public class DevProperties { + private int c3p0MinPoolSize; + private int c3p0MaxPoolSize; + private int c3p0InitialPoolSize; + private int c3p0AcquireIncrement; + + + public int getC3p0MinPoolSize() { + return c3p0MinPoolSize; + } + + public void setC3p0MinPoolSize(int c3p0MinPoolSize) { + this.c3p0MinPoolSize = c3p0MinPoolSize; + } + + public int getC3p0MaxPoolSize() { + return c3p0MaxPoolSize; + } + + public void setC3p0MaxPoolSize(int c3p0MaxPoolSize) { + this.c3p0MaxPoolSize = c3p0MaxPoolSize; + } + + public int getC3p0InitialPoolSize() { + return c3p0InitialPoolSize; + } + + public void setC3p0InitialPoolSize(int c3p0InitialPoolSize) { + this.c3p0InitialPoolSize = c3p0InitialPoolSize; + } + + public int getC3p0AcquireIncrement() { + return c3p0AcquireIncrement; + } + + public void setC3p0AcquireIncrement(int c3p0AcquireIncrement) { + this.c3p0AcquireIncrement = c3p0AcquireIncrement; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/PeriodProperties.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/PeriodProperties.java new file mode 100644 index 000000000..edc5e964e --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/PeriodProperties.java @@ -0,0 +1,29 @@ +package ru.spcex.clearing.registry.conf.properties; + +import java.time.LocalDate; + +public class PeriodProperties { + private LocalDate startDate; + private LocalDate endDate; + + public LocalDate getStartDate() { + return startDate; + } + + public void setStartDate(LocalDate startDate) { + this.startDate = startDate; + } + + public LocalDate getEndDate() { + return endDate; + } + + public void setEndDate(LocalDate endDate) { + this.endDate = endDate; + } + + @Override + public String toString() { + return "[startDate=" + startDate + ", endDate=" + endDate + "]"; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/settings/ReportsStore.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/ReportsStore.java similarity index 81% rename from clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/settings/ReportsStore.java rename to clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/ReportsStore.java index 4415f3abf..318dcd746 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/settings/ReportsStore.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/ReportsStore.java @@ -1,8 +1,8 @@ -package ru.spcex.clearing.registry.config.settings; +package ru.spcex.clearing.registry.conf.properties; public class ReportsStore { private String outDir; - private String localTempDir; +// private String localTempDir; private String user; private String password; private String serverIp; @@ -58,11 +58,4 @@ public class ReportsStore { this.outDir = outDir; } - public String getLocalTempDir() { - return localTempDir; - } - - public void setLocalTempDir(String localTempDir) { - this.localTempDir = localTempDir; - } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/KafkaConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/KafkaConfig.java deleted file mode 100644 index 30c26317b..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/KafkaConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package ru.spcex.clearing.registry.config; - -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.producer.Producer; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; -import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory; -import ru.spcex.clearing.platform.messaging.config.KafkaProducerFactory; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; - -@Configuration -public class KafkaConfig { - @Autowired - @Bean - @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) - public Consumer createConsumer(RegistryServiceSettings settings) { - return KafkaConsumerFactory.consumer(settings.getKafkaConsumer()); - } - - @Autowired - @Bean - public Producer createProducer(RegistryServiceSettings settings) { - return KafkaProducerFactory.producer(settings.getKafkaProducer()); - } - -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/RegistryServiceConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/RegistryServiceConfig.java deleted file mode 100644 index e3239957e..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/RegistryServiceConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package ru.spcex.clearing.registry.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; - -import java.io.File; - -@Configuration -public class RegistryServiceConfig { - @Bean("reportOutDir") - public File outDir(RegistryServiceSettings settings) { - File outFolder = new File(settings.getReportsStore().getLocalTempDir()); - if (!outFolder.exists()) { - boolean mkDirOk = outFolder.mkdirs(); - if (!mkDirOk) throw new IllegalStateException("Can't create output directory for reports, registry-service was terminated"); - } else if (!outFolder.isDirectory()) { - throw new IllegalStateException("Output reports path from settings is not directory!"); - } - return outFolder; - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/RegistryServiceImdgConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/RegistryServiceImdgConfig.java deleted file mode 100644 index a9c630a41..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/RegistryServiceImdgConfig.java +++ /dev/null @@ -1,47 +0,0 @@ -package ru.spcex.clearing.registry.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; - -@Configuration -public class RegistryServiceImdgConfig { - private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) { - ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); - if (maxPoolSz > 2) { - pool.setKeepAliveSeconds(60); - pool.setAllowCoreThreadTimeOut(true); - } - pool.setCorePoolSize(maxPoolSz); - pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion); - return pool; - } - - @Bean(name = "taskExecutorHazelcastClientInitializer") - public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() { - return createThreadPoolTaskExecutor(1, true); - } - - @Bean(name = "taskExecutorIdGeneratorAwaiter") - public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() { - return createThreadPoolTaskExecutor(1, false); - } - - @Autowired - @Bean - public ImdgProvider imdgProvider( - @Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, - @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, - RegistryServiceSettings settings - ) { - return new HazelcastService(taskExecutorHazelcastClientInitializer, - taskExecutorIdGeneratorAwaiter, - settings.getHazelcast()); - } - -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/SFTPReportsConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/SFTPReportsConfig.java deleted file mode 100644 index 12d1be495..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/SFTPReportsConfig.java +++ /dev/null @@ -1,104 +0,0 @@ -package ru.spcex.clearing.registry.config; - -import com.jcraft.jsch.ChannelSftp; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.expression.common.LiteralExpression; -import org.springframework.integration.annotation.Gateway; -import org.springframework.integration.annotation.MessagingGateway; -import org.springframework.integration.annotation.ServiceActivator; -import org.springframework.integration.channel.DirectChannel; -import org.springframework.integration.dsl.IntegrationFlow; -import org.springframework.integration.dsl.IntegrationFlows; -import org.springframework.integration.file.remote.session.CachingSessionFactory; -import org.springframework.integration.file.remote.session.SessionFactory; -import org.springframework.integration.sftp.gateway.SftpOutboundGateway; -import org.springframework.integration.sftp.outbound.SftpMessageHandler; -import org.springframework.integration.sftp.session.DefaultSftpSessionFactory; -import org.springframework.integration.sftp.session.SftpFileInfo; -import org.springframework.messaging.MessageChannel; -import org.springframework.messaging.MessageHandler; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; - -import java.io.File; -import java.util.List; - -import static org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway.Command.LS; - -@Configuration -public class SFTPReportsConfig { - protected Logger log = LoggerFactory.getLogger(getClass()); - private final RegistryServiceSettings settings; - - public SFTPReportsConfig(RegistryServiceSettings settings) { - this.settings = settings; - } - - @Bean("reportsSftpSessionFactory") - public SessionFactory sftpSessionFactory() { - DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true); - factory.setHost(settings.getReportsStore().getServerIp()); - factory.setPort(settings.getReportsStore().getServerPort()); - factory.setUser(settings.getReportsStore().getUser()); - factory.setPassword(settings.getReportsStore().getPassword()); - factory.setAllowUnknownKeys(true); - return new CachingSessionFactory<>(factory); - } - - @Bean("reportsSftpHandler") - @ServiceActivator(inputChannel = "reportsToSftpChannel") - public MessageHandler handler(@Qualifier("reportsSftpSessionFactory") SessionFactory sessionFactory) { - SftpMessageHandler handler = new SftpMessageHandler(sessionFactory); - handler.setRemoteDirectoryExpression(new LiteralExpression(settings.getReportsStore().getOutDir())); - log.info("Configure sftp output directory \"{}\"", settings.getReportsStore().getOutDir()); - handler.setAutoCreateDirectory(true); - handler.setFileNameGenerator(message -> { - if (message.getPayload() instanceof File) { - return ((File) message.getPayload()).getName(); - } else { - throw new IllegalArgumentException("File must expected as payload."); - } - }); - return handler; - } - - @Bean("reportsListSftpChannel") - public MessageChannel listSftpChannel(@Qualifier("reportsSftpHandlerList") MessageHandler handler) { - DirectChannel dc = new DirectChannel(); - dc.subscribe(handler); - return dc; - } - - @Bean("reportsToSftpChannel") - public MessageChannel toSftpChannel(@Qualifier("reportsSftpHandler") MessageHandler handler) { - DirectChannel dc = new DirectChannel(); - dc.subscribe(handler); - return dc; - } - - @Bean("reportsSftpHandlerList") - @ServiceActivator(inputChannel = "reportsListSftpChannel") - public MessageHandler handlerList(@Qualifier("reportsSftpSessionFactory") SessionFactory sessionFactory) { - String expression = "'/%s'".formatted(settings.getReportsStore().getOutDir()); - return new SftpOutboundGateway(sessionFactory, LS.getCommand(), expression); - } - - @Bean("reportsSftpOutboundListFlow") - public IntegrationFlow sftpOutboundListFlow(@Qualifier("reportsSftpSessionFactory") SessionFactory sessionFactory) { - return IntegrationFlows.from("reportsListSftpChannel") - .handle(new SftpOutboundGateway(sessionFactory, "ls", "payload")) - .get(); - } - - @MessagingGateway(name = "reportsSftpGateway") - public interface ReportsGateway { - @Gateway(requestChannel = "reportsToSftpChannel") - void sendToSftp(File file); - - @Gateway(requestChannel = "reportsListSftpChannel") - List listFiles(String dir); - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/ValidationConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/ValidationConfig.java deleted file mode 100644 index 7bbaca4fc..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/ValidationConfig.java +++ /dev/null @@ -1,26 +0,0 @@ -package ru.spcex.clearing.registry.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import ru.spcex.clearing.registry.validation.ValuesOfMapNonNullRule; -import ru.spcex.platform.imdg.validation.ImdgValidationContext; -import ru.spcex.platform.utils.validation.IValidator; -import ru.spcex.platform.utils.validation.ValidatorImpl; - -import java.util.Map; -import java.util.function.Function; - -@Configuration -public class ValidationConfig { - - @Bean("fieldValuesValidator") - public Function, IValidator> fieldValuesValidator() { - return map -> { - ImdgValidationContext> context = new ImdgValidationContext<>(); - context.setValidatedObject(map); - return new ValidatorImpl<>(context, - new ValuesOfMapNonNullRule() - ); - }; - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/settings/RegistryServiceSettings.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/settings/RegistryServiceSettings.java deleted file mode 100644 index 439d99cbb..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/settings/RegistryServiceSettings.java +++ /dev/null @@ -1,59 +0,0 @@ -package ru.spcex.clearing.registry.config.settings; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.PropertySource; -import org.springframework.stereotype.Component; -import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings; -import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings; -import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; - -@Component -@PropertySource("file:${spring.config.location}/application.properties") -@ConfigurationProperties("registry-service") -public class RegistryServiceSettings { - private HazelcastClientParams hazelcast; - private KafkaConsumerSettings kafkaConsumer; - private KafkaProducerSettings kafkaProducer; - private ReportsStore reportsStore; - private boolean csvMode = false; - - public HazelcastClientParams getHazelcast() { - return hazelcast; - } - - public void setHazelcast(HazelcastClientParams hazelcast) { - this.hazelcast = hazelcast; - } - - public KafkaConsumerSettings getKafkaConsumer() { - return kafkaConsumer; - } - - public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) { - this.kafkaConsumer = kafkaConsumer; - } - - public KafkaProducerSettings getKafkaProducer() { - return kafkaProducer; - } - - public void setKafkaProducer(KafkaProducerSettings kafkaProducer) { - this.kafkaProducer = kafkaProducer; - } - - public ReportsStore getReportsStore() { - return reportsStore; - } - - public void setReportsStore(ReportsStore reportsStore) { - this.reportsStore = reportsStore; - } - - public boolean isCsvMode() { - return csvMode; - } - - public void setCsvMode(boolean csvMode) { - this.csvMode = csvMode; - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/exceptions/CmdArgsParserException.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/exceptions/CmdArgsParserException.java new file mode 100644 index 000000000..cb7ff0b69 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/exceptions/CmdArgsParserException.java @@ -0,0 +1,9 @@ +package ru.spcex.clearing.registry.exceptions; + +public class CmdArgsParserException extends RuntimeException { + public CmdArgsParserException(String message) { + super(message); + } + public CmdArgsParserException() { + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/exceptions/ConfigurationException.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/exceptions/ConfigurationException.java new file mode 100644 index 000000000..a0af402b9 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/exceptions/ConfigurationException.java @@ -0,0 +1,7 @@ +package ru.spcex.clearing.registry.exceptions; + +public class ConfigurationException extends RuntimeException { + public ConfigurationException(String message) { + super(message); + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/ReportUtils.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/ReportUtils.java index 4bf999f7c..91e202e88 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/ReportUtils.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/ReportUtils.java @@ -2,17 +2,38 @@ package ru.spcex.clearing.registry.reports; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; +import ru.spcex.clearing.registry.conf.SFTPReportsConfig; import java.io.File; +import java.sql.Date; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.time.Instant; +import java.time.LocalDate; import java.util.Collection; public class ReportUtils { private final static Logger log = LoggerFactory.getLogger(ReportUtils.class); + public static Instant getInstantFromTimestamp(ResultSet rs, String column) throws SQLException { + Timestamp date = rs.getTimestamp(column); + return date != null ? date.toInstant() : null; + } + + public static LocalDate getLocalDateFromSqlDate(ResultSet rs, String column) throws SQLException { + Date date = rs.getDate(column); + return date != null ? date.toLocalDate() : null; + } + public static void sendFilesToSftp(Collection files, SFTPReportsConfig.ReportsGateway reportsGateway, boolean deleteAfterSend) { + if (reportsGateway == null) { + log.debug("SFTP disabled. Do not send files."); + return; + } + log.debug("Send file {} to SFTP...", files); for (File file : files) { reportsGateway.sendToSftp(file); if (deleteAfterSend) { @@ -23,6 +44,4 @@ public class ReportUtils { } } } - - } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/AbstractDictionary.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/AbstractDictionary.java new file mode 100644 index 000000000..1c87b41f1 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/AbstractDictionary.java @@ -0,0 +1,35 @@ +package ru.spcex.clearing.registry.reports.bean; + +public abstract class AbstractDictionary extends SpcexDBBase implements Dictionary { + protected String code; + protected String name; + + @Override + public String getCode() { + return code; + } + + @Override + public void setCode(String code) { + this.code = code; + } + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "id=" + id + + ", code='" + code + '\'' + + ", name='" + name + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Account.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Account.java new file mode 100644 index 000000000..b022e3198 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Account.java @@ -0,0 +1,31 @@ +package ru.spcex.clearing.registry.reports.bean; + +public class Account { + private Long id; + private String account; + private String accountType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getAccountType() { + return accountType; + } + + public void setAccountType(String accountType) { + this.accountType = accountType; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/AllowedDictionary.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/AllowedDictionary.java new file mode 100644 index 000000000..db97a00d7 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/AllowedDictionary.java @@ -0,0 +1,7 @@ +package ru.spcex.clearing.registry.reports.bean; + +/** + * Database table: ALLOWED_DICTIONARY + */ +public class AllowedDictionary extends AbstractDictionary { +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/BusinessEvent.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/BusinessEvent.java new file mode 100644 index 000000000..4b8292990 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/BusinessEvent.java @@ -0,0 +1,48 @@ +package ru.spcex.clearing.registry.reports.bean; + +import java.time.Instant; + +public abstract class BusinessEvent extends SpcexDBBase { + + private Instant eventTime; + private Long userId; + private String eventType; + + public Instant getEventTime() { + return eventTime; + } + + public void setEventTime(Instant eventTime) { + this.eventTime = eventTime; + } + + public String getEventType() { + return eventType; + } + + public void setEventType(String eventType) { + this.eventType = eventType; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public abstract T getObject(); + + public abstract void setObject(T object); + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "eventTime=" + eventTime + + "eventType=" + eventType + + ", userId=" + userId + + ", object=" + getObject() + + '}'; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/BusinessObject.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/BusinessObject.java new file mode 100644 index 000000000..327b52b8c --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/BusinessObject.java @@ -0,0 +1,27 @@ +package ru.spcex.clearing.registry.reports.bean; + +import java.time.Instant; + +/** + * UUID - Long based with field object + */ +public abstract class BusinessObject extends SpcexDBBase { + private Instant created; + private Instant updated; + + public Instant getCreated() { + return created; + } + + public void setCreated(Instant created) { + this.created = created; + } + + public Instant getUpdated() { + return updated; + } + + public void setUpdated(Instant updated) { + this.updated = updated; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Company.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Company.java new file mode 100644 index 000000000..a5b05fad4 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Company.java @@ -0,0 +1,31 @@ +package ru.spcex.clearing.registry.reports.bean; + +public class Company { + private Long id; + private String clearingCode; + private String shortName; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getClearingCode() { + return clearingCode; + } + + public void setClearingCode(String clearingCode) { + this.clearingCode = clearingCode; + } + + public String getShortName() { + return shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/CompanySymbol.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/CompanySymbol.java new file mode 100644 index 000000000..eae510af3 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/CompanySymbol.java @@ -0,0 +1,36 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.helpers.IEnumKey; + +public enum CompanySymbol implements IEnumKey { + OCVD("OCVD"), + CPP("CPP"), + OCPO("OCPO"), + OGRN("OGRN"), + INN("INN"), + BIC("BIC"), + CIO("CIO"), + UUID("UUID"), + TRDC("TRDC"), + CLRC("CLRC"), + INTC("INTC"), + RGRC("RGRC"), + LICB("LICB"), + LICR("LICR"), + LICD("LICD"), + LICT("LICT"), + LICC("LICC"), + LICF("LICF"), + ; + + private final String key; + + CompanySymbol(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/CompanySymbols.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/CompanySymbols.java new file mode 100644 index 000000000..8d6cb4ce3 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/CompanySymbols.java @@ -0,0 +1,34 @@ +package ru.spcex.clearing.registry.reports.bean; + +/** + * DB: COMPANY_SYMBOLS + */ +public class CompanySymbols extends SpcexDBBase { + private Long companyId; + private String companySymbol; + private String companySymbolValue; + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } + + public String getCompanySymbol() { + return companySymbol; + } + + public void setCompanySymbol(String companySymbol) { + this.companySymbol = companySymbol; + } + + public String getCompanySymbolValue() { + return companySymbolValue; + } + + public void setCompanySymbolValue(String companySymbolValue) { + this.companySymbolValue = companySymbolValue; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Dictionary.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Dictionary.java new file mode 100644 index 000000000..2b44f0134 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Dictionary.java @@ -0,0 +1,21 @@ +package ru.spcex.clearing.registry.reports.bean; + +import java.io.Serializable; + +/** + * Словарь. + */ +public interface Dictionary extends Serializable { + + Long getId(); + + void setId(Long id); + + String getCode(); + + void setCode(String code); + + String getName(); + + void setName(String name); +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionCommon.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionCommon.java new file mode 100644 index 000000000..da3bbf3a1 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionCommon.java @@ -0,0 +1,320 @@ +package ru.spcex.clearing.registry.reports.bean; + +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; + +public abstract class ExecutionCommon extends BusinessObject { + protected Long exchangeExecutionId; + protected Instant exchangeExecutionTime; + protected LocalDate tradingDate; + protected Long tradingClearingRegistryId; + protected String partyTradingClearingRegistry; + protected String counterPartyTradingClearingRegistry; + protected String market; + protected BigDecimal price; + protected BigDecimal lots; + protected BigDecimal quantity; + protected BigDecimal interestAmount; + protected String side; + protected String settlementCurrency; + protected Long companyId; + protected Long duration; + protected String securityFullName; + protected String securitySymbol; + protected Long securityId; + protected Long counterPartyId; + protected String coverageStatus; + protected Long sessionId; + protected LocalDate clearingDate; + protected Long counterPartyTradingClearingRegistryId; + + // No DB fields + private String sellerTkrCode; + private String buyerTkrCode; + private String counterPartyIdFromCompany; + private String companyIdFromCompany; + + private String buyerCode; + private String sellerCode; + private String buyer; + private String seller; + + private String status; + + + public abstract ExecutionType type(); + + public LocalDate getClearingDate() { + return clearingDate; + } + + public void setClearingDate(LocalDate value) { + this.clearingDate = value; + } + + public Long getExchangeExecutionId() { + return exchangeExecutionId; + } + + public void setExchangeExecutionId(Long value) { + this.exchangeExecutionId = value; + } + + public String getSide() { + return side; + } + + public void setSide(String value) { + this.side = value; + } + + public String getMarket() { + return market; + } + + public void setMarket(String value) { + this.market = value; + } + + public LocalDate getTradingDate() { + return tradingDate; + } + + public void setTradingDate(LocalDate value) { + this.tradingDate = value; + } + + public String getSecuritySymbol() { + return securitySymbol; + } + + public void setSecuritySymbol(String value) { + this.securitySymbol = value; + } + + public Long getSecurityId() { + return securityId; + } + + public void setSecurityId(Long value) { + this.securityId = value; + } + + public BigDecimal getInterestAmount() { + return interestAmount; + } + + public void setInterestAmount(BigDecimal value) { + this.interestAmount = value; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal value) { + this.price = value; + } + + public BigDecimal getLots() { + return lots; + } + + public void setLots(BigDecimal value) { + this.lots = value; + } + + public BigDecimal getQuantity() { + return quantity; + } + + public void setQuantity(BigDecimal value) { + this.quantity = value; + } + + public Instant getExchangeExecutionTime() { + return exchangeExecutionTime; + } + + public void setExchangeExecutionTime(Instant value) { + this.exchangeExecutionTime = value; + } + + public Long getDuration() { + return duration; + } + + public void setDuration(Long value) { + this.duration = value; + } + + public Long getTradingClearingRegistryId() { + return tradingClearingRegistryId; + } + + public void setTradingClearingRegistryId(Long value) { + this.tradingClearingRegistryId = value; + } + + public String getPartyTradingClearingRegistry() { + return partyTradingClearingRegistry; + } + + public void setPartyTradingClearingRegistry(String partyTradingClearingRegistry) { + this.partyTradingClearingRegistry = partyTradingClearingRegistry; + } + + public String getCounterPartyTradingClearingRegistry() { + return counterPartyTradingClearingRegistry; + } + + public void setCounterPartyTradingClearingRegistry(String counterPartyTradingClearingRegistry) { + this.counterPartyTradingClearingRegistry = counterPartyTradingClearingRegistry; + } + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long value) { + this.companyId = value; + } + + public Long getCounterPartyId() { + return counterPartyId; + } + + public void setCounterPartyId(Long value) { + this.counterPartyId = value; + } + + public String getSecurityFullName() { + return securityFullName; + } + + public void setSecurityFullName(String value) { + this.securityFullName = value; + } + + public String getSettlementCurrency() { + return settlementCurrency; + } + + public void setSettlementCurrency(String value) { + this.settlementCurrency = value; + } + + public String getCoverageStatus() { + return coverageStatus; + } + + public void setCoverageStatus(String value) { + this.coverageStatus = value; + } + + public Long getSessionId() { + return sessionId; + } + + public void setSessionId(Long value) { + this.sessionId = value; + } + + public Long getCounterPartyTradingClearingRegistryId() { + return counterPartyTradingClearingRegistryId; + } + + public void setCounterPartyTradingClearingRegistryId(Long counterPartyTradingClearingRegistryId) { + this.counterPartyTradingClearingRegistryId = counterPartyTradingClearingRegistryId; + } + + public String getSellerTkrCode() { + return sellerTkrCode; + } + + public void setSellerTkrCode(String sellerTkrCode) { + this.sellerTkrCode = sellerTkrCode; + } + + public String getCounterPartyIdFromCompany() { + return counterPartyIdFromCompany; + } + + public void setCounterPartyIdFromCompany(String counterPartyIdFromCompany) { + this.counterPartyIdFromCompany = counterPartyIdFromCompany; + } + + public String getCompanyIdFromCompany() { + return companyIdFromCompany; + } + + public void setCompanyIdFromCompany(String companyIdFromCompany) { + this.companyIdFromCompany = companyIdFromCompany; + } + + public String getBuyerCode() { + return buyerCode; + } + + public void setBuyerCode(String buyerCode) { + this.buyerCode = buyerCode; + } + + public String getSellerCode() { + return sellerCode; + } + + public void setSellerCode(String sellerCode) { + this.sellerCode = sellerCode; + } + + public String getBuyer() { + return buyer; + } + + public void setBuyer(String buyer) { + this.buyer = buyer; + } + + public String getSeller() { + return seller; + } + + public void setSeller(String seller) { + this.seller = seller; + } + + public String getBuyerTkrCode() { + return buyerTkrCode; + } + + public void setBuyerTkrCode(String buyerTkrCode) { + this.buyerTkrCode = buyerTkrCode; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ExecutionCommon that = (ExecutionCommon) o; + + return getExchangeExecutionId() != null ? getExchangeExecutionId().equals(that.getExchangeExecutionId()) : that.getExchangeExecutionId() == null; + } + + @Override + public int hashCode() { + int result = 1; + result = 31 * result + (getExchangeExecutionId() != null ? getExchangeExecutionId().hashCode() : 0); + return result; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionDeposit.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionDeposit.java new file mode 100644 index 000000000..c3d406355 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionDeposit.java @@ -0,0 +1,87 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.IDBObject; + +import java.math.BigDecimal; +import java.time.LocalDate; + +public class ExecutionDeposit extends ExecutionCommon implements IDBObject { + private BigDecimal firstLegAmount; + private BigDecimal secondLegAmount; + private LocalDate firstLegSettlementDate; + private LocalDate secondLegSettlementDate; + private String firstLegSettlementCode; + private String secondLegSettlementCode; + private String contract; + private String securityCode; + + @Override + public ExecutionType type() { + return ExecutionType.ExecutionDeposit; + } + + public BigDecimal getFirstLegAmount() { + return firstLegAmount; + } + + public void setFirstLegAmount(BigDecimal firstLegAmount) { + this.firstLegAmount = firstLegAmount; + } + + public BigDecimal getSecondLegAmount() { + return secondLegAmount; + } + + public void setSecondLegAmount(BigDecimal secondLegAmount) { + this.secondLegAmount = secondLegAmount; + } + + public LocalDate getFirstLegSettlementDate() { + return firstLegSettlementDate; + } + + public void setFirstLegSettlementDate(LocalDate firstLegSettlementDate) { + this.firstLegSettlementDate = firstLegSettlementDate; + } + + public LocalDate getSecondLegSettlementDate() { + return secondLegSettlementDate; + } + + public void setSecondLegSettlementDate(LocalDate secondLegSettlementDate) { + this.secondLegSettlementDate = secondLegSettlementDate; + } + + public String getFirstLegSettlementCode() { + return firstLegSettlementCode; + } + + public void setFirstLegSettlementCode(String firstLegSettlementCode) { + this.firstLegSettlementCode = firstLegSettlementCode; + } + + public String getSecondLegSettlementCode() { + return secondLegSettlementCode; + } + + public void setSecondLegSettlementCode(String secondLegSettlementCode) { + this.secondLegSettlementCode = secondLegSettlementCode; + } + + public String getContract() { + return contract; + } + + public void setContract(String contract) { + this.contract = contract; + } + + public String getSecurityCode() { + return securityCode; + } + + public void setSecurityCode(String securityCode) { + this.securityCode = securityCode; + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionFond.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionFond.java new file mode 100644 index 000000000..286876b9e --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionFond.java @@ -0,0 +1,79 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.IDBObject; + +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; + +public class ExecutionFond extends ExecutionCommon implements IDBObject { + private Long exchangeOrderId; + private BigDecimal settlementAmount; + private String comment; + private Long clientCodeId; + private String settlementCode; + private LocalDate settlementDate; + private Instant exchangeExecutionMicroseconds; + + @Override + public ExecutionType type() { + return ExecutionType.ExecutionFond; + } + + public Long getExchangeOrderId() { + return exchangeOrderId; + } + + public void setExchangeOrderId(Long exchangeOrderId) { + this.exchangeOrderId = exchangeOrderId; + } + + public BigDecimal getSettlementAmount() { + return settlementAmount; + } + + public void setSettlementAmount(BigDecimal settlementAmount) { + this.settlementAmount = settlementAmount; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public Long getClientCodeId() { + return clientCodeId; + } + + public void setClientCodeId(Long clientCodeId) { + this.clientCodeId = clientCodeId; + } + + public String getSettlementCode() { + return settlementCode; + } + + public void setSettlementCode(String settlementCode) { + this.settlementCode = settlementCode; + } + + public LocalDate getSettlementDate() { + return settlementDate; + } + + public void setSettlementDate(LocalDate settlementDate) { + this.settlementDate = settlementDate; + } + + public Instant getExchangeExecutionMicroseconds() { + return exchangeExecutionMicroseconds; + } + + public void setExchangeExecutionMicroseconds(Instant exchangeExecutionMicroseconds) { + this.exchangeExecutionMicroseconds = exchangeExecutionMicroseconds; + } + +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionType.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionType.java new file mode 100644 index 000000000..1ba89387b --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionType.java @@ -0,0 +1,5 @@ +package ru.spcex.clearing.registry.reports.bean; + +public enum ExecutionType { + ExecutionDeposit, ExecutionFond; +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/FileReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/FileReport.java deleted file mode 100644 index 223462e4c..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/FileReport.java +++ /dev/null @@ -1,4 +0,0 @@ -package ru.spcex.clearing.registry.reports.bean; - -public interface FileReport { -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyFlowSide.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyFlowSide.java new file mode 100644 index 000000000..0821fa6c9 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyFlowSide.java @@ -0,0 +1,21 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.helpers.IEnumKey; + +public enum MoneyFlowSide implements IEnumKey { + BUY("BUY"), + SELL("SELL"), + ; + + private final String key; + + MoneyFlowSide(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/ObjectType.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ObjectType.java new file mode 100644 index 000000000..93fed8100 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ObjectType.java @@ -0,0 +1,5 @@ +package ru.spcex.clearing.registry.reports.bean; + +public enum ObjectType { + EXECUTION_FOND, EXECUTION_DEPOSIT, MONEY_PAYMENT_INSTRUCTION, DEPO_PAYMENT_INSTRUCTION, REGISTRY_HISTORY +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/PaymentInstruction.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/PaymentInstruction.java new file mode 100644 index 000000000..1bb0eef6e --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/PaymentInstruction.java @@ -0,0 +1,360 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.IDBObject; + +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; + +public class PaymentInstruction extends BusinessObject implements IDBObject { + private Long senderId; + private Long addresseeId; + private String payeeBic; + private String addresseeBic; + private String payeeBankName; + private String addresseeBankName; + private Instant paymentDate; + private String paymentPurpose; + private LocalDate settlementDate; + private BigDecimal creditLeg_amount; + private BigDecimal debitLeg_amount; + private Long creditLeg_accountId; + private String credit_csAccount; + private String creditLeg_account; + private Long debitLeg_accountId; + private String debit_csAccount; + private String debitLeg_account; + private String creditLeg_direction; + private String debitLeg_direction; + private String creditLeg_currencyCode; + private String debitLeg_currencyCode; + private Long creditLeg_securityId; + private Long debitLeg_securityId; + private String transactionStatus; + private String documentNumber; + private LocalDate clearingDate; + private Long sessionId; + + // No DB fields (for depoInstruction) + private String creditLegAccountStr; + private String debitLegAccountStr; + private String senderCompanyShortName; + private String senderCompanyClearingCode; + private String addresseeCompanyShortName; + private String addresseeCompanyClearingCode; + + // No DB fields (for moneyInstruction) + private String sender; + private String senderClearingCode; + private String addressee; + private String addresseeClearingCode; + + // No DB fields (for depoInstruction) + private String security; + + + + public Long getSenderId() { + return senderId; + } + + public void setSenderId(Long senderId) { + this.senderId = senderId; + } + + public Long getAddresseeId() { + return addresseeId; + } + + public void setAddresseeId(Long addresseeId) { + this.addresseeId = addresseeId; + } + + public String getPayeeBic() { + return payeeBic; + } + + public void setPayeeBic(String payeeBic) { + this.payeeBic = payeeBic; + } + + public String getAddresseeBic() { + return addresseeBic; + } + + public void setAddresseeBic(String addresseeBic) { + this.addresseeBic = addresseeBic; + } + + public String getPayeeBankName() { + return payeeBankName; + } + + public void setPayeeBankName(String payeeBankName) { + this.payeeBankName = payeeBankName; + } + + public String getAddresseeBankName() { + return addresseeBankName; + } + + public void setAddresseeBankName(String addresseeBankName) { + this.addresseeBankName = addresseeBankName; + } + + public Instant getPaymentDate() { + return paymentDate; + } + + public void setPaymentDate(Instant paymentDate) { + this.paymentDate = paymentDate; + } + + public String getPaymentPurpose() { + return paymentPurpose; + } + + public void setPaymentPurpose(String paymentPurpose) { + this.paymentPurpose = paymentPurpose; + } + + public LocalDate getSettlementDate() { + return settlementDate; + } + + public void setSettlementDate(LocalDate settlementDate) { + this.settlementDate = settlementDate; + } + + public BigDecimal getCreditLeg_amount() { + return creditLeg_amount; + } + + public void setCreditLeg_amount(BigDecimal creditLeg_amount) { + this.creditLeg_amount = creditLeg_amount; + } + + public BigDecimal getDebitLeg_amount() { + return debitLeg_amount; + } + + public void setDebitLeg_amount(BigDecimal debitLeg_amount) { + this.debitLeg_amount = debitLeg_amount; + } + + public Long getCreditLeg_accountId() { + return creditLeg_accountId; + } + + public void setCreditLeg_accountId(Long creditLeg_accountId) { + this.creditLeg_accountId = creditLeg_accountId; + } + + public String getCredit_csAccount() { + return credit_csAccount; + } + + public void setCredit_csAccount(String credit_csAccount) { + this.credit_csAccount = credit_csAccount; + } + + public String getCreditLeg_account() { + return creditLeg_account; + } + + public void setCreditLeg_account(String creditLeg_account) { + this.creditLeg_account = creditLeg_account; + } + + public Long getDebitLeg_accountId() { + return debitLeg_accountId; + } + + public void setDebitLeg_accountId(Long debitLeg_accountId) { + this.debitLeg_accountId = debitLeg_accountId; + } + + public String getDebit_csAccount() { + return debit_csAccount; + } + + public void setDebit_csAccount(String debit_csAccount) { + this.debit_csAccount = debit_csAccount; + } + + public String getDebitLeg_account() { + return debitLeg_account; + } + + public void setDebitLeg_account(String debitLeg_account) { + this.debitLeg_account = debitLeg_account; + } + + public String getCreditLeg_direction() { + return creditLeg_direction; + } + + public void setCreditLeg_direction(String creditLeg_direction) { + this.creditLeg_direction = creditLeg_direction; + } + + public String getDebitLeg_direction() { + return debitLeg_direction; + } + + public void setDebitLeg_direction(String debitLeg_direction) { + this.debitLeg_direction = debitLeg_direction; + } + + public String getCreditLeg_currencyCode() { + return creditLeg_currencyCode; + } + + public void setCreditLeg_currencyCode(String creditLeg_currencyCode) { + this.creditLeg_currencyCode = creditLeg_currencyCode; + } + + public String getDebitLeg_currencyCode() { + return debitLeg_currencyCode; + } + + public void setDebitLeg_currencyCode(String debitLeg_currencyCode) { + this.debitLeg_currencyCode = debitLeg_currencyCode; + } + + public Long getCreditLeg_securityId() { + return creditLeg_securityId; + } + + public void setCreditLeg_securityId(Long creditLeg_securityId) { + this.creditLeg_securityId = creditLeg_securityId; + } + + public Long getDebitLeg_securityId() { + return debitLeg_securityId; + } + + public void setDebitLeg_securityId(Long debitLeg_securityId) { + this.debitLeg_securityId = debitLeg_securityId; + } + + public String getTransactionStatus() { + return transactionStatus; + } + + public void setTransactionStatus(String transactionStatus) { + this.transactionStatus = transactionStatus; + } + + public String getDocumentNumber() { + return documentNumber; + } + + public void setDocumentNumber(String documentNumber) { + this.documentNumber = documentNumber; + } + + public LocalDate getClearingDate() { + return clearingDate; + } + + public void setClearingDate(LocalDate clearingDate) { + this.clearingDate = clearingDate; + } + + public Long getSessionId() { + return sessionId; + } + + public void setSessionId(Long sessionId) { + this.sessionId = sessionId; + } + + public String getCreditLegAccountStr() { + return creditLegAccountStr; + } + + public void setCreditLegAccountStr(String creditLegAccountStr) { + this.creditLegAccountStr = creditLegAccountStr; + } + + public String getDebitLegAccountStr() { + return debitLegAccountStr; + } + + public void setDebitLegAccountStr(String debitLegAccountStr) { + this.debitLegAccountStr = debitLegAccountStr; + } + + public String getSenderCompanyShortName() { + return senderCompanyShortName; + } + + public void setSenderCompanyShortName(String senderCompanyShortName) { + this.senderCompanyShortName = senderCompanyShortName; + } + + public String getSenderCompanyClearingCode() { + return senderCompanyClearingCode; + } + + public void setSenderCompanyClearingCode(String senderCompanyClearingCode) { + this.senderCompanyClearingCode = senderCompanyClearingCode; + } + + public String getAddresseeCompanyShortName() { + return addresseeCompanyShortName; + } + + public void setAddresseeCompanyShortName(String addresseeCompanyShortName) { + this.addresseeCompanyShortName = addresseeCompanyShortName; + } + + public String getAddresseeCompanyClearingCode() { + return addresseeCompanyClearingCode; + } + + public void setAddresseeCompanyClearingCode(String addresseeCompanyClearingCode) { + this.addresseeCompanyClearingCode = addresseeCompanyClearingCode; + } + + public String getSender() { + return sender; + } + + public void setSender(String sender) { + this.sender = sender; + } + + public String getAddressee() { + return addressee; + } + + public void setAddressee(String addressee) { + this.addressee = addressee; + } + + public String getSenderClearingCode() { + return senderClearingCode; + } + + public void setSenderClearingCode(String senderClearingCode) { + this.senderClearingCode = senderClearingCode; + } + + public String getAddresseeClearingCode() { + return addresseeClearingCode; + } + + public void setAddresseeClearingCode(String addresseeClearingCode) { + this.addresseeClearingCode = addresseeClearingCode; + } + + public String getSecurity() { + return security; + } + + public void setSecurity(String security) { + this.security = security; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Registry.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Registry.java new file mode 100644 index 000000000..b4d326ddb --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Registry.java @@ -0,0 +1,430 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.IDBObject; + +import java.math.BigDecimal; +import java.time.LocalDate; + +public class Registry extends BusinessObject implements IDBObject { + private Long companyId; + private String tradingCode; + private String clearingCode; + private String shortName; + private String fullName; + private Long accountId; + private String accountType; + private String account; + private String registryDesignation; + private String registryInstrumentType; + private String registryCapacity; + private String registryUnit; + private String registryCode; + private Long tradingClearingRegistryId; + private String tradingClearingRegistry; + private String registryStatus; + private String registryStatus_dictionary; + private Long securityId; + private String securitySymbol; + private BigDecimal balance; + private BigDecimal openBalance; + private BigDecimal closeBalance; + private BigDecimal credit; + private BigDecimal debit; + private BigDecimal settledCredit; + private BigDecimal settledDebit; + private BigDecimal checkBalance; + private BigDecimal diffBalance; + private BigDecimal planBalance; + private String balanceDimension; + private LocalDate settlementDate; + private String settlementCode; + private LocalDate tradingDate; + private LocalDate clearingDate; + private LocalDate refundDate; + private LocalDate valueDate; + private BigDecimal price; + private String contract; + private Long counterPartyId; + private String comment; + private Long parentId; + private Long groupId; + private Long sessionId; + private String sessionType; + private String sessionType_dictionary; + private Long paymentId; + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } + + public String getTradingCode() { + return tradingCode; + } + + public void setTradingCode(String tradingCode) { + this.tradingCode = tradingCode; + } + + public String getClearingCode() { + return clearingCode; + } + + public void setClearingCode(String clearingCode) { + this.clearingCode = clearingCode; + } + + public String getShortName() { + return shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public Long getAccountId() { + return accountId; + } + + public void setAccountId(Long accountId) { + this.accountId = accountId; + } + + public String getAccountType() { + return accountType; + } + + public void setAccountType(String accountType) { + this.accountType = accountType; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getRegistryDesignation() { + return registryDesignation; + } + + public void setRegistryDesignation(String registryDesignation) { + this.registryDesignation = registryDesignation; + } + + public String getRegistryInstrumentType() { + return registryInstrumentType; + } + + public void setRegistryInstrumentType(String registryInstrumentType) { + this.registryInstrumentType = registryInstrumentType; + } + + public String getRegistryCapacity() { + return registryCapacity; + } + + public void setRegistryCapacity(String registryCapacity) { + this.registryCapacity = registryCapacity; + } + + public String getRegistryUnit() { + return registryUnit; + } + + public void setRegistryUnit(String registryUnit) { + this.registryUnit = registryUnit; + } + + public String getRegistryCode() { + return registryCode; + } + + public void setRegistryCode(String registryCode) { + this.registryCode = registryCode; + } + + public Long getTradingClearingRegistryId() { + return tradingClearingRegistryId; + } + + public void setTradingClearingRegistryId(Long tradingClearingRegistryId) { + this.tradingClearingRegistryId = tradingClearingRegistryId; + } + + public String getTradingClearingRegistry() { + return tradingClearingRegistry; + } + + public void setTradingClearingRegistry(String tradingClearingRegistry) { + this.tradingClearingRegistry = tradingClearingRegistry; + } + + public String getRegistryStatus() { + return registryStatus; + } + + public void setRegistryStatus(String registryStatus) { + this.registryStatus = registryStatus; + } + + public String getRegistryStatus_dictionary() { + return registryStatus_dictionary; + } + + public void setRegistryStatus_dictionary(String registryStatus_dictionary) { + this.registryStatus_dictionary = registryStatus_dictionary; + } + + public Long getSecurityId() { + return securityId; + } + + public void setSecurityId(Long securityId) { + this.securityId = securityId; + } + + public String getSecuritySymbol() { + return securitySymbol; + } + + public void setSecuritySymbol(String securitySymbol) { + this.securitySymbol = securitySymbol; + } + + public BigDecimal getBalance() { + if (balance == null) { + balance = BigDecimal.ZERO; + } + return balance; + } + + public void setBalance(BigDecimal balance) { + if (balance == null) { + balance = BigDecimal.ZERO; + } + this.balance = balance; + } + + public BigDecimal getOpenBalance() { + return openBalance; + } + + public void setOpenBalance(BigDecimal openBalance) { + this.openBalance = openBalance; + } + + public BigDecimal getCloseBalance() { + return closeBalance; + } + + public void setCloseBalance(BigDecimal closeBalance) { + this.closeBalance = closeBalance; + } + + public BigDecimal getCredit() { + return credit; + } + + public void setCredit(BigDecimal credit) { + this.credit = credit; + } + + public BigDecimal getDebit() { + return debit; + } + + public void setDebit(BigDecimal debit) { + this.debit = debit; + } + + public BigDecimal getSettledCredit() { + return settledCredit; + } + + public void setSettledCredit(BigDecimal settledCredit) { + this.settledCredit = settledCredit; + } + + public BigDecimal getSettledDebit() { + return settledDebit; + } + + public void setSettledDebit(BigDecimal settledDebit) { + this.settledDebit = settledDebit; + } + + public BigDecimal getCheckBalance() { + return checkBalance; + } + + public void setCheckBalance(BigDecimal checkBalance) { + this.checkBalance = checkBalance; + } + + public BigDecimal getDiffBalance() { + return diffBalance; + } + + public void setDiffBalance(BigDecimal diffBalance) { + this.diffBalance = diffBalance; + } + + public BigDecimal getPlanBalance() { + return planBalance; + } + + public void setPlanBalance(BigDecimal planBalance) { + this.planBalance = planBalance; + } + + public String getBalanceDimension() { + return balanceDimension; + } + + public void setBalanceDimension(String balanceDimension) { + this.balanceDimension = balanceDimension; + } + + public LocalDate getSettlementDate() { + return settlementDate; + } + + public void setSettlementDate(LocalDate settlementDate) { + this.settlementDate = settlementDate; + } + + public String getSettlementCode() { + return settlementCode; + } + + public void setSettlementCode(String settlementCode) { + this.settlementCode = settlementCode; + } + + public LocalDate getTradingDate() { + return tradingDate; + } + + public void setTradingDate(LocalDate tradingDate) { + this.tradingDate = tradingDate; + } + + public LocalDate getClearingDate() { + return clearingDate; + } + + public void setClearingDate(LocalDate clearingDate) { + this.clearingDate = clearingDate; + } + + public LocalDate getRefundDate() { + return refundDate; + } + + public void setRefundDate(LocalDate refundDate) { + this.refundDate = refundDate; + } + + public LocalDate getValueDate() { + return valueDate; + } + + public void setValueDate(LocalDate valueDate) { + this.valueDate = valueDate; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public String getContract() { + return contract; + } + + public void setContract(String contract) { + this.contract = contract; + } + + public Long getCounterPartyId() { + return counterPartyId; + } + + public void setCounterPartyId(Long counterPartyId) { + this.counterPartyId = counterPartyId; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public Long getSessionId() { + return sessionId; + } + + public void setSessionId(Long sessionId) { + this.sessionId = sessionId; + } + + public String getSessionType() { + return sessionType; + } + + public void setSessionType(String sessionType) { + this.sessionType = sessionType; + } + + public String getSessionType_dictionary() { + return sessionType_dictionary; + } + + public void setSessionType_dictionary(String sessionType_dictionary) { + this.sessionType_dictionary = sessionType_dictionary; + } + + public Long getPaymentId() { + return paymentId; + } + + public void setPaymentId(Long paymentId) { + this.paymentId = paymentId; + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryHistory.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryHistory.java new file mode 100644 index 000000000..84fe878cb --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryHistory.java @@ -0,0 +1,37 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.IDBObject; + +public class RegistryHistory extends BusinessEvent 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 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 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, IValidator> fieldValuesValidator; - private final PreClearMap preClearMap; - - @Autowired - public AdmittedLiabilitiesRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - Function, IValidator> fieldValuesValidator) { - super(kafkaQueue, kafkaProducer); - this.admittedLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_AdmittedLiabilitiesRegister, AdmittedLiabilitiesRegister.class); - this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); - this.fieldValuesValidator = fieldValuesValidator; - preClearMap = PreClearMap.instanceForInstantField(admittedLiabilitiesRegisterMap, "created"); - } - - @Override - public void afterPropertiesSet() { - callback(AdmittedLiabilitiesRegisterNewRequest.class) - .setConsumer(this::admittedLiabilitiesRegisterNew) - .forDestination(Consts.REGISTRY_ADMITTED_LIABILITIES_REGISTER_NEW, callbacks::put); - callback(LauncherCommandRequest.class) - .setConsumer(this::admittedLiabilitiesRegisterNew) - .forDestination(createRegistry_ADLR.topic(), callbacks::put); - init(); - } - - public void admittedLiabilitiesRegisterNew(BaseRequest userRequest) { - log.debug("AdmittedLiabilitiesRegisterNewRequest received from {}", Consts.REGISTRY_ADMITTED_LIABILITIES_REGISTER_NEW); - String sqlConditionForRegistry = getSqlForRegistries(); - Collection registries = registryMap.getCollectionObjectsBySQL(sqlConditionForRegistry); - if (registries.isEmpty()) { - log.debug("No registry with such conditions {}", sqlConditionForRegistry); - return; - } - log.debug("Select {} Registry by query {}", registries.size(), registries); - preClearMap.preClearMap(); - registries.forEach((registry -> { - if (isDuplicateInMap(registry).isEmpty()) { - insertAdmittedLiabilitiesRegister(registry); - } - } - )); - log.debug("Successfully processed.."); - } - - private void insertAdmittedLiabilitiesRegister(Registry registry) { - log.trace("Started generating AdmittedLiabilitiesRegister entity..."); - AdmittedLiabilitiesRegister admittedLiabilitiesRegister = new AdmittedLiabilitiesRegister(); - Company company = companyMap.getFirstObjectByFieldValues(Map.of("id", 1L)); - Security security = securitySelector.selectSecurityById(registry.getSecurityId()); - String securityFullName = security != null ? security.getFullName() : null; - String companyFullName = company != null ? company.getFullName() : null; - admittedLiabilitiesRegister.setCompanyFullName(companyFullName); - admittedLiabilitiesRegister.setSessionId(registry.getSessionId()); - admittedLiabilitiesRegister.setSecuritySymbol(registry.getSecuritySymbol()); - admittedLiabilitiesRegister.setSecurityFullName(securityFullName); - admittedLiabilitiesRegister.setCompanyId(registry.getCompanyId()); - admittedLiabilitiesRegister.setClearingCode(registry.getClearingCode()); - admittedLiabilitiesRegister.setAccount(registry.getAccount()); - admittedLiabilitiesRegister.setAmount(registry.getBalance()); - admittedLiabilitiesRegister.setClearingDate(registry.getClearingDate()); - admittedLiabilitiesRegister.setCreated(Instant.now()); - admittedLiabilitiesRegister.setUpdated(Instant.now()); - admittedLiabilitiesRegisterMap.insert(admittedLiabilitiesRegister); - log.debug("inserted successfully AdmittedLiabilitiesRegister entity with id: {}", admittedLiabilitiesRegister.getId()); - } - - private String getSqlForRegistries() { - return String.format("registryDesignation = '%s' and " + - "registryInstrumentType in ('%s','%s') and " + - "registryUnit = '%s' and " + - "registryStatus in ('%s','%s','%s','%s','%s', '%s')" - , - RegistryDesignation.O.getKey(), - RegistryInstrumentType.S.getKey(), - RegistryInstrumentType.M.getKey(), - RegistryUnit.T.getKey(), - RegistryStatus.OK.getKey(), - RegistryStatus.NACK.getKey(), - RegistryStatus.UNCV.getKey(), - RegistryStatus.NACC.getKey(), - RegistryStatus.FAIL.getKey(), - RegistryStatus.CLRD.getKey() - ); - } - - @Override - public Optional isDuplicateInMap(Registry entity) { - return Optional.empty(); - //для всех isDuplicateInMap: пока не используется, надо по критерию чистить мапу перед вставкой записей, preClearMap. -// Map> fieldValues = Map.of( -// "companyId", entity.getRegistryCode(), -// "sessionId", entity.getSessionId(), -// "securitySymbol", entity.getSecuritySymbol(), -// "clearingDate", entity.getClearingDate(), -// "account", entity.getAccount() -// ); -// Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); -// if (message.isPresent()) { -// log.warn("Illegal value in map for request to imdg: {}", message.get()); -// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); -// } -// return Optional.ofNullable(admittedLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues)); - - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java deleted file mode 100644 index fbd14a608..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java +++ /dev/null @@ -1,141 +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.CoveredLiabilitiesRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.security.Security; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.registry.CoveredLiabilitiesRegisterNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.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_CDLR; - -@Service -public class CoveredLiabilitiesRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg coveredLiabilitiesRegisterMap; - private final Imdg registryMap; - private final Imdg companyMap; - private final SecuritySelector securitySelector; - private final Function, IValidator> fieldValuesValidator; - private final PreClearMap preClearMap; - - @Autowired - public CoveredLiabilitiesRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - Function, IValidator> fieldValuesValidator) { - super(kafkaQueue, kafkaProducer); - this.coveredLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CoveredLiabilitiesRegister, CoveredLiabilitiesRegister.class); - this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); - this.fieldValuesValidator = fieldValuesValidator; - preClearMap = PreClearMap.instanceForInstantField(coveredLiabilitiesRegisterMap, "created"); - } - - @Override - public void afterPropertiesSet() { - callback(CoveredLiabilitiesRegisterNewRequest.class) - .setConsumer(this::coveredLiabilitiesRegisterNew) - .forDestination(Consts.REGISTRY_COVERED_LIABILITIES_REGISTER_NEW, callbacks::put); - callback(LauncherCommandRequest.class) - .setConsumer(this::coveredLiabilitiesRegisterNew) - .forDestination(createRegistry_CDLR.topic(), callbacks::put); - init(); - } - - - public void coveredLiabilitiesRegisterNew(BaseRequest userRequest) { - log.debug("CoveredLiabilitiesRegisterNew received"); - String sqlConditionForRegistry = getSqlForRegistries(); - Collection registries = registryMap.getCollectionObjectsBySQL(sqlConditionForRegistry); - if (registries.isEmpty()) { - log.debug("No registry with such conditions {}", sqlConditionForRegistry); - return; - } - log.debug("Select {} Registry by query {}", registries.size(), sqlConditionForRegistry); - preClearMap.preClearMap(); - registries.forEach((registry -> { - if (isDuplicateInMap(registry).isEmpty()) { - insertCoveredLiabilitiesRegister(registry); - } - } - )); - log.debug("successfully processed"); - } - - private void insertCoveredLiabilitiesRegister(Registry registry) { - log.trace("insert CoveredLiabilitiesRegister in map..."); - CoveredLiabilitiesRegister coveredLiabilitiesRegister = new CoveredLiabilitiesRegister(); - Company company = companyMap.getFirstObjectByFieldValues(Map.of("id", 1L)); - Security security = securitySelector.selectSecurityById(registry.getSecurityId()); - String securityFullName = security != null ? security.getFullName() : null; - String companyFullName = company != null ? company.getFullName() : null; - coveredLiabilitiesRegister.setCompanyFullName(companyFullName); - coveredLiabilitiesRegister.setSessionId(registry.getSessionId()); - coveredLiabilitiesRegister.setSecuritySymbol(registry.getSecuritySymbol()); - coveredLiabilitiesRegister.setSecurityFullName(securityFullName); - coveredLiabilitiesRegister.setCompanyId(registry.getCompanyId()); - coveredLiabilitiesRegister.setClearingCode(registry.getClearingCode()); - coveredLiabilitiesRegister.setAccount(registry.getAccount()); - coveredLiabilitiesRegister.setAmount(registry.getBalance()); - coveredLiabilitiesRegister.setClearingDate(registry.getClearingDate()); - coveredLiabilitiesRegister.setCreated(Instant.now()); - coveredLiabilitiesRegister.setUpdated(Instant.now()); - coveredLiabilitiesRegisterMap.insert(coveredLiabilitiesRegister); - log.debug("CoveredLiabilitiesRegister inserted successfully with id: {}", coveredLiabilitiesRegister.getId()); - } - - private String getSqlForRegistries() { - return String.format("registryDesignation = '%s' and " + - "registryInstrumentType in ('%s','%s') and " + - "registryUnit = '%s' and " + - "registryStatus in ('%s', '%s')", - RegistryDesignation.O.getKey(), - RegistryInstrumentType.S.getKey(), - RegistryInstrumentType.M.getKey(), - RegistryUnit.T.getKey(), - RegistryStatus.OK.getKey(), - RegistryStatus.CLRD.getKey() - ); - } - - @Override - public Optional isDuplicateInMap(Registry entity) { - return Optional.empty(); -// Map> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId()); -// Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); -// if (message.isPresent()) { -// log.warn("Illegal value in map for request to imdg: {}", message.get()); -// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); -// } -// return Optional.ofNullable(coveredLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues)); - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java deleted file mode 100644 index 6d9843284..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java +++ /dev/null @@ -1,151 +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.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.register.DepoBalanceRegister; -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.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.registry.reports.ReportUtils; -import ru.spcex.clearing.registry.reports.builders.DepoBalanceRegisterReportBuilder; -import ru.spcex.clearing.registry.util.PreClearMap; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.RegistryTradingParams; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; -import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; -import ru.spcex.platform.utils.enumeration.IEnumKey; - -import java.io.File; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import static ru.spcex.platform.enumeration.Task.createRegistry_GRRT; - -@Service -public class DepoBalanceRegisterService extends QueueConsumer implements InitializingBean { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg depoBalanceRegisterMap; - private final Imdg registryHistoryMap; - private final PreClearMap preClearMap; - - private final DepoBalanceRegisterReportBuilder reportBuilder; - private final File outFolder; - private final RegistryServiceSettings settings; - - private final SFTPReportsConfig.ReportsGateway reportsSftpGateway; - private final boolean deleteAfterSend; - - @Autowired - public DepoBalanceRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - RegistryServiceSettings settings, - @Qualifier("reportOutDir") File outFolder, - SFTPReportsConfig.ReportsGateway reportsSftpGateway) { - super(kafkaQueue, kafkaProducer); - this.depoBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoBalanceRegister, DepoBalanceRegister.class); - this.registryHistoryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryHistory, RegistryHistory.class); - preClearMap = PreClearMap.instanceForInstantField(depoBalanceRegisterMap, "created"); - reportBuilder = new DepoBalanceRegisterReportBuilder(imdgProvider); - this.outFolder = outFolder; - this.settings = settings; - this.reportsSftpGateway = reportsSftpGateway; - this.deleteAfterSend = settings.getReportsStore().isDeleteAfterSend(); - } - - @Override - public void afterPropertiesSet() { - callback(LauncherCommandRequest.class) - .setConsumer(this::depoBalanceRegisterNew) - .forDestination(createRegistry_GRRT.topic(), callbacks::put); - init(); - } - - public void depoBalanceRegisterNew(BaseRequest userRequest) { - boolean csvMode = settings.isCsvMode(); - log.debug("LauncherCommandRequest received from {}", createRegistry_GRRT.topic()); - ImdgPredicate predicate = getPredicateForRegistries(userRequest.getRequestPayload().getCompanyId()); - Collection registryHistories = registryHistoryMap.getCollectionObjectsByPredicate(predicate); - log.trace("Started searching depoBalanceRegister in register by '{}'", predicate); - if (registryHistories.isEmpty()) { - log.debug("No registry with such conditions '{}'", predicate); - return; - } - log.debug("Select {} Registry history by query {}", registryHistories.size(), predicate); - if (!csvMode) preClearMap.preClearMap(); - List registryForReport = new ArrayList<>(); - for (RegistryHistory registryHistory : registryHistories) { - if (BigDecimal.ZERO.compareTo(registryHistory.getObject().getDiffBalance()) != 0) continue; - if (!csvMode) insertDepoBalanceRegister(registryHistory); - else registryForReport.add(registryHistory); - } - if (csvMode) { - File reportFile = reportBuilder.buildReport(registryForReport, outFolder); - ReportUtils.sendFilesToSftp(List.of(reportFile), reportsSftpGateway, deleteAfterSend); - } - log.debug("Successfully processed"); - } - - private void insertDepoBalanceRegister(RegistryHistory registryHistory) { - log.trace("Started generating DepoBalanceRegister entity..."); - Registry registry = registryHistory.getObject(); - DepoBalanceRegister depoBalanceRegister = new DepoBalanceRegister(); - depoBalanceRegister.setUpdated(Instant.now()); - depoBalanceRegister.setCreated(depoBalanceRegister.getUpdated()); - depoBalanceRegister.setCompanyId(registry.getCompanyId()); - AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType()); - if (AccountType.Depo == accountType) { - depoBalanceRegister.setDepoCode(registry.getAccount()); - } - depoBalanceRegister.setQuantity(registry.getBalance()); - depoBalanceRegister.setSecuritySymbol(registry.getSecuritySymbol()); - depoBalanceRegisterMap.insert(depoBalanceRegister); - log.debug("inserted successfully DepoBalanceRegister entity with id: {}", depoBalanceRegister.getId()); - } - - private ImdgPredicate getPredicateForRegistries(Long companyId) { - Instant now = Instant.now().truncatedTo(ChronoUnit.DAYS); - ImdgPredicateBuilder pb = registryHistoryMap.predicateBuilder(); - RegistryCodeSqlBuilder codeSql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AS_T).prefix("object"); - ImdgPredicate registryPredicate; - if (companyId == null) { - registryPredicate = pb.sql(codeSql.build()); - } else { - registryPredicate = pb.and( - pb.equals("object.companyId", companyId), - pb.sql(codeSql.build()) - ); - } - ImdgPredicate finalPredicate = pb.and( - registryPredicate, - pb.notNull("object.tradingClearingRegistry"), - pb.and( - pb.greatEqual("eventTime", now), - pb.less("eventTime", now.plus(1, ChronoUnit.DAYS)) - ) - ); - - log.trace("sql predicate for registry_history {}", finalPredicate); - return finalPredicate; - } - -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java deleted file mode 100644 index 264185998..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java +++ /dev/null @@ -1,178 +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.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.payment.PaymentInstruction; -import ru.clearing.classes.statics.data.register.DepoPaymentInstructionRegister; -import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; -import ru.clearing.platform.dictionary.InOutDirectionDictionary; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.registry.reports.ReportUtils; -import ru.spcex.clearing.registry.reports.builders.DepoPaymentInstructionRegisterReportBuilder; -import ru.spcex.clearing.registry.util.PreClearMap; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.TransactionStatus; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.IEnumKey; -import ru.spcex.platform.utils.validation.IValidator; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDate; -import java.util.*; -import java.util.function.Function; - -import static ru.spcex.platform.enumeration.Task.createRegistry_GORD; -import static ru.spcex.platform.enumeration.Task.createRegistry_GORR; - -@Service -public class DepoPaymentInstructionRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg depoPaymentInstructionRegisterMap; - private final Imdg paymentInstructionMap; - private final Imdg sessionMap; - private final Imdg tradingClearingRegistryMap; - private final Imdg InOutDirectionDictionaryMap; - private final Imdg accountMap; - private final Function, IValidator> fieldValuesValidator; - private final PreClearMap preClearMap; - - private final DepoPaymentInstructionRegisterReportBuilder reportBuilder; - private final File outFolder; - private final RegistryServiceSettings settings; - - private final SFTPReportsConfig.ReportsGateway reportsSftpGateway; - private final boolean deleteAfterSend; - - - @Autowired - public DepoPaymentInstructionRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - Function, IValidator> fieldValuesValidator, - @Qualifier("reportOutDir") File outFolder, - RegistryServiceSettings settings, - SFTPReportsConfig.ReportsGateway reportsSftpGateway) { - super(kafkaQueue, kafkaProducer); - this.depoPaymentInstructionRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoPaymentInstructionRegister, DepoPaymentInstructionRegister.class); - this.paymentInstructionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); - this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - this.tradingClearingRegistryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); - this.InOutDirectionDictionaryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_InOutDirectionDictionary, InOutDirectionDictionary.class); - this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); - this.fieldValuesValidator = fieldValuesValidator; - preClearMap = PreClearMap.instanceForInstantField(depoPaymentInstructionRegisterMap, "created"); - reportBuilder = new DepoPaymentInstructionRegisterReportBuilder(imdgProvider); - this.outFolder = outFolder; - this.settings = settings; - this.reportsSftpGateway = reportsSftpGateway; - this.deleteAfterSend = settings.getReportsStore().isDeleteAfterSend(); - } - - @Override - public void afterPropertiesSet() { - callback(LauncherCommandRequest.class) - .setConsumer(this::depoPaymentInstructionRegisterNew) - .forDestination(createRegistry_GORD.topic(), callbacks::put); - init(); - } - - - public void depoPaymentInstructionRegisterNew(BaseRequest userRequest) { - boolean csvMode = settings.isCsvMode(); - log.debug("LauncherCommandRequest received from {}", createRegistry_GORR.topic()); - - String piQuery = "transactionStatus='" + TransactionStatus.sent.getKey() + "' OR transactionStatus = '" + - TransactionStatus.stld.getKey() + "' OR transactionStatus = '" + TransactionStatus.ok.getKey() + "'"; - Collection paymentInstructions = paymentInstructionMap.getCollectionObjectsBySQL(piQuery); - log.debug("Selected {} PaymentInstruction by query \"{}\", do filter by account...", - paymentInstructions.size(), piQuery); - Collection depoPaymentInstructions = new ArrayList<>(); - for (PaymentInstruction paymentInstruction : paymentInstructions) { - // filter by accountType - if (paymentInstruction.getCreditLeg_accountId() != null) { - Account account = accountMap.getSingleObjectByID(paymentInstruction.getCreditLeg_accountId()); - if (account == null) - log.warn("Account id={} not found for paymentInstruction.id={}", - paymentInstruction.getCreditLeg_accountId(), paymentInstruction.getId()); - else { - if (IEnumKey.contains(account.getAccountType(), AccountType.Depo, AccountType.Dtrn)) { - depoPaymentInstructions.add(paymentInstruction); - } - } - } - } - log.debug("Filtered {} PaymentInstruction, with depo account's", depoPaymentInstructions.size()); - if (!csvMode) preClearMap.preClearMap(); - List paymentInstructionsForReport = new ArrayList<>(); - for (PaymentInstruction paymentInstruction : depoPaymentInstructions) { - if (isDuplicateInMap(paymentInstruction).isEmpty()) { - if (!csvMode) insertDepoPaymentInstructionRegister(paymentInstruction); - else if (LocalDate.now().equals(paymentInstruction.getClearingDate())) - paymentInstructionsForReport.add(paymentInstruction); - } - } - if (csvMode) { - File reportFile = reportBuilder.buildReport(paymentInstructionsForReport, outFolder); - ReportUtils.sendFilesToSftp(List.of(reportFile), reportsSftpGateway, deleteAfterSend); - } - - log.debug("successfully processed"); - } - - private void insertDepoPaymentInstructionRegister(PaymentInstruction paymentInstruction) { - log.trace("Started generating DepoPaymentInstructionRegister entity..."); - DepoPaymentInstructionRegister depoPaymentInstructionRegister = new DepoPaymentInstructionRegister(); - TradingClearingRegistry tradingClearingRegistry = null; - if (paymentInstruction.getCreditLeg_accountId() != null && paymentInstruction.getSenderId() != null) { - tradingClearingRegistry = tradingClearingRegistryMap.getFirstObjectByFieldValues(Map.of("companyId", paymentInstruction.getSenderId(), "depoAccountId", paymentInstruction.getCreditLeg_accountId())); - } - InOutDirectionDictionary inOutDirectionDictionary = InOutDirectionDictionaryMap.getFirstObjectByFieldValues(Map.of("code", paymentInstruction.getCreditLeg_direction())); - depoPaymentInstructionRegister.setCreated(Instant.now()); - depoPaymentInstructionRegister.setUpdated(Instant.now()); - depoPaymentInstructionRegister.setCompanyId(paymentInstruction.getSenderId()); - if (tradingClearingRegistry == null) { - log.warn("For paymentInstruction[{}].CreditLeg_accountId={} or SenderId={} can not find TradingClearingRegistry.", - paymentInstruction.getId(), paymentInstruction.getCreditLeg_accountId(), paymentInstruction.getSenderId()); - } else { - depoPaymentInstructionRegister.setTradingClearingRegistryType(tradingClearingRegistry.getTradingClearingRegistryType()); - depoPaymentInstructionRegister.setTradingClearingRegistry(tradingClearingRegistry.getCode()); - } - depoPaymentInstructionRegister.setCbCode("RNCB-BE-01"); - depoPaymentInstructionRegister.setQuantity(paymentInstruction.getCreditLeg_amount()); - depoPaymentInstructionRegister.setDirection(inOutDirectionDictionary.getId()); - depoPaymentInstructionRegister.setSessionId(paymentInstruction.getSessionId()); - depoPaymentInstructionRegisterMap.insert(depoPaymentInstructionRegister); - log.debug("inserted successfully DepoBalanceRegister entity with id: {}", depoPaymentInstructionRegister.getId()); - } - - @Override - public Optional isDuplicateInMap(PaymentInstruction entity) { - return Optional.empty(); -// Map> fieldValues = Map.of( -// "companyId", entity.getSenderId(), -// "sessionId", entity.getSessionId() -// ); -// Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); -// if (message.isPresent()) { -// log.warn("Illegal value in map for request to imdg: {}", message.get()); -// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); -// } -// return Optional.ofNullable(depoPaymentInstructionRegisterMap.getFirstObjectByFieldValues(fieldValues)); - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java deleted file mode 100644 index 2b30ff310..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java +++ /dev/null @@ -1,167 +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.instrument.issue.FixedIncomeSecurity; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; -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.ExcludeLiabilitiesRegisterNewRequest; -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.*; -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.time.TimeUtil; -import ru.spcex.platform.utils.validation.IValidator; - -import java.time.Instant; -import java.time.LocalDate; -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_EXLR; - -@Service -public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg excludeLiabilitiesRegisterMap; - private final Imdg registryMap; - private final Imdg sessionMap; - private final Imdg companySymbolMap; - private final SecuritySelector securitySelector; - private final Function, IValidator> fieldValuesValidator; - private final PreClearMap preClearMap; - - @Autowired - public ExcludeLiabilitiesRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - Function, IValidator> fieldValuesValidator) { - super(kafkaQueue, kafkaProducer); - this.excludeLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_ExcludeLiabilitiesRegister, ExcludeLiabilitiesRegister.class); - this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - this.companySymbolMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, ru.clearing.classes.statics.data.company.CompanySymbols.class); - this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); - this.fieldValuesValidator = fieldValuesValidator; - preClearMap = PreClearMap.instanceForInstantField(excludeLiabilitiesRegisterMap, "created"); - } - - @Override - public void afterPropertiesSet() { - callback(ExcludeLiabilitiesRegisterNewRequest.class) - .setConsumer(this::excludeLiabilitiesRegisterNew) - .forDestination(Consts.REGISTRY_EXCLUDE_LIABILITIES_REGISTER_NEW, callbacks::put); - callback(LauncherCommandRequest.class) - .setConsumer(this::excludeLiabilitiesRegisterNew) - .forDestination(createRegistry_EXLR.topic(), callbacks::put); - init(); - } - - - public void excludeLiabilitiesRegisterNew(BaseRequest userRequest) { - log.debug("ExcludeLiabilitiesRegisterNew received"); - String sqlForRegistries = getSqlForRegistries(); - Collection registries = registryMap.getCollectionObjectsBySQL(sqlForRegistries); - if (registries.isEmpty()) { - log.debug("No registry with such conditions {}", sqlForRegistries); - return; - } - log.debug("Select {} Registry by query {}", registries.size(), sqlForRegistries); - preClearMap.preClearMap(); - registries.forEach((registry -> { - if (isDuplicateInMap(registry).isEmpty()) { - insertExcludeLiabilitiesRegister(registry); - } - } - )); - log.debug("successfully processed"); - } - - private void insertExcludeLiabilitiesRegister(Registry registry) { - log.trace("Started generating ExcludeLiabilitiesRegister entity..."); - ExcludeLiabilitiesRegister excludeLiabilitiesRegister = new ExcludeLiabilitiesRegister(); - //hz communicating - Session sessionBySessionId = sessionMap.getSingleObjectByID(registry.getSessionId()); - Map> innPredicates = Map.of( - "companySymbol", CompanySymbol.INN.getKey(), - "companyId", registry.getCompanyId() - ); - ru.clearing.classes.statics.data.company.CompanySymbols companySymbol = companySymbolMap.getFirstObjectByFieldValues(innPredicates); - Security security = securitySelector.selectSecurityById(registry.getSecurityId()); - - excludeLiabilitiesRegister.setSessionId(registry.getSessionId()); - excludeLiabilitiesRegister.setValidFromDate(sessionBySessionId.getClearingDate()); - LocalDate validToDate = TimeUtil.toLocalDate(sessionBySessionId.getUpdated()); - excludeLiabilitiesRegister.setValidToDate(validToDate); - excludeLiabilitiesRegister.setCompanyId(registry.getCompanyId()); - excludeLiabilitiesRegister.setCompanyFullName(registry.getFullName()); - if (companySymbol != null) { - excludeLiabilitiesRegister.setInn(companySymbol.getCompanySymbolValue()); - } - excludeLiabilitiesRegister.setRegistryCode(registry.getRegistryCode()); - excludeLiabilitiesRegister.setAccount(registry.getAccount()); - excludeLiabilitiesRegister.setRegistryStatus(registry.getRegistryStatus()); - if (security == null) { - log.warn("Security id={} not found for registry id={}", registry.getSecurityId(), registry.getId()); - } else { - if (InstrumentType.RATE.equalsByKey(security.getInstrumentType())) { - excludeLiabilitiesRegister.setCurrency(((MoneyMarketSecurity) security).getNominalCurrency()); - } else if (InstrumentType.BOND.equalsByKey(security.getInstrumentType())) { - excludeLiabilitiesRegister.setCurrency(((FixedIncomeSecurity) security).getNominalCurrency()); - } else if (InstrumentType.EQTY.equalsByKey(security.getInstrumentType())) { - // не заполняется Currency - } else { // never - log.warn("Unexpected security[{}] type {}", security.getId(), security.getInstrumentType()); - } - } - excludeLiabilitiesRegister.setSumLiabilities(registry.getBalance()); - excludeLiabilitiesRegister.setSettlementDate(registry.getSettlementDate()); - excludeLiabilitiesRegister.setCreated(Instant.now()); - excludeLiabilitiesRegister.setUpdated(excludeLiabilitiesRegister.getCreated()); - excludeLiabilitiesRegisterMap.insert(excludeLiabilitiesRegister); - log.debug("inserted successfully ExcludeLiabilitiesRegister entity with id: {}", excludeLiabilitiesRegister.getId()); - } - - protected String getSqlForRegistries() { - return String.format("registryDesignation = '%s' and " + - "registryInstrumentType in ('%s','%s') and " + - "registryUnit = '%s' and " + - "registryStatus in ('%s', '%s')", - RegistryDesignation.O.getKey(), - RegistryInstrumentType.S.getKey(), - RegistryInstrumentType.M.getKey(), - RegistryUnit.T.getKey(), - RegistryStatus.FAIL.getKey(), - RegistryStatus.UNCV.getKey() - ); - } - - @Override - public Optional isDuplicateInMap(Registry entity) { - return Optional.empty(); -// Map> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId()); -// Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); -// if (message.isPresent()) { -// log.warn("Illegal value in map for request to imdg: {}", message.get()); -// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); -// } -// return Optional.ofNullable(excludeLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues)); - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java deleted file mode 100644 index 473971e4e..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java +++ /dev/null @@ -1,368 +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.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.account.Account; -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.register.ExecutionRegister; -import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.registry.reports.ReportUtils; -import ru.spcex.clearing.registry.reports.builders.ExecutionRegisterReportBuilder; -import ru.spcex.clearing.registry.util.PreClearMap; -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.enumeration.IEnumKey; -import ru.spcex.platform.utils.validation.IValidator; - -import java.io.File; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.util.*; -import java.util.function.Function; - -import static ru.spcex.clearing.imdg.IMDGDistributedNames.*; -import static ru.spcex.platform.enumeration.Task.createRegistry_ECNR; - -@Service -public class ExecutionRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg executionRegisterMap; - private final Imdg companySymbolsMap; - private final Imdg executionFondMap; - private final Imdg executionDepositMap; - private final Imdg tradingClearingRegistryMap; - private final Imdg accountImdg; - private final Function, IValidator> fieldValuesValidator; - private final PreClearMap preClearMap; - - private final ExecutionRegisterReportBuilder reportBuilder; - private final File outFolder; - private final RegistryServiceSettings settings; - - private final SFTPReportsConfig.ReportsGateway reportsSftpGateway; - private final boolean deleteAfterSend; - - - @Autowired - public ExecutionRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - Function, IValidator> fieldValuesValidator, - @Qualifier("reportOutDir") File outFolder, - RegistryServiceSettings settings, - SFTPReportsConfig.ReportsGateway reportsSftpGateway) { - super(kafkaQueue, kafkaProducer); - this.executionRegisterMap = imdgProvider.getImdg(Map_ExecutionRegister, ExecutionRegister.class); - this.companySymbolsMap = imdgProvider.getImdg(Map_CompanySymbols, CompanySymbols.class); - this.executionFondMap = imdgProvider.getImdg(Map_ExecutionFond, ExecutionFond.class); - this.executionDepositMap = imdgProvider.getImdg(Map_ExecutionDeposit, ExecutionDeposit.class); - this.tradingClearingRegistryMap = imdgProvider.getImdg(Map_TradingClearingRegistry, TradingClearingRegistry.class); - this.accountImdg = imdgProvider.getImdg(Map_Account, Account.class); - this.fieldValuesValidator = fieldValuesValidator; - this.settings = settings; - this.reportsSftpGateway = reportsSftpGateway; - this.outFolder = outFolder; - reportBuilder = new ExecutionRegisterReportBuilder(imdgProvider); - deleteAfterSend = settings.getReportsStore().isDeleteAfterSend(); - preClearMap = PreClearMap.instanceForInstantField(executionRegisterMap, "created"); - } - - @Override - public void afterPropertiesSet() { - callback(LauncherCommandRequest.class) - .setConsumer(this::executionRegisterNew) - .forDestination(createRegistry_ECNR.topic(), callbacks::put); - - - // TODO возможно deprecated -// callback(ExecutionRegisterOnSaveRequest.class) -// .setConsumer(this::executionRegisterOnSavingOfTrade) -// .forDestination(Consts.REGISTRY_EXECUTION_REGISTER_ON_SAVE, callbacks::put); - - init(); - } - - public void executionRegisterNew(BaseRequest userRequest) { - boolean csvMode = settings.isCsvMode(); - LocalDate localDateNow = LocalDate.now(); - log.debug("ExecutionRegisterNewRequest received"); - Collection collectionFond = executionFondMap.getCollectionObjectsByFieldValues( - Map.of( - "clearingDate", localDateNow, - "side", Side.SELL.getKey() - )); - Collection collectionDeposit = executionDepositMap.getCollectionObjectsByFieldValues( - Map.of( - "clearingDate", localDateNow, - "side", MoneyFlowSide.SELL.getKey() - )); - log.debug("Found {} ExecutionFond and {} ExecutionDeposit on clearingDate={}", - collectionFond.size(), collectionDeposit.size(), localDateNow); - if (!csvMode) preClearMap.preClearMap(); - List executionCommonForReport = new ArrayList<>(); - collectionFond.forEach(x -> { - if (!csvMode) insertExecutionRegister(true, x); - else executionCommonForReport.add(x); - }); - collectionDeposit.forEach(x -> { - if (!csvMode) insertExecutionRegister(false, x); - else executionCommonForReport.add(x); - }); - if (csvMode) { - File reportFile = reportBuilder.buildReport(executionCommonForReport, outFolder); - ReportUtils.sendFilesToSftp(List.of(reportFile), reportsSftpGateway, deleteAfterSend); - } - - log.debug("successfully processed..."); - } - - private void insertExecutionRegister(Boolean isFond, ExecutionCommon common) { - log.trace("Started generating ExecutionRegister entity..."); - - LocalDate tradingDate = common.getTradingDate(); - Long exchangeExecutionId = common.getExchangeExecutionId(); - Instant exchangeExecutionTime = common.getExchangeExecutionTime(); - Long securityId = common.getSecurityId(); - LocalDate clearingDate = common.getClearingDate(); - - Long sellerId; - String sellerClearingCode = null; - String sellerTradingClearingRegister; - String sellerMoneyAccount = null; - String sellerDepoAccount = null; - - Long buyerId; - String buyerClearingCode = null; - String buyerTradingClearingRegister; - String buyerMoneyAccount = null; - String buyerDepoAccount = null; - - BigDecimal amount; - BigDecimal quantity = null; - if (isFond) { - ExecutionFond executionFond = (ExecutionFond) common; - amount = executionFond.getSettlementAmount(); - quantity = executionFond.getQuantity(); - } else { - ExecutionDeposit executionDeposit = (ExecutionDeposit) common; - amount = executionDeposit.getFirstLegAmount(); - } - - TradingClearingRegistry tkrForCounterPartyTkrId = null; - if (common.getCounterPartyTradingClearingRegistryId() != null) { - tkrForCounterPartyTkrId = tradingClearingRegistryMap.getSingleObjectByID( - common.getCounterPartyTradingClearingRegistryId() - ); - } - TradingClearingRegistry tkrForTkrId = null; - if (common.getTradingClearingRegistryId() != null) { - tkrForTkrId = tradingClearingRegistryMap.getSingleObjectByID( - common.getTradingClearingRegistryId() - ); - } - Account moneyAccountForCounterPartyTkrId = null; - Account depoAccountForCounterPartyTkrId = null; - if (tkrForCounterPartyTkrId != null) { - if (tkrForCounterPartyTkrId.getMoneyAccountId() != null) - moneyAccountForCounterPartyTkrId = accountImdg.getSingleObjectByID(tkrForCounterPartyTkrId.getMoneyAccountId()); - if (tkrForCounterPartyTkrId.getDepoAccountId() != null) - depoAccountForCounterPartyTkrId = accountImdg.getSingleObjectByID(tkrForCounterPartyTkrId.getDepoAccountId()); - } - Account moneyAccountForTkrId = null; - Account depoAccountForTkrId = null; - if (tkrForTkrId != null) { - if (tkrForTkrId.getMoneyAccountId() != null) - moneyAccountForTkrId = accountImdg.getSingleObjectByID(tkrForTkrId.getMoneyAccountId()); - if (tkrForTkrId.getDepoAccountId() != null) - depoAccountForTkrId = accountImdg.getSingleObjectByID(tkrForTkrId.getDepoAccountId()); - } - - CompanySymbols companySymbolsForCompanyId = companySymbolsMap.getFirstObjectByFieldValues( - Map.of( - "companySymbol", CompanySymbol.CLRC.getKey(), - "companyId", common.getCompanyId() - ) - ); - CompanySymbols companySymbolsForCounterPartyId = companySymbolsMap.getFirstObjectByFieldValues( - Map.of( - "companySymbol", CompanySymbol.CLRC.getKey(), - "companyId", common.getCounterPartyId() - ) - ); - - String sideStr = common.getSide(); - MoneyFlowSide moneyFlowSide = IEnumKey.getEnumByKey(MoneyFlowSide.class, sideStr); - Side side = IEnumKey.getEnumByKey(Side.class, sideStr); - if (moneyFlowSide == MoneyFlowSide.BUY || side == Side.BUY) { - - sellerId = common.getCounterPartyId(); - buyerId = common.getCompanyId(); - - if (companySymbolsForCounterPartyId != null) - sellerClearingCode = companySymbolsForCounterPartyId.getCompanySymbolValue(); - sellerTradingClearingRegister = common.getCounterPartyTradingClearingRegistry(); - if (moneyAccountForCounterPartyTkrId != null) - sellerMoneyAccount = moneyAccountForCounterPartyTkrId.getAccount(); - if (depoAccountForCounterPartyTkrId != null) - sellerDepoAccount = depoAccountForCounterPartyTkrId.getAccount(); - - if (companySymbolsForCompanyId != null) - buyerClearingCode = companySymbolsForCompanyId.getCompanySymbolValue(); - buyerTradingClearingRegister = common.getPartyTradingClearingRegistry(); - if (moneyAccountForTkrId != null) buyerMoneyAccount = moneyAccountForTkrId.getAccount(); - if (depoAccountForTkrId != null) buyerDepoAccount = depoAccountForTkrId.getAccount(); - - } else { - - sellerId = common.getCompanyId(); - buyerId = common.getCounterPartyId(); - - if (companySymbolsForCompanyId != null) - sellerClearingCode = companySymbolsForCompanyId.getCompanySymbolValue(); - sellerTradingClearingRegister = common.getPartyTradingClearingRegistry(); - if (moneyAccountForTkrId != null) sellerMoneyAccount = moneyAccountForTkrId.getAccount(); - if (depoAccountForTkrId != null) sellerDepoAccount = depoAccountForTkrId.getAccount(); - - if (companySymbolsForCounterPartyId != null) - buyerClearingCode = companySymbolsForCounterPartyId.getCompanySymbolValue(); - buyerTradingClearingRegister = common.getCounterPartyTradingClearingRegistry(); - if (moneyAccountForCounterPartyTkrId != null) - buyerMoneyAccount = moneyAccountForCounterPartyTkrId.getAccount(); - if (depoAccountForCounterPartyTkrId != null) - buyerDepoAccount = depoAccountForCounterPartyTkrId.getAccount(); - - } - - ExecutionRegister executionRegister = new ExecutionRegister(); - executionRegister.setTradingDate(tradingDate); - executionRegister.setExchangeExecutionId(exchangeExecutionId); - executionRegister.setExchangeExecutionTime(exchangeExecutionTime); - executionRegister.setSecurityId(securityId); - executionRegister.setSellerId(sellerId); - executionRegister.setSellerClearingCode(sellerClearingCode); - executionRegister.setSellerTradingClearingRegister(sellerTradingClearingRegister); - executionRegister.setSellerMoneyAccount(sellerMoneyAccount); - executionRegister.setSellerDepoAccount(sellerDepoAccount); - executionRegister.setBuyerId(buyerId); - executionRegister.setBuyerClearingCode(buyerClearingCode); - executionRegister.setBuyerTradingClearingRegister(buyerTradingClearingRegister); - executionRegister.setBuyerMoneyAccount(buyerMoneyAccount); - executionRegister.setBuyerDepoAccount(buyerDepoAccount); - executionRegister.setAmount(amount); - executionRegister.setQuantity(quantity); - executionRegister.setClearingDate(clearingDate); - executionRegister.setCreated(Instant.now()); - executionRegisterMap.insert(executionRegister); - log.debug("inserted successfully ExecutionRegister entity with id: {}", executionRegister.getId()); - } - - - // TODO возможно deprecated - //public void executionRegisterOnSavingOfTrade(BaseRequest userRequest) { - // ExecutionRegisterOnSaveRequest request = userRequest.getRequestPayload(); - // ExecutionCommon common = setUpExecutionCommon(request); - // boolean isFond = request.isExecutionFond(); - // Optional optionalDuplicate = isDuplicateInMap(common); - // if (optionalDuplicate.isEmpty()) { - // insertExecutionRegister(isFond, common); - // } else { - // updateExecutionRegister(isFond, common, optionalDuplicate.get()); - // } - //} - - // TODO возможно deprecated - //private void updateExecutionRegister(boolean isFond, ExecutionCommon common, ExecutionRegister registerToUpdate) { - // log.trace("Started updating ExecutionRegister entity..."); - // registerToUpdate.setSecurityId(common.getSecurityId()); - // registerToUpdate.setExchangeExecutionTime(common.getExchangeExecutionTime()); - // registerToUpdate.setAmount(isFond ? ((ExecutionFond) common).getSettlementAmount() : ((ExecutionDeposit) common).getFirstLegAmount()); - // registerToUpdate.setQuantity(isFond ? common.getQuantity() : null); - // registerToUpdate.setUpdated(Instant.now()); - // executionRegisterMap.update(registerToUpdate); - // log.debug("Updated successfully ExecutionRegister entity with id: {}", registerToUpdate.getId()); - //} - - - // todo возможно deprecated - //private ExecutionCommon setUpExecutionCommon(ExecutionRegisterOnSaveRequest request) { - // ExecutionFond fond = null; - // ExecutionDeposit deposit = null; - // if (request.isExecutionFond()) { - // fond = new ExecutionFond(); - // fond.setExchangeOrderId(request.getExchangeOrderId()); - // fond.setSettlementAmount(request.getSettlementAmount()); - // fond.setComment(request.getComment()); - // fond.setClientCodeId(request.getClientCodeId()); - // fond.setSettlementCode(request.getSettlementCode()); - // fond.setSettlementDate(request.getSettlementDate()); - // fond.setExchangeExecutionMicroseconds(request.getExchangeExecutionMicroseconds()); - // } else { - // deposit = new ExecutionDeposit(); - // deposit.setFirstLegAmount(request.getFirstLegAmount()); - // deposit.setSecondLegAmount(request.getSecondLegAmount()); - // deposit.setFirstLegSettlementDate(request.getFirstLegSettlementDate()); - // deposit.setSecondLegSettlementDate(request.getSecondLegSettlementDate()); - // deposit.setFirstLegSettlementCode(request.getFirstLegSettlementCode()); - // deposit.setSecondLegSettlementCode(request.getSecondLegSettlementCode()); - // deposit.setContract(request.getContract()); - // deposit.setSecurityCode(request.getSecurityCode()); - // } - // boolean isFond = fond != null; - // ExecutionCommon common = isFond ? fond : deposit; - // common.setExchangeExecutionId(request.getExchangeExecutionId()); - // common.setExchangeExecutionTime(request.getExchangeExecutionTime()); - // common.setTradingDate(request.getTradingDate()); - // common.setTradingClearingRegistryId(request.getTradingClearingRegistryId()); - // common.setMarket(request.getMarket()); - // common.setPrice(request.getPrice()); - // common.setLots(request.getLots()); - // common.setQuantity(request.getQuantity()); - // common.setInterestAmount(request.getInterestAmount()); - // common.setSide(request.getSide()); - // common.setSettlementCurrency(request.getSettlementCurrency()); - // common.setCompanyId(request.getCompanyId()); - // common.setDuration(request.getDuration()); - // common.setSecurityFullName(request.getSecurityFullName()); - // common.setSecuritySymbol(request.getSecuritySymbol()); - // common.setSecurityId(request.getSecurityId()); - // common.setCounterPartyId(request.getCounterPartyId()); - // common.setCoverageStatus(request.getCoverageStatus()); - // common.setSessionId(request.getSessionId()); - // common.setClearingDate(request.getClearingDate()); - // return common; - //} - - @Deprecated - @Override - public Optional isDuplicateInMap(ExecutionCommon entity) { - return Optional.empty(); -// Map> map = Map.of("exchangeExecutionId", entity.getExchangeExecutionId(), -// "tradingDate", LocalDate.now()); //clarify timezone -// Optional message = fieldValuesValidator.apply(map).tillFirstError(); -// if (message.isPresent()) { -// log.warn("Illegal value in map for request to imdg: {}", message.get()); -// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); -// } -// return Optional.ofNullable(executionRegisterMap.getSingleObjectByFieldValues(map)); - } - -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ICheckDuplicate.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ICheckDuplicate.java deleted file mode 100644 index 9f56227d0..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ICheckDuplicate.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import java.util.Optional; - -/** - * @param - тип объекта по которому мы будем проверять наличие дубликата - * @param - тип объекта (реестра) который мы нашли как дубликат - * */ -public interface ICheckDuplicate { - /** - * @return возвращает optional с дубликатом - * */ - Optional isDuplicateInMap(T entity); -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java deleted file mode 100644 index 0cc52a880..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java +++ /dev/null @@ -1,196 +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.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.register.LiabilitiesRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; -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.LiabilitiesRegisterNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.registry.reports.ReportUtils; -import ru.spcex.clearing.registry.reports.builders.LiabilitiesRegistryReportBuilder; -import ru.spcex.clearing.registry.util.PreClearMap; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; -import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; -import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; -import ru.spcex.platform.utils.time.TimeUtil; -import ru.spcex.platform.utils.validation.IValidator; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDate; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; - -import static ru.spcex.platform.enumeration.Task.createRegistry_LBSR; - -@Service -public class LiabilitiesRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg liabilitiesRegisterMap; - private final Imdg registryMap; - private final Imdg sessionMap; - private final Imdg companySymbolsMap; - private final SecuritySelector securitySelector; - private final Function, IValidator> fieldValuesValidator; - private final PreClearMap preClearMap; - private final LiabilitiesRegistryReportBuilder reportBuilder; - private final File outFolder; - private final RegistryServiceSettings settings; - private final SFTPReportsConfig.ReportsGateway reportsSftpGateway; - private final boolean deleteAfterSend; - - @Autowired - public LiabilitiesRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - Function, IValidator> fieldValuesValidator, - @Qualifier("reportOutDir") File outFolder, - RegistryServiceSettings settings, - SFTPReportsConfig.ReportsGateway reportsSftpGateway) { - super(kafkaQueue, kafkaProducer); - this.liabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesRegister, LiabilitiesRegister.class); - this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - this.companySymbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); - this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); - this.fieldValuesValidator = fieldValuesValidator; - preClearMap = PreClearMap.instanceForInstantField(liabilitiesRegisterMap, "created"); - reportBuilder = new LiabilitiesRegistryReportBuilder(imdgProvider); - this.outFolder = outFolder; - this.settings = settings; - this.reportsSftpGateway = reportsSftpGateway; - this.deleteAfterSend = settings.getReportsStore().isDeleteAfterSend(); - } - - @Override - public void afterPropertiesSet() { - callback(LiabilitiesRegisterNewRequest.class) - .setConsumer(this::liabilitiesRegisterNew) - .forDestination(Consts.REGISTRY_LIABILITIES_REGISTER_NEW, callbacks::put); - callback(LauncherCommandRequest.class) - .setConsumer(this::liabilitiesRegisterNew) - .forDestination(createRegistry_LBSR.topic(), callbacks::put); - init(); - } - - - public void liabilitiesRegisterNew(BaseRequest userRequest) { - log.debug("LiabilitiesRegisterNewRequest received from {}", createRegistry_LBSR.topic()); - boolean csvMode = settings.isCsvMode(); - - ImdgPredicate conditionForRegistry = getPredicateForRegistries(); - Collection registries = registryMap.getCollectionObjectsByPredicate(conditionForRegistry); - log.debug("Found {} Registry by query {}", registries.size(), conditionForRegistry); - if (!csvMode) - preClearMap.preClearMap(); -// registries.forEach((registry -> { -// if (isDuplicateInMap(registry).isEmpty()) { -// if (!csvMode || LocalDate.now().equals(registry.getTradingDate())) -// insertLiabilitiesRegister(registry); -// } -// } -// )); - if (csvMode) { - File reportFile = reportBuilder.buildReport(registries, outFolder); - ReportUtils.sendFilesToSftp(List.of(reportFile), reportsSftpGateway, deleteAfterSend); - } - log.debug("successfully processed"); - } - -// private void insertLiabilitiesRegister(Registry registry) { -// log.trace("Started generating LiabilitiesRegister entity..."); -// LiabilitiesRegister liabilitiesRegister = new LiabilitiesRegister(); -// Session session = sessionMap.getSingleObjectByID(registry.getSessionId()); -// CompanySymbols companySymbols = companySymbolsMap.getFirstObjectByFieldValues( -// Map.of("companyId", registry.getCompanyId(), -// "companySymbol", CompanySymbol.INN.getKey() -// ) -// ); -// Security security = securitySelector.selectSecurityById(registry.getSecurityId()); -// if (session == null) { -// log.warn("Session is empty!"); -// } else { -// liabilitiesRegister.setValidFromDate(session.getClearingDate()); -// liabilitiesRegister.setValidToDate(TimeUtil.toLocalDate(session.getUpdated())); -// } -// if (companySymbols == null) { -// log.warn("CompanySymbols not found, for companyId={}", registry.getCompanyId()); -// } else { -// liabilitiesRegister.setInn(companySymbols.getCompanySymbolValue()); -// } -// if (security == null) { -// log.warn("Security id={} not found for registry id={}", registry.getSecurityId(), registry.getId()); -// } else { -// if (InstrumentType.RATE.equalsByKey(security.getInstrumentType())) { -// liabilitiesRegister.setCurrency(((MoneyMarketSecurity) security).getNominalCurrency()); -// } else if (InstrumentType.BOND.equalsByKey(security.getInstrumentType())) { -// liabilitiesRegister.setCurrency(((FixedIncomeSecurity) security).getNominalCurrency()); -// } else if (InstrumentType.EQTY.equalsByKey(security.getInstrumentType())) { -// // не заполняется Currency -// } else { // never -// log.warn("Unexpected security[{}] type {}", security.getId(), security.getInstrumentType()); -// } -// } -// liabilitiesRegister.setSessionId(registry.getSessionId()); -// liabilitiesRegister.setValidFromDate(session.getClearingDate()); -// LocalDate validToDate = TimeUtil.toLocalDate(session.getUpdated()); -// liabilitiesRegister.setValidToDate(validToDate); -// liabilitiesRegister.setCompanyId(registry.getCompanyId()); -// liabilitiesRegister.setCompanyFullName(registry.getFullName()); -// liabilitiesRegister.setRegistryCode(registry.getRegistryCode()); -// liabilitiesRegister.setAccount(registry.getAccount()); -// liabilitiesRegister.setRegistryStatus(registry.getRegistryStatus()); -// liabilitiesRegister.setSumLiabilities(registry.getBalance()); -// liabilitiesRegister.setSettlementDate(registry.getSettlementDate()); -// liabilitiesRegister.setCreated(Instant.now()); -// liabilitiesRegister.setUpdated(liabilitiesRegister.getCreated()); -// liabilitiesRegisterMap.insert(liabilitiesRegister); -// log.debug("inserted successfully LiabilitiesRegister entity with id: {}", liabilitiesRegister.getId()); -// } - - protected ImdgPredicate getPredicateForRegistries() { - ImdgPredicateBuilder pb = registryMap.predicateBuilder(); - return pb.and( - RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.OM_T, RegistryTradingParams.OS_T).buildPredicate(pb), - pb.equals("registryStatus", RegistryStatus.CLRD.getKey()), - pb.equals("settlementDate", LocalDate.now()) - ); -// return String.format("registryDesignation = '%s' and " + -// "registryInstrumentType in ('%s','%s') and " + -// "registryUnit = '%s'", -// RegistryDesignation.L.getKey(), -// RegistryInstrumentType.S.getKey(), -// RegistryInstrumentType.M.getKey(), -// RegistryUnit.T.getKey()); - } - - @Override - public Optional isDuplicateInMap(Registry entity) { - return Optional.empty(); - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java deleted file mode 100644 index 156f4154b..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java +++ /dev/null @@ -1,168 +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.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.register.MoneyBalanceRegister; -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.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.registry.reports.ReportUtils; -import ru.spcex.clearing.registry.reports.builders.MoneyBalanceRegisterReportBuilder; -import ru.spcex.clearing.registry.util.PreClearMap; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.RegistryTradingParams; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; -import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; -import ru.spcex.platform.utils.enumeration.IEnumKey; - -import java.io.File; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import static ru.spcex.platform.enumeration.Task.createRegistry_GBRR; - -@Service -public class MoneyBalanceRegisterService extends QueueConsumer implements InitializingBean { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg moneyBalanceRegisterMap; - private final Imdg registryHistoryMap; - private final Imdg companyMap; - private final PreClearMap preClearMap; - - private final MoneyBalanceRegisterReportBuilder reportBuilder; - private final File outFolder; - RegistryServiceSettings settings; - - private final SFTPReportsConfig.ReportsGateway reportsSftpGateway; - private final boolean deleteAfterSend; - - - @Autowired - public MoneyBalanceRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - RegistryServiceSettings settings, - @Qualifier("reportOutDir") File outFolder, - SFTPReportsConfig.ReportsGateway reportsSftpGateway) { - super(kafkaQueue, kafkaProducer); - this.moneyBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyBalanceRegister, MoneyBalanceRegister.class); - this.registryHistoryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryHistory, RegistryHistory.class); - this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - preClearMap = PreClearMap.instanceForInstantField(moneyBalanceRegisterMap, "created"); - reportBuilder = new MoneyBalanceRegisterReportBuilder(imdgProvider); - this.outFolder = outFolder; - this.settings = settings; - this.reportsSftpGateway = reportsSftpGateway; - this.deleteAfterSend = settings.getReportsStore().isDeleteAfterSend(); - } - - @Override - public void afterPropertiesSet() { -// callback(LauncherCommandRequest.class) -// .setConsumer(this::moneyBalanceRegisterNew) -// .forDestination(createRegistry_GBRR.topic(), callbacks::put); -// init(); - log.warn("MoneyBalanceRegisterService topic GBRR disabled."); - } - - public void moneyBalanceRegisterNew(BaseRequest userRequest) { - boolean csvMode = settings.isCsvMode(); - log.debug("LauncherCommandRequest received from {}", createRegistry_GBRR.topic()); - ImdgPredicate predicate = getSqlForRegistryHistory(userRequest.getRequestPayload().getCompanyId()); - Collection registryHistories = registryHistoryMap.getCollectionObjectsByPredicate(predicate); - if (registryHistories.isEmpty()) { - log.debug("No registry history with such conditions {}", predicate); - return; - } - log.debug("Select {} Registry history by query {}", registryHistories.size(), predicate); - if (!csvMode) preClearMap.preClearMap(); - List registryForReport = new ArrayList<>(); - for (RegistryHistory registryHistory : registryHistories) { - AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registryHistory.getObject().getAccountType()); - if (accountType != AccountType.Info && - BigDecimal.ZERO.compareTo(registryHistory.getObject().getDiffBalance()) != 0) { - log.trace("Ignore id={}, cause diffBalance is not zero.", registryHistory.getObject().getId()); - continue; - } - if (!csvMode) insertMoneyBalanceRegister(registryHistory); - else registryForReport.add(registryHistory); - } - if (csvMode) { - File reportFile = reportBuilder.buildReport(registryForReport, outFolder); - ReportUtils.sendFilesToSftp(List.of(reportFile), reportsSftpGateway, deleteAfterSend); - } - log.debug("successfully processed"); - } - - private void insertMoneyBalanceRegister(RegistryHistory registryHistory) { - log.trace("Started generating MoneyBalanceRegister entity..."); - Registry registry = registryHistory.getObject(); - MoneyBalanceRegister moneyBalanceRegister = new MoneyBalanceRegister(); - - Company company = companyMap.getFirstObjectByFieldValues(Map.of("id", 2L)); - String setHouseName = company != null ? company.getShortName() : null; - - AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType()); - String account = null; - if (accountType == AccountType.Clrn || accountType == AccountType.Info) { - account = registry.getAccount(); - } - moneyBalanceRegister.setSetHouseName(setHouseName); - moneyBalanceRegister.setCreated(Instant.now()); - moneyBalanceRegister.setCompanyId(registry.getCompanyId()); - moneyBalanceRegister.setAccount(account); - moneyBalanceRegister.setRemainderSum(registry.getBalance()); - moneyBalanceRegister.setUpdated(moneyBalanceRegister.getCreated()); - moneyBalanceRegisterMap.insert(moneyBalanceRegister); - log.debug("inserted successfully MoneyBalanceRegister entity with id: {}", moneyBalanceRegister.getId()); - } - - protected ImdgPredicate getSqlForRegistryHistory(Long companyId) { - Instant now = Instant.now().truncatedTo(ChronoUnit.DAYS); - ImdgPredicateBuilder pb = registryHistoryMap.predicateBuilder(); - RegistryCodeSqlBuilder codeSql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM_T).prefix("object"); - ImdgPredicate registryPredicate; - if (companyId == null) { - registryPredicate = pb.sql(codeSql.build()); - } else { - registryPredicate = pb.and( - pb.equals("object.companyId", companyId), - pb.sql(codeSql.build()) - ); - } - ImdgPredicate finalPredicate = pb.and( - registryPredicate, - pb.notNull("object.tradingClearingRegistry"), - // фильтрация по "object.accountType"==Info or diffBalance==0.0 в коде выше по moneyBalanceRegisterNew - pb.and( - pb.greatEqual("eventTime", now), - pb.less("eventTime", now.plus(1, ChronoUnit.DAYS)) - ) - ); - - log.trace("sql predicate for registry_history {}", finalPredicate); - return finalPredicate; - } - -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java deleted file mode 100644 index 77c79ee0e..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java +++ /dev/null @@ -1,166 +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.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.payment.PaymentInstruction; -import ru.clearing.classes.statics.data.register.MoneyPaymentInstructionRegister; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.registry.reports.ReportUtils; -import ru.spcex.clearing.registry.reports.builders.MoneyPaymentInstructionRegisterReportBuilder; -import ru.spcex.clearing.registry.util.PreClearMap; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.TransactionStatus; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.IEnumKey; -import ru.spcex.platform.utils.validation.IValidator; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDate; -import java.util.*; -import java.util.function.Function; - -import static ru.spcex.platform.enumeration.Task.createRegistry_GORR; - -@Service -public class MoneyPaymentInstructionRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate { - private final static String TOPIC_NAME = createRegistry_GORR.topic(); - private final Logger log = LoggerFactory.getLogger(getClass()); - private final Imdg moneyPaymentInstructionRegisterMap; - private final Imdg paymentInstructionMap; - private final Imdg sessionMap; - private final Function, IValidator> fieldValuesValidator; - private final Imdg companyMap; - private final Imdg accountMap; - private final PreClearMap preClearMap; - - private final MoneyPaymentInstructionRegisterReportBuilder reportBuilder; - private final File outFolder; - private final RegistryServiceSettings settings; - - private final SFTPReportsConfig.ReportsGateway reportsSftpGateway; - private final boolean deleteAfterSend; - - - @Autowired - public MoneyPaymentInstructionRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - Function, IValidator> fieldValuesValidator, - @Qualifier("reportOutDir") File outFolder, - RegistryServiceSettings settings, - SFTPReportsConfig.ReportsGateway reportsSftpGateway) { - super(kafkaQueue, kafkaProducer); - this.moneyPaymentInstructionRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyPaymentInstructionRegister, MoneyPaymentInstructionRegister.class); - this.paymentInstructionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); - this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); - this.fieldValuesValidator = fieldValuesValidator; - preClearMap = PreClearMap.instanceForInstantField(moneyPaymentInstructionRegisterMap, "created"); - reportBuilder = new MoneyPaymentInstructionRegisterReportBuilder(imdgProvider); - this.outFolder = outFolder; - this.settings = settings; - this.reportsSftpGateway = reportsSftpGateway; - this.deleteAfterSend = settings.getReportsStore().isDeleteAfterSend(); - } - - @Override - public void afterPropertiesSet() { - callback(LauncherCommandRequest.class) - .setConsumer(this::moneyPaymentInstructionRegisterNew) - .forDestination(TOPIC_NAME, callbacks::put); - init(); - } - - public void moneyPaymentInstructionRegisterNew(BaseRequest userRequest) { - boolean csvMode = settings.isCsvMode(); - log.debug("LauncherCommandRequest received from {}", TOPIC_NAME); - - String piQuery = "transactionStatus='" + TransactionStatus.sent.getKey() + "' OR transactionStatus = '" + - TransactionStatus.stld.getKey() + "' OR transactionStatus = '" + TransactionStatus.ok.getKey() + "'"; - Collection paymentInstructions = paymentInstructionMap.getCollectionObjectsBySQL(piQuery); - log.debug("Selected {} PaymentInstruction by query \"{}\", do filter by account...", - paymentInstructions.size(), piQuery); - Collection moneyPaymentInstructions = new ArrayList<>(); - for (PaymentInstruction paymentInstruction : paymentInstructions) { - // filter by accountType - if (paymentInstruction.getCreditLeg_accountId() != null) { - Account account = accountMap.getSingleObjectByID(paymentInstruction.getCreditLeg_accountId()); - if (account == null) - log.warn("Account id={} not found for paymentInstruction.id={}", - paymentInstruction.getCreditLeg_accountId(), paymentInstruction.getId()); - else { - if (IEnumKey.contains(account.getAccountType(), AccountType.Clrn, AccountType.Info, AccountType.Anlt, AccountType.Tran)) { - moneyPaymentInstructions.add(paymentInstruction); - } - } - } - } - log.debug("Filtered {} PaymentInstruction, with money account's", moneyPaymentInstructions.size()); - - if (!csvMode) preClearMap.preClearMap(); - List paymentInstructionsForReport = new ArrayList<>(); - for (PaymentInstruction paymentInstruction : moneyPaymentInstructions) { - if (isDuplicateInMap(paymentInstruction).isEmpty()) { - if (!csvMode) insertMoneyPaymentInstructionRegister(paymentInstruction); - else if (LocalDate.now().equals(paymentInstruction.getClearingDate())) - paymentInstructionsForReport.add(paymentInstruction); - } - } - if (csvMode) { - File reportFile = reportBuilder.buildReport(paymentInstructionsForReport, outFolder); - ReportUtils.sendFilesToSftp(List.of(reportFile), reportsSftpGateway, deleteAfterSend); - } - log.debug("successfully processed"); - } - - private void insertMoneyPaymentInstructionRegister(PaymentInstruction paymentInstruction) { - log.trace("Started generating PaymentInstruction entity..."); - MoneyPaymentInstructionRegister moneyPaymentInstructionRegister = new MoneyPaymentInstructionRegister(); - moneyPaymentInstructionRegister.setCreditLegAccount(paymentInstruction.getCreditLeg_account()); - moneyPaymentInstructionRegister.setCreditLegAmount(paymentInstruction.getCreditLeg_amount()); - moneyPaymentInstructionRegister.setCreditLegCurrencyCode(paymentInstruction.getCreditLeg_currencyCode()); - moneyPaymentInstructionRegister.setDebitLegAccount(paymentInstruction.getDebitLeg_account()); - if (paymentInstruction.getSenderId() != null) { - Company companyForInjectionBySenderId = companyMap.getSingleObjectByID(paymentInstruction.getSenderId()); - moneyPaymentInstructionRegister.setSender(companyForInjectionBySenderId != null ? companyForInjectionBySenderId.getShortName() : null); - } - if (paymentInstruction.getAddresseeId() != null) { - Company companyForInjectionByAddresseeId = companyMap.getSingleObjectByID(paymentInstruction.getAddresseeId()); - moneyPaymentInstructionRegister.setAddressee(companyForInjectionByAddresseeId != null ? companyForInjectionByAddresseeId.getShortName() : null); - } - moneyPaymentInstructionRegister.setClearingDate(paymentInstruction.getClearingDate()); - moneyPaymentInstructionRegister.setCreated(Instant.now()); - moneyPaymentInstructionRegister.setUpdated(moneyPaymentInstructionRegister.getCreated()); - moneyPaymentInstructionRegisterMap.insert(moneyPaymentInstructionRegister); - log.debug("inserted successfully PaymentInstruction entity with id: {}", paymentInstruction.getId()); - } - - @Override - public Optional isDuplicateInMap(PaymentInstruction entity) { - return Optional.empty(); -// Map> fieldValuesCompanyIdSessionId = Map.of("senderId", entity.getSenderId(), "date", entity.getClearingDate()); -// Optional message = fieldValuesValidator.apply(fieldValuesCompanyIdSessionId).tillFirstError(); -// if (message.isPresent()) { -// log.warn("Illegal value in map for request to imdg: {}", message.get()); -// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); -// } -// return Optional.ofNullable(moneyPaymentInstructionRegisterMap.getFirstObjectByFieldValues(fieldValuesCompanyIdSessionId)); - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityRunner.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityRunner.java new file mode 100644 index 000000000..1c2fadb98 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityRunner.java @@ -0,0 +1,119 @@ +package ru.spcex.clearing.registry.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import ru.spcex.clearing.registry.reports.bean.*; +import ru.spcex.clearing.registry.reports.builders.*; +import ru.spcex.clearing.registry.reports.loaders.*; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.*; + +@Service +public class RegisterUtilityRunner { + protected final Logger log = LoggerFactory.getLogger(getClass()); + private final DepoInstructionLoader depoInstructionLoader; + private final DepoBalanceLoader depoBalanceLoader; + private final MoneyInstructionLoader moneyInstructionLoader; + private final MoneyBalanceLoader moneyBalanceLoader; + private final ExecutionDepositLoader executionDepositLoader; + private final ExecutionFondLoader executionFondLoader; + private final RegistryLoader registryLoader; + + private final DepoPaymentInstructionBuilder depoPaymentInstructionBuilder; + private final DepoBalanceRegisterReportBuilder depoBalanceRegisterReportBuilder; + private final MoneyPaymentInstructionRegisterReportBuilder moneyPaymentInstructionRegisterReportBuilder; + private final MoneyBalanceRegisterReportBuilder moneyBalanceRegisterReportBuilder; + private final ExecutionRegisterReportBuilder executionRegisterReportBuilder; + private final LiabilitiesRegistryReportBuilder liabilitiesRegistryReportBuilder; + + private final File outFolder; + + public RegisterUtilityRunner(DepoInstructionLoader depoInstructionLoader, + DepoBalanceLoader depoBalanceLoader, + MoneyInstructionLoader moneyInstructionLoader, + MoneyBalanceLoader moneyBalanceLoader, + ExecutionDepositLoader executionDepositLoader, + ExecutionFondLoader executionFondLoader, + RegistryLoader registryLoader, + DepoPaymentInstructionBuilder depoPaymentInstructionBuilder, + DepoBalanceRegisterReportBuilder depoBalanceRegisterReportBuilder, + MoneyPaymentInstructionRegisterReportBuilder moneyPaymentInstructionRegisterReportBuilder, + MoneyBalanceRegisterReportBuilder moneyBalanceRegisterReportBuilder, + ExecutionRegisterReportBuilder executionRegisterReportBuilder, + LiabilitiesRegistryReportBuilder liabilitiesRegistryReportBuilder, + File outFolder) { + this.depoInstructionLoader = depoInstructionLoader; + this.depoBalanceLoader = depoBalanceLoader; + this.moneyInstructionLoader = moneyInstructionLoader; + this.moneyBalanceLoader = moneyBalanceLoader; + this.executionDepositLoader = executionDepositLoader; + this.executionFondLoader = executionFondLoader; + this.registryLoader = registryLoader; + this.depoPaymentInstructionBuilder = depoPaymentInstructionBuilder; + this.depoBalanceRegisterReportBuilder = depoBalanceRegisterReportBuilder; + this.moneyPaymentInstructionRegisterReportBuilder = moneyPaymentInstructionRegisterReportBuilder; + this.moneyBalanceRegisterReportBuilder = moneyBalanceRegisterReportBuilder; + this.executionRegisterReportBuilder = executionRegisterReportBuilder; + this.liabilitiesRegistryReportBuilder = liabilitiesRegistryReportBuilder; + this.outFolder = outFolder; + log.info("Папка outFolder: {}", outFolder.getAbsolutePath()); + } + + public void process() throws InterruptedException { + List executionDeposits = new ArrayList<>(); + List executionFonds = new ArrayList<>(); + List moneyPaymentInstruction = new ArrayList<>(); + List depoPaymentInstruction = new ArrayList<>(); + List moneyBalances = new ArrayList<>(); + List depoBalances = new ArrayList<>(); + List registrys = new ArrayList<>(); + + List> catchExceptions = new ArrayList<>(); + ExecutorService executorService = Executors.newFixedThreadPool(1); + try { + catchExceptions.add(executorService.submit(() -> executionDeposits.addAll(executionDepositLoader.loadObjects()))); + catchExceptions.add(executorService.submit(() -> executionFonds.addAll(executionFondLoader.loadObjects()))); + catchExceptions.add(executorService.submit(() -> depoPaymentInstruction.addAll(depoInstructionLoader.loadObjects()))); + catchExceptions.add(executorService.submit(() -> moneyPaymentInstruction.addAll(moneyInstructionLoader.loadObjects()))); + catchExceptions.add(executorService.submit(() -> moneyBalances.addAll(moneyBalanceLoader.loadObjects()))); + catchExceptions.add(executorService.submit(() -> depoBalances.addAll(depoBalanceLoader.loadObjects()))); + catchExceptions.add(executorService.submit(() -> registrys.addAll(registryLoader.loadObjects()))); + } finally { + executorService.shutdown(); + } + boolean finished = executorService.awaitTermination(2, TimeUnit.HOURS); + if (!finished) { + log.error("ExecutionService не успел завершиться корректно!"); + } + for (Future task : catchExceptions) { // распечатать возникшие ошибки загрузки + if (task.isDone()) try { + task.get(); + } catch (ExecutionException ex) { + log.error("At loader thread: ", ex.getCause()); + } + else { + log.warn("One of task has not finished."); + } + } + + depoPaymentInstructionBuilder.buildReport(depoPaymentInstruction, outFolder); + depoBalanceRegisterReportBuilder.buildReport(depoBalances, outFolder); + moneyPaymentInstructionRegisterReportBuilder.buildReport(moneyPaymentInstruction, outFolder); + moneyBalanceRegisterReportBuilder.buildReport(moneyBalances, outFolder); + liabilitiesRegistryReportBuilder.buildReport(registrys, outFolder); + + Set executionCommons = new HashSet<>(); + executionCommons.addAll(executionDeposits); + executionCommons.addAll(executionFonds); + executionRegisterReportBuilder.buildReport(executionCommons, outFolder); + log.info("Все отчёты завершены."); + // todo возможно понадобится отсылать на SFTP ReportUtils.sendFilesToSftp + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityService.java new file mode 100644 index 000000000..dd005815f --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityService.java @@ -0,0 +1,88 @@ +package ru.spcex.clearing.registry.service; + +import org.apache.commons.lang3.exception.ExceptionUtils; +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 ru.spcex.clearing.platform.messaging.domain.ActionType; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.platform.messaging.service.Status; +import ru.spcex.clearing.registry.conf.CmdArgsParser; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.platform.enumeration.Task; + +import java.time.LocalDate; + +public class RegisterUtilityService extends QueueConsumer implements InitializingBean { + protected final Logger log = LoggerFactory.getLogger(getClass()); + private RegisterUtilityRunner runner; + private AProperties properties; + private CmdArgsParser cmdArgsParser; + + public RegisterUtilityService(RegisterUtilityRunner runner, + AProperties properties, CmdArgsParser cmdArgsParser, + Consumer kafkaQueue, + Producer kafkaResponseQueue) { + super(kafkaQueue, kafkaResponseQueue); + this.runner = runner; + this.properties = properties; + this.cmdArgsParser = cmdArgsParser; + } + + @Override + public void afterPropertiesSet() throws Exception { + callback(LauncherCommandRequest.class) + .setFunction(this::processRequest) + .forDestination(Task.createRegistry_GBRR.topic(), callbacks::put); + init(); + log.info("{} started. Listen topic \"{}\"", + getClass().getSimpleName(), Task.createRegistry_GBRR.topic()); + } + + public RequestInfoUpdate processRequest(BaseRequest request) { + try { + log.info("ReportRequestWithPeriod id={} action {}", request.getId(), request.getActionType()); + if (request.getActionType() == ActionType.DELETE) { + throw new IllegalArgumentException("Action " + request.getActionType() + " not implemented for report"); + } + LocalDate from = null, to = null; + LauncherCommandRequest req = request.getRequestPayload(); + if (req != null) { + from = req.getFromDate(); + to = req.getToDate(); + } + this.process(from, to); + } catch (Exception e) { + log.error("Ошибка при формировании отчёта: {}", ExceptionUtils.getStackTrace(e)); + RequestInfoUpdate requestInfoUpdate = new RequestInfoUpdate(); + requestInfoUpdate.setId(request.getId()); + requestInfoUpdate.setStatus(Status.Error); + requestInfoUpdate.setMessage("Ошибка: " + e.toString()); // (Error) Ошибка: Ошибка: ru.spcex.clearing.utilities.exceptions.CmdArgsParserException: Дата startDate=2024-05-16 должна быть до endDate=2024-05-02 + if (e instanceof InterruptedException) { + Thread.currentThread().interrupt(); + } + return requestInfoUpdate; + } + return null; + } + + public synchronized void process(LocalDate fromDate, LocalDate toDate) throws InterruptedException { + if (fromDate == null && toDate == null) { + toDate = LocalDate.now().withDayOfMonth(1).minusDays(1); + fromDate = toDate.withDayOfMonth(1); + log.debug("Даты не указаны - отчёты за предыдущий месяц."); + } + properties.getPeriod().setStartDate(fromDate); + properties.getPeriod().setEndDate(toDate); + cmdArgsParser.validatePeriodProperties(properties.getPeriod()); + log.info("Запуск всех отчётов за период с {} по {}.", + properties.getPeriod().getStartDate(), properties.getPeriod().getEndDate()); + runner.process(); + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/FieldValuesValidator.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/FieldValuesValidator.java deleted file mode 100644 index e897308e2..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/FieldValuesValidator.java +++ /dev/null @@ -1,33 +0,0 @@ -package ru.spcex.clearing.registry.util; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -@Deprecated -public class FieldValuesValidator { - public static List delete2(Map map) { - List errors = new ArrayList<>(); - map.forEach((key, value) -> { - if (key == null) { - errors.add("Key is null!"); - } else if (key.isEmpty()) { - errors.add("Key is empty!"); - } - if (value == null) { - errors.add("Value is null!"); - } - }); - return errors; - } - - public static Map> delete(Map> fieldValues) { - List errors = delete2(fieldValues); - if (!errors.isEmpty()) { - Optional error = errors.stream().findFirst(); - throw new IllegalStateException("Illegal state of field and values :" + error.orElse(null)); - } - return fieldValues; - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/PreClearMap.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/PreClearMap.java deleted file mode 100644 index ba80db4e7..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/PreClearMap.java +++ /dev/null @@ -1,79 +0,0 @@ -package ru.spcex.clearing.registry.util; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import ru.clearing.classes.objects.BusinessObject; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; -import ru.spcex.platform.utils.time.TimeUtil; - -import java.time.Instant; -import java.time.LocalDate; -import java.time.temporal.ChronoUnit; -import java.util.Collection; -import java.util.Objects; - -public class PreClearMap { - protected final Logger log = LoggerFactory.getLogger(getClass()); - protected final Imdg map; - protected final PredicateBuilder predicateBuilder; - - public PreClearMap(Imdg map, PredicateBuilder predicateBuilder) { - this.map = map; - this.predicateBuilder = predicateBuilder; - } - - public void preClearMap() { - ImdgPredicate query = predicateBuilder.query(map.predicateBuilder(), LocalDate.now()); - Collection toDelete = map.getCollectionObjectsByPredicate(query); - log.debug("Prepare {} to delete by query \"{}\" from map {}", toDelete.size(), query, map.getMapName()); - for (T item : toDelete) - map.delete(item); - } - - public static PreClearMap instanceForLocalDateField(Imdg map, String fieldName) { - Objects.requireNonNull(map); - Objects.requireNonNull(fieldName); - return new PreClearMap<>(map, new PredicateBuilder() { - @Override - public ImdgPredicate query(ImdgPredicateBuilder pb, LocalDate date) { - return pb.equals(fieldName, date); - } - - @Override - public String toString() { - return "LocalDate predicate on " + fieldName; - } - }); - } - - public static PreClearMap instanceForInstantField(Imdg map, String fieldName) { - Objects.requireNonNull(map); - Objects.requireNonNull(fieldName); - return new PreClearMap<>(map, new PredicateBuilder() { - @Override - public ImdgPredicate query(ImdgPredicateBuilder pb, LocalDate date) { -// Instant atFrom = TimeUtil.localDateToInstant(date); -// Instant atTill = TimeUtil.localDateToInstant(date.plusDays(1)); - Instant atFrom = TimeUtil.localDateToInstant(date).truncatedTo(ChronoUnit.DAYS); - Instant atTill = TimeUtil.localDateToInstant(date.plusDays(1)).plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS); - return pb.and(pb.greatEqual(fieldName, atFrom), pb.less(fieldName, atTill)); - } - - @Override - public String toString() { - return "Instant predicate on " + fieldName; - } - }); - } - - public interface PredicateBuilder { - ImdgPredicate query(ImdgPredicateBuilder pb, LocalDate onDate); - } - - @Override - public String toString() { - return "PreClearMap{map=" + map.getMapName() + ", predicateBuilder=" + predicateBuilder + "}"; - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/validation/RegistryError.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/validation/RegistryError.java index 12ed310d2..de571d893 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/validation/RegistryError.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/validation/RegistryError.java @@ -1,18 +1,18 @@ -package ru.spcex.clearing.registry.validation; - -import ru.spcex.platform.utils.enumeration.IErrorEnumId; - -public enum RegistryError implements IErrorEnumId { - ValidationOfFieldValuesMapError(19000L); - - private final Long id; - - RegistryError(Long id) { - this.id = id; - } - - @Override - public Long getId() { - return id; - } -} +package ru.spcex.clearing.registry.validation; + +import ru.spcex.platform.utils.enumeration.IErrorEnumId; + +public enum RegistryError implements IErrorEnumId { + ValidationOfFieldValuesMapError(19000L); + + private final Long id; + + RegistryError(Long id) { + this.id = id; + } + + @Override + public Long getId() { + return id; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/validation/ValuesOfMapNonNullRule.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/validation/ValuesOfMapNonNullRule.java deleted file mode 100644 index 03746ec36..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/validation/ValuesOfMapNonNullRule.java +++ /dev/null @@ -1,26 +0,0 @@ -package ru.spcex.clearing.registry.validation; - -import ru.spcex.platform.imdg.validation.ImdgValidationContext; -import ru.spcex.platform.utils.enumeration.EnumMessage; -import ru.spcex.platform.utils.validation.IValidationRule; - -import java.util.Map; -import java.util.Optional; - -/** - * Проверка наличия компании с переданными в запросе companySymbol и companySymbolCode (реквизиты) - */ -public class ValuesOfMapNonNullRule implements IValidationRule>> { - @Override - public Optional validate(ImdgValidationContext> context) { - Map map = context.getValidatedObject(); - for (Map.Entry entry : map.entrySet()) { - String key = entry.getKey(); - Object value = entry.getValue(); - if (value == null) { - return of(RegistryError.ValidationOfFieldValuesMapError, key); - } - } - return empty(); - } -} diff --git a/clearing-parent/registry-service/src/main/resources/application.properties b/clearing-parent/registry-service/src/main/resources/application.properties index 78d638e78..987266aeb 100644 --- a/clearing-parent/registry-service/src/main/resources/application.properties +++ b/clearing-parent/registry-service/src/main/resources/application.properties @@ -1,9 +1,23 @@ -spring.main.web-application-type=none +# DB of Clearing +registry-service.dbClearing.url=jdbc:postgresql://10.200.200.133:5432/clearing?currentSchema=clearing_dev +#registry-service.dbClearing.url=jdbc:postgresql://10.200.200.133:5432/clearing_test?currentSchema=clearing_test +registry-service.dbClearing.driver=org.postgresql.Driver +registry-service.dbClearing.username=cls_dev +#registry-service.dbClearing.username=cls_test +registry-service.dbClearing.password=Aa111111 -registry-service.hazelcast.cluster-members=127.0.0.1:5701 -registry-service.hazelcast.login=dev -registry-service.hazelcast.password=dev-pass +registry-service.outFolder=/opt/mfd/clearing/reestr_out\ +#./reports_out_temp +# use SFTP (TODO optional): +#registry-service.reports-store.local-temp-dir=./reports_out_temp +#registry-service.reports-store.out-dir=reports +#registry-service.reports-store.user=tester +#registry-service.reports-store.password=password +#registry-service.reports-store.server-ip=10.230.238.53 +#registry-service.reports-store.server-port=2222 +#registry-service.reports-store.delete-after-send=true +# optional for run as service: registry-service.kafka-consumer.bootstrap-servers=localhost:9092 registry-service.kafka-consumer.group-id=dev-group-registry-service registry-service.kafka-consumer.enable-auto-commit=true @@ -18,12 +32,3 @@ registry-service.kafka-producer.retries=0 registry-service.kafka-producer.batch-size=16384 registry-service.kafka-producer.linger-ms=1 registry-service.kafka-producer.buffer-memory=33554432 - -registry-service.csv-mode=true -registry-service.reports-store.local-temp-dir=./reports_out_temp -registry-service.reports-store.out-dir=reports -registry-service.reports-store.user=tester -registry-service.reports-store.password=password -registry-service.reports-store.server-ip=10.230.238.53 -registry-service.reports-store.server-port=2222 -registry-service.reports-store.delete-after-send=true \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/resources/dev.properties b/clearing-parent/registry-service/src/main/resources/dev.properties new file mode 100644 index 000000000..23b5ae628 --- /dev/null +++ b/clearing-parent/registry-service/src/main/resources/dev.properties @@ -0,0 +1,4 @@ +registry-service.dev.c3p0-initial-pool-size=6 +registry-service.dev.c3p0-min-pool-size=1 +registry-service.dev.c3p0-max-pool-size=12 +registry-service.dev.c3p0-acquire-increment=5 \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/HazelcastServiceTestConfiguration.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/HazelcastServiceTestConfiguration.java deleted file mode 100644 index ef4458f82..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/HazelcastServiceTestConfiguration.java +++ /dev/null @@ -1,71 +0,0 @@ -package ru.spcex.clearing.registry.config; - -import com.hazelcast.config.*; -import com.hazelcast.core.Hazelcast; -import com.hazelcast.core.HazelcastInstance; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; -import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; -import ru.spcex.platform.imdg.iml.hazelcast.util.HazelcastHelper; - -import java.util.List; -import java.util.Random; -import java.util.concurrent.atomic.AtomicLong; - -@Configuration -public class HazelcastServiceTestConfiguration { - - public static final AtomicLong currentID = new AtomicLong(0L); - private HazelcastInstance hazelcastInstance; - - private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) { - ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); - if (maxPoolSz > 2) { - pool.setKeepAliveSeconds(60); - pool.setAllowCoreThreadTimeOut(true); - } - pool.setCorePoolSize(maxPoolSz); - pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion); - return pool; - } - - @Bean(name = "hazelcastServiceTest") - public HazelcastService hazelcastService(@Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, HazelcastClientParams params) { - Config cfg = new Config(); - cfg.setInstanceName("localhost"); - - NetworkConfig networkConfig = new NetworkConfig(); - JoinConfig joinConfig = new JoinConfig(); - joinConfig.setMulticastConfig(new MulticastConfig().setEnabled(false)); - joinConfig.setTcpIpConfig(new TcpIpConfig().setEnabled(true).setMembers(List.of("127.0.0.1"))); - networkConfig.setJoin(joinConfig); - cfg.setNetworkConfig(networkConfig); - hazelcastInstance = Hazelcast.getOrCreateHazelcastInstance(cfg); - HazelcastHelper.imdgSystem_setStorageState(true, hazelcastInstance); - return new HazelcastService(taskExecutorHazelcastClientInitializer, taskExecutorIdGeneratorAwaiter, params); - } - - @Bean(name = "taskExecutorHazelcastClientInitializer") - public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() { - return createThreadPoolTaskExecutor(1, true); - } - - @Bean(name = "taskExecutorIdGeneratorAwaiter") - public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() { - return createThreadPoolTaskExecutor(1, false); - } - - @Bean(name = "hazelcastClientParams") - public HazelcastClientParams getHazelcastClientParams() { - HazelcastClientParams params = new HazelcastClientParams(); - params.setLogin("dev"); - params.setPassword("dev-pass"); - params.setClusterMembers("127.0.0.1"); - params.setInstanceName("hzTestClient" + new Random().nextInt()); - params.setNearCacheConfig(new NearCacheConfig()); - return params; - } -} diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/SFTPTestConfig.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/SFTPTestConfig.java index 3eb5e0288..3274dab37 100644 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/SFTPTestConfig.java +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/SFTPTestConfig.java @@ -3,6 +3,7 @@ package ru.spcex.clearing.registry.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.integration.sftp.session.SftpFileInfo; +import ru.spcex.clearing.registry.conf.SFTPReportsConfig; import java.io.File; import java.util.ArrayList; diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/TestConfig.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/TestConfig.java index 4835acd19..49995252f 100644 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/TestConfig.java +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/TestConfig.java @@ -4,8 +4,10 @@ import org.mockito.Mockito; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.integration.sftp.session.SftpFileInfo; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.registry.config.settings.ReportsStore; +import ru.spcex.clearing.registry.conf.CmdArgsParser; +import ru.spcex.clearing.registry.conf.SFTPReportsConfig; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.clearing.registry.conf.properties.ReportsStore; import java.io.File; import java.nio.charset.Charset; @@ -16,12 +18,13 @@ import java.util.List; @Configuration public class TestConfig { @Bean - public RegistryServiceSettings testSettings() { - RegistryServiceSettings registryServiceSettings = new RegistryServiceSettings(); + public AProperties testSettings() { + AProperties registryServiceSettings = new AProperties(Mockito.mock(CmdArgsParser.class)); ReportsStore store = new ReportsStore(); - store.setLocalTempDir("out"); + //store.setLocalTempDir("out"); + registryServiceSettings.setOutFolder("out"); registryServiceSettings.setReportsStore(store); - registryServiceSettings.setCsvMode(true); + //registryServiceSettings.setCsvMode(true); return registryServiceSettings; } diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterServiceTest.java deleted file mode 100644 index 679d151c7..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterServiceTest.java +++ /dev/null @@ -1,129 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.register.AdmittedLiabilitiesRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import javax.annotation.PostConstruct; -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - AdmittedLiabilitiesRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, -}) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class AdmittedLiabilitiesRegisterServiceTest { - //consts - - private static int requestCount = 0; - private static final String securitySymbol = "SYMBOL"; - private static final Long companyId = 1L; - private static final String clearingCode = "CODE"; - private static final String account = "ACCOUNT"; - private static final BigDecimal balance = new BigDecimal(1); - private static final LocalDate clearingDate = LocalDate.now(); - private static final String COMPANY_FULL_NAME = "ROGA"; - private Long REGISTRY_SPY_ID; - private final Long sessionId = 0L; - private Imdg registryMap; - private Imdg companyMap; - private Imdg admittedLiabilitiesRegisterMap; - @Autowired - private AdmittedLiabilitiesRegisterService admittedLiabilitiesRegisterService; - - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @PostConstruct - private void init() { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - //initializing of imdg - companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - admittedLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_AdmittedLiabilitiesRegister, AdmittedLiabilitiesRegister.class); - // initialing objects for imdg repos - - Long securityId = 1L; - Registry registry = new Registry(); - registry.setRegistryDesignation(RegistryDesignation.O.getKey()); - registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); - registry.setRegistryUnit(RegistryUnit.T.getKey()); - registry.setRegistryStatus(RegistryStatus.OK.getKey()); - registry.setSecurityId(securityId); - registry.setSessionId(sessionId); - registry.setSecuritySymbol(securitySymbol); - registry.setCompanyId(companyId); - registry.setClearingCode(clearingCode); - registry.setAccount(account); - registry.setBalance(balance); - registry.setClearingDate(clearingDate); - REGISTRY_SPY_ID = registryMap.insert(registry); - - Company company = new Company(); - company.setId(1L); - company.setFullName(COMPANY_FULL_NAME); - companyMap.insert(company); - } - - @Test - @Order(1) - void executionRegisterNewForClearingDate() { - - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) admittedLiabilitiesRegisterService.getConsumer(), - Task.createRegistry_ADLR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = admittedLiabilitiesRegisterMap.getAllValues(); - AdmittedLiabilitiesRegister admittedLiabilitiesRegister = allValues.iterator().next(); - assertEquals(companyId, admittedLiabilitiesRegister.getCompanyId()); - assertEquals(clearingCode, admittedLiabilitiesRegister.getClearingCode()); - assertEquals(account, admittedLiabilitiesRegister.getAccount()); - assertEquals(balance, admittedLiabilitiesRegister.getAmount()); - assertEquals(clearingDate, admittedLiabilitiesRegister.getClearingDate()); - assertEquals(COMPANY_FULL_NAME, admittedLiabilitiesRegister.getCompanyFullName()); - } - -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterServiceTest.java deleted file mode 100644 index d6484bfeb..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterServiceTest.java +++ /dev/null @@ -1,127 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.register.CoveredLiabilitiesRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import javax.annotation.PostConstruct; -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - CoveredLiabilitiesRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, -}) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class CoveredLiabilitiesRegisterServiceTest { - private static int requestCount = 0; - private static final String securitySymbol = "SYMBOL"; - private static final Long companyId = 1L; - private static final String clearingCode = "CODE"; - private static final String account = "ACCOUNT"; - private static final BigDecimal balance = new BigDecimal(1); - private static final LocalDate clearingDate = LocalDate.now(); - private static final String COMPANY_FULL_NAME = "ROGA"; - private Imdg coveredLiabilitiesRegisterMap; - private Imdg registryMap; - private Imdg companyMap; - private Long REGISTRY_SPY_ID; - private final Long sessionId = 0L; - - @Autowired - private CoveredLiabilitiesRegisterService coveredLiabilitiesRegisterService; - - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @PostConstruct - private void init() { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - //initializing of imdg - companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - coveredLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CoveredLiabilitiesRegister, CoveredLiabilitiesRegister.class); - // initialing objects for imdg repos - - Long securityId = 1L; - Registry registry = new Registry(); - registry.setRegistryDesignation(RegistryDesignation.O.getKey()); - registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); - registry.setRegistryUnit(RegistryUnit.T.getKey()); - registry.setRegistryStatus(RegistryStatus.OK.getKey()); - registry.setSecurityId(securityId); - registry.setSessionId(sessionId); - registry.setSecuritySymbol(securitySymbol); - registry.setCompanyId(companyId); - registry.setClearingCode(clearingCode); - registry.setAccount(account); - registry.setBalance(balance); - registry.setClearingDate(clearingDate); - REGISTRY_SPY_ID = registryMap.insert(registry); - - Company company = new Company(); - company.setId(1L); - company.setFullName(COMPANY_FULL_NAME); - companyMap.insert(company); - } - - @Test - @Order(1) - void executionRegisterNewForClearingDate() { - - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) coveredLiabilitiesRegisterService.getConsumer(), - Task.createRegistry_CDLR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = coveredLiabilitiesRegisterMap.getAllValues(); - CoveredLiabilitiesRegister coveredLiabilitiesRegister = allValues.iterator().next(); - assertEquals(companyId, coveredLiabilitiesRegister.getCompanyId()); - assertEquals(clearingCode, coveredLiabilitiesRegister.getClearingCode()); - assertEquals(account, coveredLiabilitiesRegister.getAccount()); - assertEquals(balance, coveredLiabilitiesRegister.getAmount()); - assertEquals(clearingDate, coveredLiabilitiesRegister.getClearingDate()); - assertEquals(COMPANY_FULL_NAME, coveredLiabilitiesRegister.getCompanyFullName()); - } -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterServiceTest.java deleted file mode 100644 index 25f8778db..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterServiceTest.java +++ /dev/null @@ -1,171 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import com.opencsv.exceptions.CsvValidationException; -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.register.DepoBalanceRegister; -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.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.SFTPTestConfig; -import ru.spcex.clearing.registry.config.TestConfig; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.io.IOException; -import java.math.BigDecimal; -import java.time.Instant; -import java.util.Arrays; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.assertEquals; - - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - DepoBalanceRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, - TestConfig.class, - SFTPTestConfig.class, -}) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class DepoBalanceRegisterServiceTest implements InitializingBean { - private static int requestCount = 0; - - private static final Long companyId = 1L; - private static final Long sessionId = 1L; - private static final String account = "ACCOUNT"; - private static final BigDecimal balance = new BigDecimal(1); - private static final String SECURITY_SYMBOL= "SECURITY_SYMBOL"; - - private Imdg depoBalanceRegisterMap; - private Imdg registryHistoryMap; - - @Autowired - private DepoBalanceRegisterService depoBalanceRegisterService; - - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @Autowired - private RegistryServiceSettings settings; - - @Autowired - @Qualifier("reportOutDir") - private File outFolder; - - - @Override - public void afterPropertiesSet() throws Exception { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - //initializing of imdg - registryHistoryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryHistory, RegistryHistory.class); - depoBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoBalanceRegister, DepoBalanceRegister.class); - // initialing objects for imdg repos - } - - private RegistryHistory init() { - Registry registry = new Registry(); - registry.setRegistryDesignation(RegistryDesignation.A.getKey()); - registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); - registry.setRegistryUnit(RegistryUnit.T.getKey()); - registry.setDiffBalance(BigDecimal.ZERO); - registry.setTradingClearingRegistry("not null value"); - registry.setCompanyId(companyId); - registry.setAccountType(AccountType.Depo.getKey()); - registry.setAccount(account); - registry.setBalance(balance); - registry.setSecuritySymbol(SECURITY_SYMBOL); - RegistryHistory registryHistory = new RegistryHistory(); - registryHistory.setObject(registry); - registryHistory.setEventTime(Instant.now()); - registryHistoryMap.insert(registryHistory); - return registryHistory; - } - - @Test - @Order(1) - void executionRegisterNewForEventTime() { - RegistryHistory source = init(); - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(false); - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) depoBalanceRegisterService.getConsumer(), - Task.createRegistry_GRRT.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = depoBalanceRegisterMap.getAllValues(); - DepoBalanceRegister depoBalanceRegister = allValues.iterator().next(); - assertEquals(companyId, depoBalanceRegister.getCompanyId()); - assertEquals(account, depoBalanceRegister.getDepoCode()); - assertEquals(balance, depoBalanceRegister.getQuantity()); - assertEquals(SECURITY_SYMBOL, depoBalanceRegister.getSecuritySymbol()); - settings.setCsvMode(oldCsvMode); - registryHistoryMap.delete(source); - } - -// @Test - @Order(2) - void executionRegisterNewForEventTime_Csv() throws CsvValidationException, IOException { - RegistryHistory source = init(); - ReportTestUtils.resetDir(outFolder); - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(true); - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) depoBalanceRegisterService.getConsumer(), - Task.createRegistry_GRRT.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports/depo_balance_register_expected.csv").getFile()); - ReportTestUtils.compareCSVFiles(expectedFile, outFile, Arrays.asList("Дата", "Время", "Номер отчета")); - - settings.setCsvMode(oldCsvMode); - ReportTestUtils.deleteDir(outFolder); - registryHistoryMap.delete(source); - } - -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterServiceTest.java deleted file mode 100644 index 687060b70..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterServiceTest.java +++ /dev/null @@ -1,195 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import com.opencsv.exceptions.CsvValidationException; -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.payment.PaymentInstruction; -import ru.clearing.classes.statics.data.register.DepoPaymentInstructionRegister; -import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; -import ru.clearing.platform.dictionary.InOutDirectionDictionary; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.SFTPTestConfig; -import ru.spcex.clearing.registry.config.TestConfig; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.Task; -import ru.spcex.platform.enumeration.TransactionStatus; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.io.IOException; -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Arrays; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - DepoPaymentInstructionRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, - TestConfig.class, - SFTPTestConfig.class, -}) -class DepoPaymentInstructionRegisterServiceTest implements InitializingBean { - private Imdg depoPaymentInstructionRegisterMap; - private Imdg paymentInstructionMap; - private Imdg sessionMap; - private Imdg tradingClearingRegistryMap; - private Imdg inOutDirectionDictionaryMap; - private Imdg accountMap; - - private static int requestCount = 0; - private static final Long SESSION_ID = 1L; - private static final String SESSION_SECTION = "FOND"; - private static final Long TRADING_CLEARING_REGISTRY_DEPO_ACCOUNT_ID = 100L; - private static final Long TRADING_CLEARING_REGISTRY_COMPANY_ID = 101L; - private static final String TRADING_CLEARING_REGISTRY_TYPE = "TYPE"; - private static final String TRADING_CLEARING_REGISTRY_CODE = "CODE"; - private static final String SET_CREDIT_LEG_DIRECTION = "PAYMENT_INSTRUCTION_CREDIT_LEG"; - private static final BigDecimal SET_CREDIT_LEG_AMOUNT = new BigDecimal(1); - private static final Long IN_OUT_DIRECTION_DICTIONARY_ID = 123L; - @Autowired - private DepoPaymentInstructionRegisterService depoPaymentInstructionRegisterService; - - @Autowired - private RegistryServiceSettings settings; - - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @Autowired - @Qualifier("reportOutDir") - private File outFolder; - - @Override - public void afterPropertiesSet() throws Exception { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - //initializing of imdg - depoPaymentInstructionRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoPaymentInstructionRegister, DepoPaymentInstructionRegister.class); - paymentInstructionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); - sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - tradingClearingRegistryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); - inOutDirectionDictionaryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_InOutDirectionDictionary, InOutDirectionDictionary.class); - accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); - // initialing objects for imdg repos - - Session session = new Session(); - session.setSection(SESSION_SECTION); - session.setId(SESSION_ID); - sessionMap.update(session); - - PaymentInstruction paymentInstruction = new PaymentInstruction(); - paymentInstruction.setSessionId(SESSION_ID); - paymentInstruction.setClearingDate(LocalDate.now()); - paymentInstruction.setCreditLeg_accountId(TRADING_CLEARING_REGISTRY_DEPO_ACCOUNT_ID); - paymentInstruction.setSenderId(TRADING_CLEARING_REGISTRY_COMPANY_ID); - paymentInstruction.setCreditLeg_direction(SET_CREDIT_LEG_DIRECTION); - paymentInstruction.setCreditLeg_amount(SET_CREDIT_LEG_AMOUNT); - paymentInstruction.setTransactionStatus(TransactionStatus.sent.getKey()); - paymentInstructionMap.insert(paymentInstruction); - - - TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry(); - tradingClearingRegistry.setCompanyId(TRADING_CLEARING_REGISTRY_COMPANY_ID); - tradingClearingRegistry.setDepoAccountId(TRADING_CLEARING_REGISTRY_DEPO_ACCOUNT_ID); - tradingClearingRegistry.setTradingClearingRegistryType(TRADING_CLEARING_REGISTRY_TYPE); - tradingClearingRegistry.setCode(TRADING_CLEARING_REGISTRY_CODE); - tradingClearingRegistryMap.insert(tradingClearingRegistry); - - InOutDirectionDictionary inOutDirectionDictionary = new InOutDirectionDictionary(); - inOutDirectionDictionary.setCode(SET_CREDIT_LEG_DIRECTION); - inOutDirectionDictionary.setId(IN_OUT_DIRECTION_DICTIONARY_ID); - inOutDirectionDictionaryMap.update(inOutDirectionDictionary); - - Account account = new Account(); - account.setId(TRADING_CLEARING_REGISTRY_DEPO_ACCOUNT_ID); - account.setAccountType(AccountType.Depo.getKey()); - accountMap.update(account); - } - - @Test - @Order(1) - void executionRegisterNewForClearingDate() { - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(false); - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) depoPaymentInstructionRegisterService.getConsumer(), - Task.createRegistry_GORD.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = depoPaymentInstructionRegisterMap.getAllValues(); - DepoPaymentInstructionRegister depoPaymentInstructionRegister = allValues.iterator().next(); - assertEquals(SESSION_ID, depoPaymentInstructionRegister.getSessionId()); - assertEquals(TRADING_CLEARING_REGISTRY_COMPANY_ID, depoPaymentInstructionRegister.getCompanyId()); - assertEquals(TRADING_CLEARING_REGISTRY_TYPE, depoPaymentInstructionRegister.getTradingClearingRegistryType()); - assertEquals(TRADING_CLEARING_REGISTRY_CODE, depoPaymentInstructionRegister.getTradingClearingRegistry()); - assertEquals(IN_OUT_DIRECTION_DICTIONARY_ID, depoPaymentInstructionRegister.getDirection()); - assertEquals(SET_CREDIT_LEG_AMOUNT, depoPaymentInstructionRegister.getQuantity()); - - settings.setCsvMode(oldCsvMode); - } - -// @Test - @Order(2) - void executionRegisterNewForClearingDate_CSV() throws CsvValidationException, IOException { - ReportTestUtils.resetDir(outFolder); - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(true); - - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) depoPaymentInstructionRegisterService.getConsumer(), - Task.createRegistry_GORD.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports/depo_payment_instruction_register_expected.csv").getFile()); - ReportTestUtils.compareCSVFiles(expectedFile, outFile, Arrays.asList("Время формирования", "Дата распоряжения", "Номер распоряжения")); - - settings.setCsvMode(oldCsvMode); - - ReportTestUtils.deleteDir(outFolder); - } -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterServiceTest.java deleted file mode 100644 index 735ac3811..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterServiceTest.java +++ /dev/null @@ -1,143 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.time.TimeUtil; - -import javax.annotation.PostConstruct; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - ExcludeLiabilitiesRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, -}) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class ExcludeLiabilitiesRegisterServiceTest { - private static int requestCount = 0; - - @Autowired - private ExcludeLiabilitiesRegisterService excludeLiabilitiesRegisterService; - private Imdg excludeLiabilitiesRegisterMap; - private Imdg registryMap; - private Imdg sessionMap; - private Imdg companySymbolMap; - - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @PostConstruct - private void init() { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - excludeLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_ExcludeLiabilitiesRegister, ExcludeLiabilitiesRegister.class); - registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - companySymbolMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, ru.clearing.classes.statics.data.company.CompanySymbols.class); - } - - private static final Long SESSION_ID = 10L; - private static final Long SECURITY_ID = 101L; - private static final Long REGISTRY_COMPANY_ID = 10L; - private static final String REGISTRY_COMPANY_FULL_NAME = "full_nome"; - private static final String REGISTRY_CODE = "full_nome"; - private static final String REGISTRY_ACCOUNT = "full_nome"; - private static final String REGISTRY_STATUS = RegistryStatus.FAIL.getKey(); - private static final BigDecimal REGISTRY_BALANCE = new BigDecimal(1); - private static final LocalDate SESSION_CLEARING_DATE = LocalDate.now(); - private static final LocalDate REGISTRY_SETTLEMENT_DATE = LocalDate.now(); - private static final Instant SESSION_UPDATED = Instant.now(); - private static final String COMPANY_SYMBOL_VALUE = "COMPANY_SYMBOL_VALUE"; - @Test - @Order(1) - void executionRegisterNewForClearingDate() { - Registry registry = new Registry(); - registry.setRegistryDesignation(RegistryDesignation.O.getKey()); - registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); - registry.setRegistryUnit(RegistryUnit.T.getKey()); - registry.setRegistryStatus(REGISTRY_STATUS); - registry.setSessionId(SESSION_ID); - registry.setCompanyId(REGISTRY_COMPANY_ID); - registry.setFullName(REGISTRY_COMPANY_FULL_NAME); - registry.setRegistryCode(REGISTRY_CODE); - registry.setAccount(REGISTRY_ACCOUNT); - registry.setBalance(REGISTRY_BALANCE); - registry.setSettlementDate(REGISTRY_SETTLEMENT_DATE); - registry.setSecurityId(SECURITY_ID); - registryMap.insert(registry); - - Session session = new Session(); - session.setId(SESSION_ID); - session.setClearingDate(SESSION_CLEARING_DATE); - session.setUpdated(SESSION_UPDATED); - sessionMap.update(session); - CompanySymbols companySymbols = new CompanySymbols(); - companySymbols.setCompanyId(REGISTRY_COMPANY_ID); - companySymbols.setCompanySymbol(CompanySymbol.INN.getKey()); - companySymbols.setCompanySymbolValue(COMPANY_SYMBOL_VALUE); - companySymbolMap.insert(companySymbols); - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) excludeLiabilitiesRegisterService.getConsumer(), - Task.createRegistry_EXLR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = excludeLiabilitiesRegisterMap.getAllValues(); - ExcludeLiabilitiesRegister excludeLiabilitiesRegister = allValues.iterator().next(); - assertEquals(SESSION_ID, excludeLiabilitiesRegister.getSessionId()); - assertEquals(REGISTRY_COMPANY_ID, excludeLiabilitiesRegister.getCompanyId()); - assertEquals(REGISTRY_COMPANY_FULL_NAME, excludeLiabilitiesRegister.getCompanyFullName()); - assertEquals(REGISTRY_CODE, excludeLiabilitiesRegister.getRegistryCode()); - assertEquals(REGISTRY_ACCOUNT, excludeLiabilitiesRegister.getAccount()); - assertEquals(REGISTRY_STATUS, excludeLiabilitiesRegister.getRegistryStatus()); - assertEquals(REGISTRY_BALANCE, excludeLiabilitiesRegister.getSumLiabilities()); - assertEquals(SESSION_CLEARING_DATE, excludeLiabilitiesRegister.getValidFromDate()); - assertEquals(REGISTRY_SETTLEMENT_DATE, excludeLiabilitiesRegister.getSettlementDate()); - assertEquals(TimeUtil.toLocalDate(SESSION_UPDATED), excludeLiabilitiesRegister.getValidToDate()); - assertEquals(COMPANY_SYMBOL_VALUE, excludeLiabilitiesRegister.getInn()); - - } - -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExecutionRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExecutionRegisterServiceTest.java deleted file mode 100644 index 455ea076f..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExecutionRegisterServiceTest.java +++ /dev/null @@ -1,332 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import com.opencsv.exceptions.CsvValidationException; -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.execution.ExecutionDeposit; -import ru.clearing.classes.statics.data.execution.ExecutionFond; -import ru.clearing.classes.statics.data.register.ExecutionRegister; -import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.SFTPTestConfig; -import ru.spcex.clearing.registry.config.TestConfig; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.CompanySymbol; -import ru.spcex.platform.enumeration.MoneyFlowSide; -import ru.spcex.platform.enumeration.Side; -import ru.spcex.platform.enumeration.Task; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.io.IOException; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.time.ZoneOffset; -import java.util.Collection; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - ExecutionRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, - TestConfig.class, - SFTPTestConfig.class -}) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class ExecutionRegisterServiceTest implements InitializingBean { - LocalDate TRADING_DATE = LocalDate.of(2020, 1, 1); - Instant EXCHANGE_EXECUTION_TIME = LocalDate.of(2020, 1, 1).atStartOfDay().toInstant(ZoneOffset.UTC); - Long COUNTER_PARTY_ID = 888L; - Long COMPANY_ID = 777L; - Long EXCHANGE_EXECUTION_ID = 777L; - Long SECURITY_ID = 888L; - BigDecimal SETTLEMENT_AMOUNT = BigDecimal.valueOf(777L); - BigDecimal QUANTITY = BigDecimal.valueOf(888L); - - String COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID = "COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID"; - String COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID = "COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID"; - - Long MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID; - Long MONEY_ACCOUNT_FOR_TKR_ID; - Long DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID; - Long DEPO_ACCOUNT_FOR_TKR_ID; - - Long TKR_FOR_COUNTER_PARTY_TKR_ID; - Long TKR_FOR_TKR_ID; - - String MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR = "MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR"; - String MONEY_ACCOUNT_FOR_TKR = "MONEY_ACCOUNT_FOR_TKR"; - String DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR = "DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR"; - String DEPO_ACCOUNT_FOR_TKR = "DEPO_ACCOUNT_FOR_TKR"; - - String COUNTER_PARTY_TKR = "COUNTER_PARTY_TKR"; - String PARTY_TKR = "PARTY_TKR"; - - private static int requestCount = 0; - - private Imdg accountImdg; - private Imdg executionDepositImdg; - private Imdg executionFondImdg; - private Imdg companySymbolsImdg; - private Imdg tradingClearingRegistryImdg; - private Imdg executionRegisterImdg; - - @Autowired - private ExecutionRegisterService executionRegisterService; - - @Autowired - private RegistryServiceSettings settings; - - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @Autowired - @Qualifier("reportOutDir") - private File outFolder; - - - @Override - public void afterPropertiesSet() throws Exception { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class); - executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class); - companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); - tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); - accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); - executionRegisterImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionRegister, ExecutionRegister.class); - - Account moneyAccountForCounterPartyTkr = new Account(); - moneyAccountForCounterPartyTkr.setAccount(MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR); - MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID = accountImdg.insert(moneyAccountForCounterPartyTkr); - - Account moneyAccountForTkr = new Account(); - moneyAccountForTkr.setAccount(MONEY_ACCOUNT_FOR_TKR); - MONEY_ACCOUNT_FOR_TKR_ID = accountImdg.insert(moneyAccountForTkr); - - Account depoAccountForCounterPartyTkr = new Account(); - depoAccountForCounterPartyTkr.setAccount(DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR); - DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID = accountImdg.insert(depoAccountForCounterPartyTkr); - - Account depoAccountForTkr = new Account(); - depoAccountForTkr.setAccount(DEPO_ACCOUNT_FOR_TKR); - DEPO_ACCOUNT_FOR_TKR_ID = accountImdg.insert(depoAccountForTkr); - - TradingClearingRegistry tkrForCounterPartyTkrId = new TradingClearingRegistry(); - tkrForCounterPartyTkrId.setMoneyAccountId(MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID); - tkrForCounterPartyTkrId.setDepoAccountId(DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID); - TKR_FOR_COUNTER_PARTY_TKR_ID = tradingClearingRegistryImdg.insert(tkrForCounterPartyTkrId); - - TradingClearingRegistry tkrForTkrId = new TradingClearingRegistry(); - tkrForTkrId.setMoneyAccountId(MONEY_ACCOUNT_FOR_TKR_ID); - tkrForTkrId.setDepoAccountId(DEPO_ACCOUNT_FOR_TKR_ID); - TKR_FOR_TKR_ID = tradingClearingRegistryImdg.insert(tkrForTkrId); - - CompanySymbols companySymbolsForCompanyId = new CompanySymbols(); - companySymbolsForCompanyId.setCompanyId(COMPANY_ID); - companySymbolsForCompanyId.setCompanySymbol(CompanySymbol.CLRC.getKey()); - companySymbolsForCompanyId.setCompanySymbolValue(COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID); - companySymbolsImdg.insert(companySymbolsForCompanyId); - - CompanySymbols companySymbolsForCounterPartyId = new CompanySymbols(); - companySymbolsForCounterPartyId.setCompanyId(COUNTER_PARTY_ID); - companySymbolsForCounterPartyId.setCompanySymbol(CompanySymbol.CLRC.getKey()); - companySymbolsForCounterPartyId.setCompanySymbolValue(COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID); - companySymbolsImdg.insert(companySymbolsForCounterPartyId); - } - -// @Test - @Order(3) - void executionRegisterNewForClearingDate_CSV() throws IOException, CsvValidationException { - ReportTestUtils.resetDir(outFolder); - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(true); - - ExecutionFond executionFond = new ExecutionFond(); - executionFond.setClearingDate(LocalDate.now()); - executionFond.setTradingDate(TRADING_DATE); - executionFond.setExchangeExecutionId(EXCHANGE_EXECUTION_ID); - executionFond.setExchangeExecutionTime(EXCHANGE_EXECUTION_TIME); - executionFond.setSecurityId(SECURITY_ID); - executionFond.setSettlementAmount(SETTLEMENT_AMOUNT); - executionFond.setQuantity(QUANTITY); - executionFond.setCounterPartyTradingClearingRegistryId(TKR_FOR_COUNTER_PARTY_TKR_ID); - executionFond.setTradingClearingRegistryId(TKR_FOR_TKR_ID); - executionFond.setCompanyId(COMPANY_ID); - executionFond.setCounterPartyId(COUNTER_PARTY_ID); - executionFond.setSide(Side.SELL.getKey()); - executionFond.setCounterPartyTradingClearingRegistry(COUNTER_PARTY_TKR); - executionFond.setPartyTradingClearingRegistry(PARTY_TKR); - executionFondImdg.insert(executionFond); - - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) executionRegisterService.getConsumer(), - Task.createRegistry_ECNR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports/execution_register_expected.csv").getFile()); - ReportTestUtils.compareCSVFiles(expectedFile, outFile, List.of()); - - executionFondImdg.delete(executionFond); - settings.setCsvMode(oldCsvMode); - ReportTestUtils.deleteDir(outFolder); - } - - @Test - @Order(2) - void executionRegisterNewForClearingDate() { - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(false); - - ExecutionFond executionFond = new ExecutionFond(); - executionFond.setClearingDate(LocalDate.now()); - executionFond.setTradingDate(TRADING_DATE); - executionFond.setExchangeExecutionId(EXCHANGE_EXECUTION_ID); - executionFond.setExchangeExecutionTime(EXCHANGE_EXECUTION_TIME); - executionFond.setSecurityId(SECURITY_ID); - executionFond.setSettlementAmount(SETTLEMENT_AMOUNT); - executionFond.setQuantity(QUANTITY); - executionFond.setCounterPartyTradingClearingRegistryId(TKR_FOR_COUNTER_PARTY_TKR_ID); - executionFond.setTradingClearingRegistryId(TKR_FOR_TKR_ID); - executionFond.setCompanyId(COMPANY_ID); - executionFond.setCounterPartyId(COUNTER_PARTY_ID); - executionFond.setSide(Side.SELL.getKey()); - executionFond.setCounterPartyTradingClearingRegistry(COUNTER_PARTY_TKR); - executionFond.setPartyTradingClearingRegistry(PARTY_TKR); - executionFondImdg.insert(executionFond); - - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) executionRegisterService.getConsumer(), - Task.createRegistry_ECNR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - Collection allValues = executionRegisterImdg.getAllValues(); - ExecutionRegister executionRegister = allValues.iterator().next(); - assertEquals(executionRegister.getTradingDate(), TRADING_DATE); - assertEquals(executionRegister.getExchangeExecutionId(), EXCHANGE_EXECUTION_ID); - assertEquals(executionRegister.getExchangeExecutionTime(), EXCHANGE_EXECUTION_TIME); - assertEquals(executionRegister.getSecurityId(), SECURITY_ID); - assertEquals(executionRegister.getSellerId(), COMPANY_ID); - assertEquals(executionRegister.getSellerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID); - assertEquals(executionRegister.getSellerTradingClearingRegister(), PARTY_TKR); - assertEquals(executionRegister.getSellerMoneyAccount(), MONEY_ACCOUNT_FOR_TKR); - assertEquals(executionRegister.getSellerDepoAccount(), DEPO_ACCOUNT_FOR_TKR); - assertEquals(executionRegister.getBuyerId(), COUNTER_PARTY_ID); - assertEquals(executionRegister.getBuyerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID); - assertEquals(executionRegister.getBuyerTradingClearingRegister(), COUNTER_PARTY_TKR); - assertEquals(executionRegister.getBuyerMoneyAccount(), MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR); - assertEquals(executionRegister.getBuyerDepoAccount(), DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR); - assertEquals(executionRegister.getAmount(), SETTLEMENT_AMOUNT); - assertEquals(executionRegister.getQuantity(), QUANTITY); - assertEquals(executionRegister.getClearingDate(), LocalDate.now()); - - executionFondImdg.delete(executionFond); - - settings.setCsvMode(oldCsvMode); - } - - @Test - @Order(1) - void executionRegisterNewFromRequest() { - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(false); - - ExecutionDeposit executionDeposit = new ExecutionDeposit(); - executionDeposit.setClearingDate(LocalDate.now()); - executionDeposit.setTradingDate(TRADING_DATE); - executionDeposit.setExchangeExecutionId(EXCHANGE_EXECUTION_ID); - executionDeposit.setExchangeExecutionTime(EXCHANGE_EXECUTION_TIME); - executionDeposit.setSecurityId(SECURITY_ID); - executionDeposit.setFirstLegAmount(SETTLEMENT_AMOUNT); - executionDeposit.setQuantity(QUANTITY); - executionDeposit.setCounterPartyTradingClearingRegistryId(TKR_FOR_COUNTER_PARTY_TKR_ID); - executionDeposit.setTradingClearingRegistryId(TKR_FOR_TKR_ID); - executionDeposit.setCompanyId(COMPANY_ID); - executionDeposit.setCounterPartyId(COUNTER_PARTY_ID); - executionDeposit.setSide(MoneyFlowSide.SELL.getKey()); - executionDeposit.setCounterPartyTradingClearingRegistry(COUNTER_PARTY_TKR); - executionDeposit.setPartyTradingClearingRegistry(PARTY_TKR); - executionDepositImdg.insert(executionDeposit); - - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) executionRegisterService.getConsumer(), - Task.createRegistry_ECNR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - Collection allValues = executionRegisterImdg.getAllValues(); - ExecutionRegister executionRegister = allValues.iterator().next(); - assertEquals(executionRegister.getTradingDate(), TRADING_DATE); - assertEquals(executionRegister.getExchangeExecutionId(), EXCHANGE_EXECUTION_ID); - assertEquals(executionRegister.getExchangeExecutionTime(), EXCHANGE_EXECUTION_TIME); - assertEquals(executionRegister.getSecurityId(), SECURITY_ID); - assertEquals(executionRegister.getSellerId(), COMPANY_ID); - assertEquals(executionRegister.getSellerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID); - assertEquals(executionRegister.getSellerTradingClearingRegister(), PARTY_TKR); - assertEquals(executionRegister.getSellerMoneyAccount(), MONEY_ACCOUNT_FOR_TKR); - assertEquals(executionRegister.getSellerDepoAccount(), DEPO_ACCOUNT_FOR_TKR); - assertEquals(executionRegister.getBuyerId(), COUNTER_PARTY_ID); - assertEquals(executionRegister.getBuyerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID); - assertEquals(executionRegister.getBuyerTradingClearingRegister(), COUNTER_PARTY_TKR); - assertEquals(executionRegister.getBuyerMoneyAccount(), MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR); - assertEquals(executionRegister.getBuyerDepoAccount(), DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR); - assertEquals(executionRegister.getAmount(), SETTLEMENT_AMOUNT); - assertNull(executionRegister.getQuantity()); - assertEquals(executionRegister.getClearingDate(), LocalDate.now()); - - executionDepositImdg.delete(executionDeposit); - - settings.setCsvMode(oldCsvMode); - } - -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterServiceTest.java deleted file mode 100644 index 65f73a3b8..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterServiceTest.java +++ /dev/null @@ -1,169 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.register.LiabilitiesRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; -import ru.spcex.clearing.registry.config.TestConfig; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.time.TimeUtil; - -import javax.annotation.PostConstruct; -import java.io.File; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.util.Collection; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - LiabilitiesRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, - TestConfig.class, -}) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class LiabilitiesRegisterServiceTest { - private static int requestCount = 0; - private static final String REGISTRY_DESIGNATION = RegistryDesignation.O.getKey(); - private static final String REGISTRY_INSTRUMENT_TYPE = RegistryInstrumentType.M.getKey(); - private static final String REGISTRY_UNIT = RegistryUnit.T.getKey(); - private static final String REGISTRY_FULL_NAME = "MY FULLNAME"; - private static final String REGISTRY_CODE = REGISTRY_DESIGNATION + REGISTRY_INSTRUMENT_TYPE + "A" + REGISTRY_UNIT; // OMAT - private static final String REGISTRY_ACCOUNT = "ANY ACCOUNT"; - private static final String REGISTRY_STATUS = RegistryStatus.CLRD.getKey(); - private static final Long REGISTRY_SESSION_ID = 1234L; - private static final String REGISTRY_SESSION_TYPE = SessionType.XDEP.getKey(); - private static final Long REGISTRY_COMPANY_ID = 10101L; - private static final Long REGISTRY_SECURITY_ID = 123411L; - private static final String REGISTRY_CLEARING_CODE = "ANY CL CODE" ; - private static final String REGISTRY_SECURITY_SYMBOL = "MFD1-symbol"; - private static final BigDecimal REGISTRY_BALANCE = new BigDecimal(123411L); - private static final LocalDate REGISTRY_SETTLEMENT_DATE = LocalDate.now(); - private static final LocalDate SESSION_CLEARING_DATE = LocalDate.now(); - private static final Instant SESSION_UPDATE = Instant.now(); - private static final String COMPANY_SYMBOL_INN = CompanySymbol.INN.getKey(); - private static final String COMPANY_SYMBOL_VALUE = "ANY VALUE"; - private static final String REGISTRY_CONTRACT = "ANY CONTRACT VALUE"; - - @Autowired - private LiabilitiesRegisterService liabilitiesRegisterService; - private Imdg liabilitiesRegisterMap; - private Imdg registryMap; - private Imdg sessionMap; - private Imdg companySymbolsMap; - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @Autowired - SFTPReportsConfig.ReportsGateway reportsGateway; // mock TestMockSFTP - - @PostConstruct - private void init() { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - this.liabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesRegister, LiabilitiesRegister.class); - this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - this.companySymbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); - } - - @Test - @Order(1) - void executionRegisterNewForClearingDate() { - Registry registry = new Registry(); - registry.setRegistryUnit(REGISTRY_UNIT); - registry.setRegistryInstrumentType(REGISTRY_INSTRUMENT_TYPE); - registry.setRegistryDesignation(REGISTRY_DESIGNATION); - registry.setSessionId(REGISTRY_SESSION_ID); - registry.setCompanyId(REGISTRY_COMPANY_ID); - registry.setFullName(REGISTRY_FULL_NAME); - registry.setRegistryCode(REGISTRY_CODE); - registry.setAccount(REGISTRY_ACCOUNT); - registry.setRegistryStatus(REGISTRY_STATUS); - registry.setBalance(REGISTRY_BALANCE); - registry.setSettlementDate(REGISTRY_SETTLEMENT_DATE); - registry.setSecurityId(REGISTRY_SECURITY_ID); - registry.setSessionType(REGISTRY_SESSION_TYPE); - registry.setClearingCode(REGISTRY_CLEARING_CODE); - registry.setSecuritySymbol(REGISTRY_SECURITY_SYMBOL); - registry.setContract(REGISTRY_CONTRACT); - registryMap.insert(registry); - - Session session = new Session(); - session.setId(REGISTRY_SESSION_ID); - session.setClearingDate(SESSION_CLEARING_DATE); - session.setUpdated(SESSION_UPDATE); - sessionMap.update(session); - - CompanySymbols companySymbols = new CompanySymbols(); - companySymbols.setCompanyId(REGISTRY_COMPANY_ID); - companySymbols.setCompanySymbol(COMPANY_SYMBOL_INN); - companySymbols.setCompanySymbolValue(COMPANY_SYMBOL_VALUE); - companySymbolsMap.insert(companySymbols); - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) liabilitiesRegisterService.getConsumer(), - Task.createRegistry_LBSR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = liabilitiesRegisterMap.getAllValues(); - assertEquals(0, allValues.size()); // пока объекты не создаются, только в csv/xlsx файлы записываются -// LiabilitiesRegister liabilitiesRegister = allValues.iterator().next(); -// assertEquals(REGISTRY_COMPANY_ID, liabilitiesRegister.getCompanyId()); -// assertEquals(REGISTRY_FULL_NAME, liabilitiesRegister.getCompanyFullName()); -// assertEquals(REGISTRY_CODE, liabilitiesRegister.getRegistryCode()); -// assertEquals(REGISTRY_ACCOUNT, liabilitiesRegister.getAccount()); -// assertEquals(REGISTRY_STATUS, liabilitiesRegister.getRegistryStatus()); -// assertEquals(REGISTRY_BALANCE, liabilitiesRegister.getSumLiabilities()); -// assertEquals(REGISTRY_SETTLEMENT_DATE, liabilitiesRegister.getSettlementDate()); -// assertEquals(SESSION_CLEARING_DATE, liabilitiesRegister.getValidFromDate()); -// assertEquals(TimeUtil.toLocalDate(SESSION_UPDATE), liabilitiesRegister.getValidToDate()); -// assertEquals(COMPANY_SYMBOL_VALUE, liabilitiesRegister.getInn()); - - // out file verify: - // out\registry_240131104359228.xlsx - List sendFiles = ((TestConfig.TestMockSFTP) reportsGateway).getSendFiles(); // mock TestMockSFTP - assertEquals(1, sendFiles.size()); - File tempFile = sendFiles.get(0); - assertTrue(tempFile.length() > 1000, "Out file \"" + tempFile + "\" too small: " + tempFile.length()); - tempFile.delete(); - } -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterServiceTest.java deleted file mode 100644 index 6ce6b7457..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterServiceTest.java +++ /dev/null @@ -1,192 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import com.opencsv.exceptions.CsvValidationException; -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.register.MoneyBalanceRegister; -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.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.SFTPTestConfig; -import ru.spcex.clearing.registry.config.TestConfig; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.io.IOException; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.util.Arrays; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - MoneyBalanceRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, - TestConfig.class, - SFTPTestConfig.class, -}) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class MoneyBalanceRegisterServiceTest implements InitializingBean { - private static final String REGISTRY_DESIGNATION = RegistryDesignation.A.getKey(); - private static final String REGISTRY_INSTRUMENT_TYPE = RegistryInstrumentType.M.getKey(); - private static final String REGISTRY_FULL_NAME = "MY FULLNAME"; - private static final String REGISTRY_CODE = "ANY CODE"; - private static final String REGISTRY_ACCOUNT = "CLRN VALUE"; - private static final String ACCOUNT_ACCOUNT = "ACCOUNT"; - private static final String REGISTRY_ACCOUNT_TYPE = "CLRN"; - private static final String REGISTRY_STATUS = "ANY STATUS"; - private static final Long REGISTRY_SESSION_ID = 1234L; - private static final Long REGISTRY_COMPANY_ID = 10101L; - private static final Long REGISTRY_SECURITY_ID = 123411L; - private static final BigDecimal REGISTRY_BALANCE = new BigDecimal(123411L); - private static final LocalDate REGISTRY_SETTLEMENT_DATE = LocalDate.now(); - private static final String COMPANY_SYMBOL_INN = CompanySymbol.INN.getKey(); - private static final String COMPANY_SYMBOL_VALUE = "ANY VALUE"; - private static final String COMPANY_SHORTNAME = "ANY VALUE"; - private static int requestCount = 0; - @Autowired - private MoneyBalanceRegisterService moneyBalanceRegisterService; - private Imdg moneyBalanceRegisterMap; - private Imdg registryHistoryMap; - private Imdg companyMap; - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @Autowired - private RegistryServiceSettings settings; - - @Autowired - @Qualifier("reportOutDir") - private File outFolder; - - @Override - public void afterPropertiesSet() throws Exception { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - moneyBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyBalanceRegister, MoneyBalanceRegister.class); - companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - registryHistoryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryHistory, RegistryHistory.class); - - Company company = new Company(); - company.setId(2L); - company.setShortName(COMPANY_SHORTNAME); - companyMap.insert(company); - } - - private RegistryHistory init() { - Registry registry = new Registry(); - registry.setTradingClearingRegistry("not null value"); - registry.setDiffBalance(BigDecimal.ZERO); - registry.setRegistryUnit(RegistryUnit.T.getKey()); - registry.setRegistryInstrumentType(REGISTRY_INSTRUMENT_TYPE); - registry.setRegistryDesignation(REGISTRY_DESIGNATION); - registry.setSessionId(REGISTRY_SESSION_ID); - registry.setCompanyId(REGISTRY_COMPANY_ID); - registry.setFullName(REGISTRY_FULL_NAME); - registry.setRegistryCode(REGISTRY_CODE); - registry.setAccount(REGISTRY_ACCOUNT); - registry.setAccountType(REGISTRY_ACCOUNT_TYPE); - registry.setRegistryStatus(REGISTRY_STATUS); - registry.setBalance(REGISTRY_BALANCE); - registry.setSettlementDate(REGISTRY_SETTLEMENT_DATE); - registry.setSecurityId(REGISTRY_SECURITY_ID); - RegistryHistory registryHistory = new RegistryHistory(); - registryHistory.setObject(registry); - registryHistory.setEventTime(Instant.now()); - registryHistoryMap.insert(registryHistory); - - return registryHistory; - } - - @Test - @Order(1) - void executionRegisterNewForClearingDate() { - RegistryHistory source = init(); - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(false); - - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - launcherCommandRequest.setCompanyId(REGISTRY_COMPANY_ID); - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) moneyBalanceRegisterService.getConsumer(), - Task.createRegistry_GBRR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = moneyBalanceRegisterMap.getAllValues(); - MoneyBalanceRegister moneyBalanceRegister = allValues.iterator().next(); - assertEquals(REGISTRY_COMPANY_ID, moneyBalanceRegister.getCompanyId()); - assertEquals(REGISTRY_BALANCE, moneyBalanceRegister.getRemainderSum()); - assertEquals(REGISTRY_ACCOUNT, moneyBalanceRegister.getAccount()); - assertEquals(COMPANY_SHORTNAME, moneyBalanceRegister.getSetHouseName()); - - settings.setCsvMode(oldCsvMode); - registryHistoryMap.delete(source); - } - - -// @Test - @Order(2) - void executionRegisterNewForClearingDate_CSV() throws CsvValidationException, IOException { - ReportTestUtils.resetDir(outFolder); - RegistryHistory source = init(); - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(true); - - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - launcherCommandRequest.setCompanyId(REGISTRY_COMPANY_ID); - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) moneyBalanceRegisterService.getConsumer(), - Task.createRegistry_GBRR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports/money_balance_register_expected.csv").getFile()); - ReportTestUtils.compareCSVFiles(expectedFile, outFile, Arrays.asList("Дата", "Время", "Номер отчета")); - - settings.setCsvMode(oldCsvMode); - ReportTestUtils.deleteDir(outFolder); - registryHistoryMap.delete(source); - } -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterServiceTest.java deleted file mode 100644 index fbbaa4674..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterServiceTest.java +++ /dev/null @@ -1,189 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import com.opencsv.exceptions.CsvValidationException; -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.payment.PaymentInstruction; -import ru.clearing.classes.statics.data.register.MoneyPaymentInstructionRegister; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.SFTPTestConfig; -import ru.spcex.clearing.registry.config.TestConfig; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.Task; -import ru.spcex.platform.enumeration.TransactionStatus; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.io.IOException; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.util.Arrays; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - MoneyPaymentInstructionRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, - TestConfig.class, - SFTPTestConfig.class, -}) -class MoneyPaymentInstructionRegisterServiceTest implements InitializingBean { - private static int requestCount = 0; - private Imdg moneyPaymentInstructionRegisterMap; - private Imdg paymentInstructionMap; - private Imdg sessionMap; - private Imdg companyMap; - private Imdg accountMap; - - private final String CREDITLEG_ACCOUNT_CONST = "CREDITLEG_ACCOUNT_CONST"; - private final Long CREDITLEG_ACCOUNT_ID_CONST = 101L; - private final BigDecimal CREDITLEG_AMOUNT_CONST = new BigDecimal(1); - private final String CREDITLEG_CURRENCYCODE_CONST = "CREDITLEG_CURRENCYCODE_CONST"; - private final String DEBITLEG_ACCOUNT_CONST = "DEBITLEG_ACCOUNT_CONST"; - private final String COMPANY_SHORT_NAME_SENDER_CONST = "COMPANY_SHORT_NAME_SENDER_CONST"; - private final String COMPANY_SHORT_NAME_ADDRESSEE_CONST = "COMPANY_SHORT_NAME_ADDRESSEE_CONST"; - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @Autowired - private MoneyPaymentInstructionRegisterService moneyPaymentInstructionRegisterService; - - @Autowired - @Qualifier("reportOutDir") - private File outFolder; - - @Autowired - private RegistryServiceSettings settings; - - @Override - public void afterPropertiesSet() throws Exception { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - moneyPaymentInstructionRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyPaymentInstructionRegister, MoneyPaymentInstructionRegister.class); - paymentInstructionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); - sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); - - Long sessionId = 1L; - Long companySenderId = 1L; - Long companyAddresseeId = 2L; - Session sessionMkr = new Session(); - sessionMkr.setSection("MKR"); - sessionMkr.setId(sessionId); - sessionMap.update(sessionMkr); - PaymentInstruction paymentInstruction = new PaymentInstruction(); - paymentInstruction.setSessionId(sessionId); - paymentInstruction.setClearingDate(LocalDate.now()); - paymentInstruction.setCreditLeg_account(CREDITLEG_ACCOUNT_CONST); - paymentInstruction.setCreditLeg_accountId(CREDITLEG_ACCOUNT_ID_CONST); - paymentInstruction.setCreditLeg_amount(CREDITLEG_AMOUNT_CONST); - paymentInstruction.setCreditLeg_currencyCode(CREDITLEG_CURRENCYCODE_CONST); - paymentInstruction.setDebitLeg_account(DEBITLEG_ACCOUNT_CONST); - paymentInstruction.setSenderId(companySenderId); - paymentInstruction.setAddresseeId(companyAddresseeId); - paymentInstruction.setTransactionStatus(TransactionStatus.sent.getKey()); - paymentInstruction.setCreated(Instant.now()); - paymentInstructionMap.insert(paymentInstruction); - Company companySender = new Company(); - companySender.setId(companySenderId); - companySender.setShortName(COMPANY_SHORT_NAME_SENDER_CONST); - companyMap.update(companySender); - Company companyAddressee = new Company(); - companyAddressee.setId(companyAddresseeId); - companyAddressee.setShortName(COMPANY_SHORT_NAME_ADDRESSEE_CONST); - companyMap.update(companyAddressee); - - Account account = new Account(); - account.setId(CREDITLEG_ACCOUNT_ID_CONST); - account.setAccountType(AccountType.Clrn.getKey()); - accountMap.update(account); - } - - - - @Test - @Order(1) - void executionRegisterNewForClearingDate() throws CsvValidationException, IOException { - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(false); - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) moneyPaymentInstructionRegisterService.getConsumer(), - Task.createRegistry_GORR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = moneyPaymentInstructionRegisterMap.getAllValues(); - MoneyPaymentInstructionRegister moneyPaymentInstructionRegister = allValues.iterator().next(); - assertEquals(CREDITLEG_ACCOUNT_CONST, moneyPaymentInstructionRegister.getCreditLegAccount()); - assertEquals(CREDITLEG_AMOUNT_CONST, moneyPaymentInstructionRegister.getCreditLegAmount()); - assertEquals(CREDITLEG_CURRENCYCODE_CONST, moneyPaymentInstructionRegister.getCreditLegCurrencyCode()); - assertEquals(DEBITLEG_ACCOUNT_CONST, moneyPaymentInstructionRegister.getDebitLegAccount()); - assertEquals(COMPANY_SHORT_NAME_SENDER_CONST, moneyPaymentInstructionRegister.getSender()); - assertEquals(COMPANY_SHORT_NAME_ADDRESSEE_CONST, moneyPaymentInstructionRegister.getAddressee()); - - settings.setCsvMode(oldCsvMode); - } - -// @Test - @Order(2) - void executionRegisterNewForClearingDate_CSV() throws CsvValidationException, IOException { - ReportTestUtils.resetDir(outFolder); - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(true); - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) moneyPaymentInstructionRegisterService.getConsumer(), - Task.createRegistry_GORR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports/money_payment_instruction_register_expected.csv").getFile()); - ReportTestUtils.compareCSVFiles(expectedFile, outFile, Arrays.asList("Время формирования", "Дата распоряжения", "Номер распоряжения")); - - settings.setCsvMode(oldCsvMode); - ReportTestUtils.deleteDir(outFolder); - } -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ReportTestUtils.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ReportTestUtils.java deleted file mode 100644 index a0b0c28d6..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ReportTestUtils.java +++ /dev/null @@ -1,106 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import com.opencsv.CSVParser; -import com.opencsv.CSVParserBuilder; -import com.opencsv.CSVReader; -import com.opencsv.CSVReaderBuilder; -import com.opencsv.exceptions.CsvValidationException; -import org.apache.commons.io.FileUtils; -import org.junit.jupiter.api.Assertions; - -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.*; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class ReportTestUtils { - - public static void compareCSVFiles(File expectedFile, File actualFile, List columnsForSkip) throws IOException, CsvValidationException { - if (columnsForSkip == null) columnsForSkip = Collections.emptyList(); - CSVParser csvParser = new CSVParserBuilder().withSeparator(',').withQuoteChar('\"').build(); - CSVReader expectedCSVReader = new CSVReaderBuilder(new FileReader(expectedFile)).withCSVParser(csvParser).build(); - CSVReader actualCSVReader = new CSVReaderBuilder(new FileReader(actualFile)).withCSVParser(csvParser).build(); - - Map expectedValueForColumn = new HashMap<>(); - Map actualValueForColumn = new HashMap<>(); - - String[] expectedHeaders = expectedCSVReader.readNext(); - String[] actualHeaders = actualCSVReader.readNext(); - assertEquals(expectedHeaders.length, actualHeaders.length); - - for (int headerIdx = 0; headerIdx < expectedHeaders.length; headerIdx++) { - String expectedHeader = expectedHeaders[headerIdx]; - String actualHeader = actualHeaders[headerIdx]; - if (!columnsForSkip.contains(expectedHeader)) expectedValueForColumn.put(expectedHeader, headerIdx); - if (!columnsForSkip.contains(actualHeader)) actualValueForColumn.put(actualHeader, headerIdx); - } - - List expectedLines = new ArrayList<>(); - do { - String[] expectedLine = expectedCSVReader.readNext(); - if (expectedLine == null) break; - expectedLines.add(expectedLine); - } while (true); - - List actualLines = new ArrayList<>(); - do { - String[] actualLine = actualCSVReader.readNext(); - if (actualLine == null) break; - actualLines.add(actualLine); - } while (true); - if (expectedLines.size() != actualLines.size()) { - Assertions.fail("expected and actual lines not equal"); - } - - for (String[] actualLine : actualLines) { - boolean findEqual = false; - for (String[] expectedLine : expectedLines) { - boolean lineEqual = true; - for (String expectedHeader : expectedValueForColumn.keySet()) { - int expectedIdx = expectedValueForColumn.get(expectedHeader); - int actualIdx = actualValueForColumn.get(expectedHeader); - String expected = expectedLine[expectedIdx]; - String actual = actualLine[actualIdx]; - lineEqual = expected.equals(actual); - if (!lineEqual) break; - } - if (lineEqual) { - findEqual = true; - break; - } - } - if (findEqual) continue; - Assertions.fail("For actual line '%s' not found expected line".formatted(String.join(", ", actualLine))); - } - - List errors = new ArrayList<>(); - for (int idx = 0; idx < expectedHeaders.length; idx++) { - if (!Objects.equals(expectedHeaders[idx], actualHeaders[idx])) { - errors.add("expected header (%s) for idx = %d not equal actual header (%s)".formatted( - expectedHeaders[idx], - idx, - actualHeaders[idx]) - ); - } - } - if (!errors.isEmpty()) { - Assertions.fail("Files equal, but header sequence broken, cause: %s".formatted(String.join(",", errors))); - } - - expectedCSVReader.close(); - actualCSVReader.close(); - } - - public static void resetDir(File folder) throws IOException { - FileUtils.deleteDirectory(folder); - folder = new File("out"); - folder.mkdirs(); - } - - public static void deleteDir(File folder) throws IOException { - FileUtils.deleteDirectory(folder); - } - -} diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/util/PreClearMapTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/util/PreClearMapTest.java deleted file mode 100644 index e6b8a8add..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/util/PreClearMapTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package ru.spcex.clearing.registry.util; - -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; -import ru.clearing.classes.objects.BusinessObject; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; -import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast; -import ru.spcex.platform.utils.time.TimeUtil; - -import java.time.LocalDate; - -import static org.junit.jupiter.api.Assertions.*; - -class PreClearMapTest { - - @Test - void instanceForLocalDateField() { - LocalDate dt = LocalDate.of(2023, 9, 29); - Imdg map = Mockito.mock(Imdg.class); - Mockito.when(map.getMapName()).thenReturn("Map_Test"); - ImdgPredicateBuilder pb = new ImdgPredicateBuilderHazelcast(); - Mockito.when(map.predicateBuilder()).thenReturn(pb); - - PreClearMap pcm = PreClearMap.instanceForLocalDateField(map, "dateField"); - assertEquals("PreClearMap{map=Map_Test, predicateBuilder=LocalDate predicate on dateField}", pcm.toString()); - - ImdgPredicate predicate = pcm.predicateBuilder.query(pb, dt); - assertEquals("dateField=2023-09-29", predicate.toString()); - } - - @Test - void instanceForInstantField() { - LocalDate dt = LocalDate.of(2023, 9, 29); - Imdg map = Mockito.mock(Imdg.class); - Mockito.when(map.getMapName()).thenReturn("Map_Test"); - ImdgPredicateBuilder pb = new ImdgPredicateBuilderHazelcast(); - Mockito.when(map.predicateBuilder()).thenReturn(pb); - - PreClearMap pcm = PreClearMap.instanceForInstantField(map, "dateField"); - assertEquals("PreClearMap{map=Map_Test, predicateBuilder=Instant predicate on dateField}", pcm.toString()); - - ImdgPredicate predicate = pcm.predicateBuilder.query(pb, dt); - assertEquals("(dateField>=2023-09-28T00:00:00Z AND dateField<2023-09-30T00:00:00Z)", predicate.toString()); -// String expectedQuery = "(dateField>=" + TimeUtil.localDateToInstant(dt) + " AND dateField<" + TimeUtil.localDateToInstant(dt.plusDays(1)) + ")"; -// assertEquals("(dateField>=2023-09-28T21:00:00Z AND dateField<2023-09-29T21:00:00Z)", predicate.toString()); -// assertEquals(expectedQuery, predicate.toString()); - } -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/MatcherFactory.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/MatcherFactory.java index bd87052c0..28d93b4ad 100644 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/MatcherFactory.java +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/MatcherFactory.java @@ -1,38 +1,38 @@ -package ru.spcex.clearing.registry.utils; - -import java.util.Arrays; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Factory for creating test matchers. - *

- * Comparing actual and expected objects via AssertJ - */ -public class MatcherFactory { - - public static Matcher usingIgnoringFieldsComparator(String... fieldsToIgnore) { - return new Matcher<>(fieldsToIgnore); - } - - public static class Matcher { - private final String[] fieldsToIgnore; - - private Matcher(String... fieldsToIgnore) { - this.fieldsToIgnore = fieldsToIgnore; - } - - public void assertMatch(T actual, T expected) { - assertThat(actual).usingRecursiveComparison().ignoringFields(fieldsToIgnore).isEqualTo(expected); - } - - @SafeVarargs - public final void assertMatch(Iterable actual, T... expected) { - assertMatch(actual, Arrays.asList(expected)); - } - - public void assertMatch(Iterable actual, Iterable expected) { - assertThat(actual).usingRecursiveFieldByFieldElementComparatorIgnoringFields(fieldsToIgnore).isEqualTo(expected); - } - } -} +package ru.spcex.clearing.registry.utils; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Factory for creating test matchers. + *

+ * Comparing actual and expected objects via AssertJ + */ +public class MatcherFactory { + + public static Matcher usingIgnoringFieldsComparator(String... fieldsToIgnore) { + return new Matcher<>(fieldsToIgnore); + } + + public static class Matcher { + private final String[] fieldsToIgnore; + + private Matcher(String... fieldsToIgnore) { + this.fieldsToIgnore = fieldsToIgnore; + } + + public void assertMatch(T actual, T expected) { + assertThat(actual).usingRecursiveComparison().ignoringFields(fieldsToIgnore).isEqualTo(expected); + } + + @SafeVarargs + public final void assertMatch(Iterable actual, T... expected) { + assertMatch(actual, Arrays.asList(expected)); + } + + public void assertMatch(Iterable actual, Iterable expected) { + assertThat(actual).usingRecursiveFieldByFieldElementComparatorIgnoringFields(fieldsToIgnore).isEqualTo(expected); + } + } +} diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/TestUtils.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/TestUtils.java index 4795327bb..83348dc99 100644 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/TestUtils.java +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/TestUtils.java @@ -1,128 +1,128 @@ -package ru.spcex.clearing.registry.utils; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.kafka.clients.consumer.ConsumerRecord; -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.MockProducer; -import org.apache.kafka.clients.producer.Producer; -import org.apache.kafka.clients.producer.ProducerRecord; -import org.apache.kafka.clients.producer.RecordMetadata; -import org.apache.kafka.common.TopicPartition; -import org.mockito.ArgumentCaptor; -import ru.spcex.clearing.platform.messaging.domain.ActionType; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; -import ru.spcex.platform.classes.base.SpcexObjectBase; -import ru.spcex.platform.imdg.api.Imdg; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.*; -import static ru.spcex.clearing.platform.messaging.service.Status.Success; -import static ru.spcex.clearing.registry.utils.MatcherFactory.usingIgnoringFieldsComparator; - -public class TestUtils { - public static final MatcherFactory.Matcher> BASE_REQUEST_MATCHER = usingIgnoringFieldsComparator(); - private static final ObjectMapper objectMapper = new ObjectMapper(); - - public static void waitingWhenAddedRecordAndCheckIt(Long id, MockProducer mockProducer, ArgumentCaptor producerRecord) { - BaseRequest predictableBaseRequest = new BaseRequest<>(); - predictableBaseRequest.setId(id); - predictableBaseRequest.setActionType(ActionType.SYSTEM); - RequestInfoUpdate requestInfoUpdate = new RequestInfoUpdate(); - requestInfoUpdate.setId(id); - requestInfoUpdate.setStatus(Success); - predictableBaseRequest.setRequestPayload(requestInfoUpdate); - - //waiting for kafka producer send message (finale event) - verify(mockProducer, timeout(30_000L).times(1)) - .send(producerRecord.capture()); - - BaseRequest baseRequestResult = (BaseRequest) producerRecord.getValue().value(); - assertEquals(Consts.REQUEST_INFO_UPDATE, producerRecord.getValue().topic()); - BASE_REQUEST_MATCHER.assertMatch(baseRequestResult, predictableBaseRequest); - } - - public static void addRecordToKafka(MockConsumer mockConsumer, String topic, int partition, long offset, String jsonValue) { - TopicPartition tp = new TopicPartition(topic, partition); - HashMap startOffsets = new HashMap<>(); - startOffsets.put(tp, 0L); - mockConsumer.updateBeginningOffsets(startOffsets); - mockConsumer.schedulePollTask(() -> { - mockConsumer.rebalance(Collections.singletonList(tp)); - mockConsumer.addRecord(new ConsumerRecord<>(topic, partition, offset, "key", jsonValue)); - }); - } - - public static String getJsonStringForNew(T accountRequest, long id) { - return getJsonBaseRequest(accountRequest, id, ActionType.NEW); - } - - public static String getJsonStringForUPDATE(T accountRequest, long id) { - return getJsonBaseRequest(accountRequest, id, ActionType.UPDATE); - } - - public static String getJsonStringForDELETE(T accountRequest, long id) { - return getJsonBaseRequest(accountRequest, id, ActionType.DELETE); - } - - private static String getJsonBaseRequest(T accountRequest, long id, ActionType actionType) { - BaseRequest baseRequest = new BaseRequest<>(); - baseRequest.setRequestPayload(accountRequest); - baseRequest.setId(id); - baseRequest.setActionType(actionType); - String jsonBaseRequest; - try { - jsonBaseRequest = objectMapper.writeValueAsString(baseRequest); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - return jsonBaseRequest; - } - - public static void setFuture(ArgumentCaptor captor, Producer mockProducer){ - TestUtils.FutureRecordMetadata future = spy(new TestUtils.FutureRecordMetadata()); - doReturn(future).when(mockProducer).send(captor.capture()); - } - - public static void clearAllInImdg(Imdg imdg) { - Collection values = imdg.getAllValues(); - values.forEach(imdg::delete); - } - - public static class FutureRecordMetadata implements Future { - @Override - public boolean cancel(boolean mayInterruptIfRunning) { - return false; - } - - @Override - public boolean isCancelled() { - return false; - } - - @Override - public boolean isDone() { - return false; - } - - @Override - public RecordMetadata get() throws InterruptedException, ExecutionException { - return null; - } - - @Override - public RecordMetadata get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - return null; - } - } -} +package ru.spcex.clearing.registry.utils; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.MockProducer; +import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.apache.kafka.common.TopicPartition; +import org.mockito.ArgumentCaptor; +import ru.spcex.clearing.platform.messaging.domain.ActionType; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.imdg.api.Imdg; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; +import static ru.spcex.clearing.platform.messaging.service.Status.Success; +import static ru.spcex.clearing.registry.utils.MatcherFactory.usingIgnoringFieldsComparator; + +public class TestUtils { + public static final MatcherFactory.Matcher> BASE_REQUEST_MATCHER = usingIgnoringFieldsComparator(); + private static final ObjectMapper objectMapper = new ObjectMapper(); + + public static void waitingWhenAddedRecordAndCheckIt(Long id, MockProducer mockProducer, ArgumentCaptor producerRecord) { + BaseRequest predictableBaseRequest = new BaseRequest<>(); + predictableBaseRequest.setId(id); + predictableBaseRequest.setActionType(ActionType.SYSTEM); + RequestInfoUpdate requestInfoUpdate = new RequestInfoUpdate(); + requestInfoUpdate.setId(id); + requestInfoUpdate.setStatus(Success); + predictableBaseRequest.setRequestPayload(requestInfoUpdate); + + //waiting for kafka producer send message (finale event) + verify(mockProducer, timeout(30_000L).times(1)) + .send(producerRecord.capture()); + + BaseRequest baseRequestResult = (BaseRequest) producerRecord.getValue().value(); + assertEquals(Consts.REQUEST_INFO_UPDATE, producerRecord.getValue().topic()); + BASE_REQUEST_MATCHER.assertMatch(baseRequestResult, predictableBaseRequest); + } + + public static void addRecordToKafka(MockConsumer mockConsumer, String topic, int partition, long offset, String jsonValue) { + TopicPartition tp = new TopicPartition(topic, partition); + HashMap startOffsets = new HashMap<>(); + startOffsets.put(tp, 0L); + mockConsumer.updateBeginningOffsets(startOffsets); + mockConsumer.schedulePollTask(() -> { + mockConsumer.rebalance(Collections.singletonList(tp)); + mockConsumer.addRecord(new ConsumerRecord<>(topic, partition, offset, "key", jsonValue)); + }); + } + + public static String getJsonStringForNew(T accountRequest, long id) { + return getJsonBaseRequest(accountRequest, id, ActionType.NEW); + } + + public static String getJsonStringForUPDATE(T accountRequest, long id) { + return getJsonBaseRequest(accountRequest, id, ActionType.UPDATE); + } + + public static String getJsonStringForDELETE(T accountRequest, long id) { + return getJsonBaseRequest(accountRequest, id, ActionType.DELETE); + } + + private static String getJsonBaseRequest(T accountRequest, long id, ActionType actionType) { + BaseRequest baseRequest = new BaseRequest<>(); + baseRequest.setRequestPayload(accountRequest); + baseRequest.setId(id); + baseRequest.setActionType(actionType); + String jsonBaseRequest; + try { + jsonBaseRequest = objectMapper.writeValueAsString(baseRequest); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + return jsonBaseRequest; + } + + public static void setFuture(ArgumentCaptor captor, Producer mockProducer){ + TestUtils.FutureRecordMetadata future = spy(new TestUtils.FutureRecordMetadata()); + doReturn(future).when(mockProducer).send(captor.capture()); + } + + public static void clearAllInImdg(Imdg imdg) { + Collection values = imdg.getAllValues(); + values.forEach(imdg::delete); + } + + public static class FutureRecordMetadata implements Future { + @Override + public boolean cancel(boolean mayInterruptIfRunning) { + return false; + } + + @Override + public boolean isCancelled() { + return false; + } + + @Override + public boolean isDone() { + return false; + } + + @Override + public RecordMetadata get() throws InterruptedException, ExecutionException { + return null; + } + + @Override + public RecordMetadata get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { + return null; + } + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java index 19bc9d688..50988fa24 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java @@ -35,18 +35,18 @@ public enum Task implements IEnumKey { terminationSession_ETRF("ETRF"),//Завершение торговой сессии по вторичным торгам reconciliationRequest_RCHK("RCHK"),//Запрос на сверку активов createRegistry_GRYT("GRYT"),//Сформировать регистр на текущий день - createRegistry_GRRT("GRRT"),//Сформировать реестр остатков ценных бумаг на текущий день + @Deprecated createRegistry_GRRT("GRRT"),//Сформировать реестр остатков ценных бумаг на текущий день createRegistry_GBRR("GBRR"),//Сформировать реестра остатков денежных средств на текущий день - createRegistry_GORD("GORD"), // Формирование реестра распоряжений, направленных расчетному депозитарию - createRegistry_GORR("GORR"), // Формирование реестра распоряжений, направленных расчетному депозитарию - createRegistry_GCMR("GCMR"), // Формирование реестра участников клиринга - createRegistry_GSRR("GSRR"), // Формирование реестра отправленных отчетов - createRegistry_GACA("GACA"), // Создание файла остатков CSV по клиринговым счетам + @Deprecated createRegistry_GORD("GORD"), // Формирование реестра распоряжений, направленных расчетному депозитарию + @Deprecated createRegistry_GORR("GORR"), // Формирование реестра распоряжений, направленных расчетному депозитарию + @Deprecated createRegistry_GCMR("GCMR"), // Формирование реестра участников клиринга + @Deprecated createRegistry_GSRR("GSRR"), // Формирование реестра отправленных отчетов + @Deprecated createRegistry_GACA("GACA"), // Создание файла остатков CSV по клиринговым счетам @Deprecated createRegistry_ADLR("ADLR"), // формирование admittedLiabilitiesRegister @Deprecated createRegistry_CDLR("CDLR"), // формирование coveredLiabilitiesRegister @Deprecated createRegistry_EXLR("EXLR"), // формирование excludeLiabilitiesRegister - createRegistry_LBSR("LBSR"), // формирование liabilitiesRegister - createRegistry_ECNR("ECNR"), // формирование executionRegister + @Deprecated createRegistry_LBSR("LBSR"), // формирование liabilitiesRegister + @Deprecated createRegistry_ECNR("ECNR"), // формирование executionRegister createRegistry_STRS("STRS"), // Начало торговой сессии createRegistry_ETRS("ETRS"), // Завершение торговой сессии forming_CMBA("CMBA"), // Формирование распоряжения на перевод с ТБС diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index aa858290f..849461d46 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -173,22 +173,22 @@ public interface Consts { String REGISTRY_RETURN_DEPOSIT_ACTION = "registry-return-deposit-action"; String REGISTRY_CHANGE_REFUND_DATE_ACTION = "registry-change-refund-date-action"; String REGISTRY_CHANGE_STATUS_EXTRACT_ACTION = "registry-change-status-extract-action"; - String REGISTRY_COVERED_DEAL_REGISTER_NEW = "registry-covered-deal-register-new"; - String REGISTRY_ADMITTED_DEAL_REGISTER_NEW = "registry-admitted-deal-register-new"; + @Deprecated String REGISTRY_COVERED_DEAL_REGISTER_NEW = "registry-covered-deal-register-new"; + @Deprecated String REGISTRY_ADMITTED_DEAL_REGISTER_NEW = "registry-admitted-deal-register-new"; String REGISTRY_DEAL_REGISTER_NEW = "registry-deal-register-new"; - String REGISTRY_DEPO_BALANCE_REGISTER_NEW = "registry-depo-balance-register-new"; - String REGISTRY_MONEY_BALANCE_REGISTER_NEW = "registry-money-balance-register-new"; - String REGISTRY_ADMITTED_LIABILITIES_REGISTER_NEW = "registry-admitted-liabilities-register-new"; - String REGISTRY_COVERED_LIABILITIES_REGISTER_NEW = "registry-covered-liabilities-register-new"; - String REGISTRY_MONEY_PAYMENT_INSTRUCTION_REGISTER_NEW = "registry-money-payment-instruction-register-new"; - String REGISTRY_DEPO_PAYMENT_INSTRUCTION_REGISTER_NEW = "registry-depo-payment-instruction-register-new"; - String REGISTRY_EXCLUDE_LIABILITIES_REGISTER_NEW = "registry-exclude-liabilities-register-new"; - String REGISTRY_LIABILITIES_REGISTER_NEW = "registry-liabilities-register-new"; - String REGISTRY_EXECUTION_REGISTER_ON_SAVE = "registry-execution-register-on-save"; - String REGISTRY_EXECUTION_REGISTER_UPDATE = "registry-execution-register-update"; + @Deprecated String REGISTRY_DEPO_BALANCE_REGISTER_NEW = "registry-depo-balance-register-new"; + @Deprecated String REGISTRY_MONEY_BALANCE_REGISTER_NEW = "registry-money-balance-register-new"; + @Deprecated String REGISTRY_ADMITTED_LIABILITIES_REGISTER_NEW = "registry-admitted-liabilities-register-new"; + @Deprecated String REGISTRY_COVERED_LIABILITIES_REGISTER_NEW = "registry-covered-liabilities-register-new"; + @Deprecated String REGISTRY_MONEY_PAYMENT_INSTRUCTION_REGISTER_NEW = "registry-money-payment-instruction-register-new"; + @Deprecated String REGISTRY_DEPO_PAYMENT_INSTRUCTION_REGISTER_NEW = "registry-depo-payment-instruction-register-new"; + @Deprecated String REGISTRY_EXCLUDE_LIABILITIES_REGISTER_NEW = "registry-exclude-liabilities-register-new"; + @Deprecated String REGISTRY_LIABILITIES_REGISTER_NEW = "registry-liabilities-register-new"; + @Deprecated String REGISTRY_EXECUTION_REGISTER_ON_SAVE = "registry-execution-register-on-save"; + @Deprecated String REGISTRY_EXECUTION_REGISTER_UPDATE = "registry-execution-register-update"; String REGISTRY_IDENTIFICATION_FUNDS = "registry-identification-funds"; - String DESTINATION_TRADING_CLEARING_REGISTRY_ON_TCRLIST_NEW = "registry-on-trading_clearing_registry_list-new"; + @Deprecated String DESTINATION_TRADING_CLEARING_REGISTRY_ON_TCRLIST_NEW = "registry-on-trading_clearing_registry_list-new"; String DESTINATION_CURRENCY_PAIR_SECURITIES_NEW = "currency-pair-securities-new";