Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
ialbert 2022-09-02 14:25:12 +03:00
commit 2fc1528da3
69 changed files with 2383 additions and 194 deletions

View file

@ -253,7 +253,7 @@
<companySymbol type="12" name="Идентификатор справочника" shortname="Идентификатор справочника" searchable="true" sortable="true" visible="true" link="companySymbol"/>
<companySymbolValue type="2" length="255" name="Значение справочника" shortname="Значение" searchable="true" sortable="true" visible="true"/>
</companySymbols>
<keyRate name="Ключевая ставка ЦБ" class="ru.clearing.classes.StaticData.Misc.KeyRate">
<keyRate name="Ключевая ставка ЦБ" class="ru.clearing.classes.static.data.misc.KeyRate">
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true" visible="true"/>
<rate type="10" name="Ключевая ставка ЦБ РФ" shortname="Ставка" searchable="true" sortable="true" visible="true"/>
<startDate type="6" name="Дата начала действия ключевой ставки" shortname="Начальная дата" searchable="true" sortable="true" visible="true"/>

View file

@ -0,0 +1,51 @@
package ru.clearing.classes.StaticData.Account;
import ru.clearing.classes.ConstSerializable;
import ru.clearing.classes.objects.BusinessObject;
/**
* Счета
* <p>
* DB table: ACCOUNT
**/
public class Account extends BusinessObject {
private static final long serialVersionUID = ConstSerializable.serialVersionUID;
private String account;
private String accountType;
private Long relationId;
private String status;
public String getAccount() {
return account;
}
public void setAccount(String value) {
this.account = value;
}
public String getAccountType() {
return accountType;
}
public void setAccountType(String value) {
this.accountType = value;
}
public Long getRelationId() {
return relationId;
}
public void setRelationId(Long value) {
this.relationId = value;
}
public String getStatus() {
return status;
}
public void setStatus(String value) {
this.status = value;
}
}

View file

@ -0,0 +1,45 @@
package ru.clearing.classes.StaticData.Account;
import ru.clearing.classes.ConstSerializable;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import java.io.Serial;
/**
* Маршрутизация счета
* <p>
* DB table: ACCOUNT_ROUTING
**/
public class AccountRouting extends SpcexObjectBase {
@Serial
private static final long serialVersionUID = ConstSerializable.serialVersionUID;
private Long destinationId;
private Long relationId;
private Long sourceId;
public Long getDestinationId() {
return destinationId;
}
public void setDestinationId(Long value) {
this.destinationId = value;
}
public Long getRelationId() {
return relationId;
}
public void setRelationId(Long value) {
this.relationId = value;
}
public Long getSourceId() {
return sourceId;
}
public void setSourceId(Long value) {
this.sourceId = value;
}
}

View file

@ -0,0 +1,123 @@
package ru.clearing.classes.StaticData.Account;
import ru.clearing.classes.ConstSerializable;
import ru.spcex.platform.classes.base.SpcexObjectBase;
/**
* Банковские счета
* <p>
* DB table: BANK_ACCOUNT
**/
public class BankAccount extends SpcexObjectBase {
private static final long serialVersionUID = ConstSerializable.serialVersionUID;
private Long accountId;
private String bankIdentificationCode;
private String bankName;
private String correspondentAccountName;
private String currency;
private String destination;
private String iban;
private String internationalTransferSign;
private String swiftCode;
private String taxpayerIdentificationNumber;
private String taxRegistrationReasonCode;
private String correspondentAccount;
public Long getAccountId() {
return accountId;
}
public void setAccountId(Long value) {
this.accountId = value;
}
public String getBankIdentificationCode() {
return bankIdentificationCode;
}
public void setBankIdentificationCode(String value) {
this.bankIdentificationCode = value;
}
public String getBankName() {
return bankName;
}
public void setBankName(String value) {
this.bankName = value;
}
public String getCorrespondentAccountName() {
return correspondentAccountName;
}
public void setCorrespondentAccountName(String value) {
this.correspondentAccountName = value;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String value) {
this.currency = value;
}
public String getDestination() {
return destination;
}
public void setDestination(String value) {
this.destination = value;
}
public String getIban() {
return iban;
}
public void setIban(String value) {
this.iban = value;
}
public String getInternationalTransferSign() {
return internationalTransferSign;
}
public void setInternationalTransferSign(String value) {
this.internationalTransferSign = value;
}
public String getSwiftCode() {
return swiftCode;
}
public void setSwiftCode(String value) {
this.swiftCode = value;
}
public String getTaxpayerIdentificationNumber() {
return taxpayerIdentificationNumber;
}
public void setTaxpayerIdentificationNumber(String value) {
this.taxpayerIdentificationNumber = value;
}
public String getTaxRegistrationReasonCode() {
return taxRegistrationReasonCode;
}
public void setTaxRegistrationReasonCode(String value) {
this.taxRegistrationReasonCode = value;
}
public String getCorrespondentAccount() {
return correspondentAccount;
}
public void setCorrespondentAccount(String value) {
this.correspondentAccount = value;
}
}

View file

@ -0,0 +1,51 @@
package ru.clearing.classes.StaticData.Account;
import ru.clearing.classes.ConstSerializable;
import ru.spcex.platform.classes.base.SpcexObjectBase;
/**
* Клиринговые счета
* <p>
* DB table: CLEARING_ACCOUNT
**/
public class ClearingAccount extends SpcexObjectBase {
private static final long serialVersionUID = ConstSerializable.serialVersionUID;
private Long accountId;
private Long cashAccountId;
private Long depoAccountId;
private String settlementCode;
public Long getAccountId() {
return accountId;
}
public void setAccountId(Long value) {
this.accountId = value;
}
public Long getCashAccountId() {
return cashAccountId;
}
public void setCashAccountId(Long value) {
this.cashAccountId = value;
}
public Long getDepoAccountId() {
return depoAccountId;
}
public void setDepoAccountId(Long value) {
this.depoAccountId = value;
}
public String getSettlementCode() {
return settlementCode;
}
public void setSettlementCode(String value) {
this.settlementCode = value;
}
}

View file

@ -0,0 +1,70 @@
package ru.clearing.classes.StaticData.Company.Relation;
import ru.clearing.classes.ConstSerializable;
import ru.clearing.classes.objects.BusinessObject;
import ru.spcex.platform.classes.base.SpcexObjectBase;
/**
* Договорные отношения
* <p>
* DB table: RELATION
**/
public class Relation extends BusinessObject {
private static final long serialVersionUID = ConstSerializable.serialVersionUID;
private Long consumerId;
private Long supplierId;
private String serviceStatus;
private Long serviceId;
private Long serviceProductId;
private String comment;
public Long getConsumerId() {
return consumerId;
}
public void setConsumerId(Long value) {
this.consumerId = value;
}
public Long getSupplierId() {
return supplierId;
}
public void setSupplierId(Long value) {
this.supplierId = value;
}
public String getServiceStatus() {
return serviceStatus;
}
public void setServiceStatus(String value) {
this.serviceStatus = value;
}
public Long getServiceId() {
return serviceId;
}
public void setServiceId(Long value) {
this.serviceId = value;
}
public Long getServiceProductId() {
return serviceProductId;
}
public void setServiceProductId(Long value) {
this.serviceProductId = value;
}
public String getComment() {
return comment;
}
public void setComment(String value) {
this.comment = value;
}
}

View file

@ -0,0 +1,33 @@
package ru.clearing.classes.StaticData.generated;
import ru.clearing.classes.ConstSerializable;
import ru.spcex.platform.classes.base.SpcexObjectBase;
/**
* Категории участника клиринга
* <p>
* DB table: CLEARING_MEMBER_CATEGORY
**/
public class ClearingMemberCategory extends SpcexObjectBase {
private static final long serialVersionUID = ConstSerializable.serialVersionUID;
private Long companyId;
private String clearingMemberCategory;
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long value) {
this.companyId = value;
}
public String getClearingMemberCategory() {
return clearingMemberCategory;
}
public void setClearingMemberCategory(String value) {
this.clearingMemberCategory = value;
}
}

View file

@ -1,7 +1,7 @@
package ru.clearing.classes.StaticData.Company;
package ru.clearing.classes.statics.data.company;
import ru.clearing.classes.ConstSerializable;
import ru.clearing.classes.StaticData.Profile.CompanyInfo;
import ru.clearing.classes.statics.data.profile.CompanyInfo;
import ru.clearing.classes.objects.BusinessObject;
import java.io.Serial;

View file

@ -1,4 +1,4 @@
package ru.clearing.classes.StaticData.Company;
package ru.clearing.classes.statics.data.company;
import ru.clearing.classes.ConstSerializable;
import ru.spcex.platform.classes.base.SpcexObjectBase;

View file

@ -1,4 +1,4 @@
package ru.clearing.classes.StaticData.Company;
package ru.clearing.classes.statics.data.company;
import ru.clearing.classes.ConstSerializable;
import ru.spcex.platform.classes.base.SpcexObjectBase;

View file

@ -1,4 +1,4 @@
package ru.clearing.classes.StaticData.Company;
package ru.clearing.classes.statics.data.company;
import ru.clearing.classes.ConstSerializable;
import ru.clearing.classes.objects.BusinessEvent;

View file

@ -1,59 +1,58 @@
package ru.clearing.classes.StaticData.Misc;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import java.math.BigDecimal;
import java.time.Instant;
/**
* Ключевая ставка ЦБ
*
* DB table: KEY_RATE
**/
public class KeyRate extends SpcexObjectBase {
private BigDecimal rate;
private Instant startDate;
private Instant endDate;
private String document;
private String workflowStatus;
public BigDecimal getRate() {
return rate;
}
public void setRate(BigDecimal rate) {
this.rate = rate;
}
public Instant getStartDate() {
return startDate;
}
public void setStartDate(Instant startDate) {
this.startDate = startDate;
}
public Instant getEndDate() {
return endDate;
}
public void setEndDate(Instant endDate) {
this.endDate = endDate;
}
public String getDocument() {
return document;
}
public void setDocument(String document) {
this.document = document;
}
public String getWorkflowStatus() {
return workflowStatus;
}
public void setWorkflowStatus(String workflowStatus) {
this.workflowStatus = workflowStatus;
}
}
package ru.clearing.classes.statics.data.misc;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import java.time.Instant;
/**
* Ключевая ставка ЦБ
*
* DB table: KEY_RATE
**/
public class KeyRate extends SpcexObjectBase {
private Double rate;
private Instant startDate;
private Instant endDate;
private String document;
private String workflowStatus;
public Double getRate() {
return rate;
}
public void setRate(Double rate) {
this.rate = rate;
}
public Instant getStartDate() {
return startDate;
}
public void setStartDate(Instant startDate) {
this.startDate = startDate;
}
public Instant getEndDate() {
return endDate;
}
public void setEndDate(Instant endDate) {
this.endDate = endDate;
}
public String getDocument() {
return document;
}
public void setDocument(String document) {
this.document = document;
}
public String getWorkflowStatus() {
return workflowStatus;
}
public void setWorkflowStatus(String workflowStatus) {
this.workflowStatus = workflowStatus;
}
}

View file

@ -1,95 +1,95 @@
package ru.clearing.classes.StaticData.Misc;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import java.math.BigDecimal;
import java.time.Instant;
/**
* Инструменты Денежного рынка
* <p>
* DB table: MONEY_MARKET_SECURITY
**/
public class MoneyMarketSecurity extends SpcexObjectBase {
private Long securityId;// (linked to security)
private String description;
private Instant startDate;
private Instant endDate;
private BigDecimal nominalValue;
private Long nominalCurrency; // (linked to currencyCode)
private String instrumentType; // (linked to instrumentType)
private String fullName;
private String securitySymbol;
public Long getSecurityId() {
return securityId;
}
public void setSecurityId(Long securityId) {
this.securityId = securityId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Instant getStartDate() {
return startDate;
}
public void setStartDate(Instant startDate) {
this.startDate = startDate;
}
public Instant getEndDate() {
return endDate;
}
public void setEndDate(Instant endDate) {
this.endDate = endDate;
}
public BigDecimal getNominalValue() {
return nominalValue;
}
public void setNominalValue(BigDecimal nominalValue) {
this.nominalValue = nominalValue;
}
public Long getNominalCurrency() {
return nominalCurrency;
}
public void setNominalCurrency(Long nominalCurrency) {
this.nominalCurrency = nominalCurrency;
}
public String getInstrumentType() {
return instrumentType;
}
public void setInstrumentType(String instrumentType) {
this.instrumentType = instrumentType;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getSecuritySymbol() {
return securitySymbol;
}
public void setSecuritySymbol(String securitySymbol) {
this.securitySymbol = securitySymbol;
}
}
package ru.clearing.classes.statics.data.misc;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import java.math.BigDecimal;
import java.time.Instant;
/**
* Инструменты Денежного рынка
* <p>
* DB table: MONEY_MARKET_SECURITY
**/
public class MoneyMarketSecurity extends SpcexObjectBase {
private Long securityId;// (linked to security)
private String description;
private Instant startDate;
private Instant endDate;
private BigDecimal nominalValue;
private Long nominalCurrency; // (linked to currencyCode)
private String instrumentType; // (linked to instrumentType)
private String fullName;
private String securitySymbol;
public Long getSecurityId() {
return securityId;
}
public void setSecurityId(Long securityId) {
this.securityId = securityId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Instant getStartDate() {
return startDate;
}
public void setStartDate(Instant startDate) {
this.startDate = startDate;
}
public Instant getEndDate() {
return endDate;
}
public void setEndDate(Instant endDate) {
this.endDate = endDate;
}
public BigDecimal getNominalValue() {
return nominalValue;
}
public void setNominalValue(BigDecimal nominalValue) {
this.nominalValue = nominalValue;
}
public Long getNominalCurrency() {
return nominalCurrency;
}
public void setNominalCurrency(Long nominalCurrency) {
this.nominalCurrency = nominalCurrency;
}
public String getInstrumentType() {
return instrumentType;
}
public void setInstrumentType(String instrumentType) {
this.instrumentType = instrumentType;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getSecuritySymbol() {
return securitySymbol;
}
public void setSecuritySymbol(String securitySymbol) {
this.securitySymbol = securitySymbol;
}
}

View file

@ -1,4 +1,4 @@
package ru.clearing.classes.StaticData.Profile;
package ru.clearing.classes.statics.data.profile;
import ru.clearing.classes.ConstSerializable;
import ru.spcex.platform.classes.base.SpcexObjectBase;

View file

@ -1,4 +1,4 @@
package ru.clearing.classes.StaticData.Profile;
package ru.clearing.classes.statics.data.profile;
import ru.clearing.classes.ConstSerializable;
import ru.spcex.platform.classes.base.SpcexObjectBase;

View file

@ -1,4 +1,4 @@
package ru.clearing.classes.StaticData.Profile;
package ru.clearing.classes.statics.data.profile;
import ru.clearing.classes.ConstSerializable;
import ru.spcex.platform.classes.base.SpcexObjectBase;

View file

@ -1,4 +1,4 @@
package ru.clearing.classes.StaticData.User;
package ru.clearing.classes.statics.data.user;
import ru.clearing.classes.ConstSerializable;

View file

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-1.0.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>company-service</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-messaging</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-imdg-api-hazelcast-impl</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>application.properties</exclude>
</excludes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>

View file

@ -0,0 +1,12 @@
package ru.spcex.clearing.company;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class CompanyServiceApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(CompanyServiceApplication.class);
app.run(args);
}
}

View file

@ -0,0 +1,17 @@
package ru.spcex.clearing.company.config;
import org.apache.kafka.clients.consumer.Consumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.spcex.clearing.company.config.settings.CompanyServiceSettings;
import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory;
@Configuration
public class KafkaConfig {
@Autowired
@Bean
public Consumer<String, Object> createProducer(CompanyServiceSettings settings) {
return KafkaConsumerFactory.consumer(settings.getKafka());
}
}

View file

@ -0,0 +1,47 @@
package ru.spcex.clearing.company.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.company.config.settings.CompanyServiceSettings;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
@Configuration
public class UtilityServiceImdgConfig {
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,
CompanyServiceSettings settings
) {
return new HazelcastService(taskExecutorHazelcastClientInitializer,
taskExecutorIdGeneratorAwaiter,
settings.getHazelcast());
}
}

View file

@ -0,0 +1,31 @@
package ru.spcex.clearing.company.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.platform.imdg.iml.hazelcast.config.HazelcastClientParams;
@Component
@PropertySource("file:${spring.config.location}/application.properties")
@ConfigurationProperties("utility-service")
public class CompanyServiceSettings {
private HazelcastClientParams hazelcast;
private KafkaConsumerSettings kafka;
public HazelcastClientParams getHazelcast() {
return hazelcast;
}
public void setHazelcast(HazelcastClientParams hazelcast) {
this.hazelcast = hazelcast;
}
public KafkaConsumerSettings getKafka() {
return kafka;
}
public void setKafka(KafkaConsumerSettings kafka) {
this.kafka = kafka;
}
}

View file

@ -0,0 +1,56 @@
package ru.spcex.clearing.company.service;
import org.apache.kafka.clients.consumer.Consumer;
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.profile.CompanyInfo;
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.company.CompanyInfoUpdateRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Service
public class CompanyInfoService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<CompanyInfo> companyInfoMap;
@Autowired
public CompanyInfoService(Consumer<String, Object> kafkaQueue, ImdgProvider imdgProvider) {
super(kafkaQueue);
this.companyInfoMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, CompanyInfo.class);
}
@Override
public void afterPropertiesSet() {
callback(CompanyInfoUpdateRequest.class)
.setConsumer(this::companyInfoUpdate)
.forDestination(Consts.DESTINATION_COMPANY_INFO_UPDATE, callbacks::put);
init();
}
public void companyInfoUpdate(BaseRequest<CompanyInfoUpdateRequest> userRequest) {
CompanyInfoUpdateRequest req = userRequest.getRequestPayload();
log.debug("CompanyInfoUpdateRequest received");
CompanyInfo companyInfo = companyInfoMap.getSingleObjectByID(req.getId());
companyInfo.setCorporationSoleType(req.getCorporationSoleType());
companyInfo.setCountryCode(req.getCountryCode());
companyInfo.setDescription(req.getDescription());
companyInfo.setProfessionalSign(req.getProfessionalSign());
companyInfo.setLegalKind(req.getLegalKind());
companyInfo.setOrganizationType(req.getOrganizationType());
companyInfo.setResidence(req.getResidence());
companyInfo.setShortNameEng(req.getShortNameEng());
companyInfo.setFullNameEng(req.getFullNameEng());
companyInfo.setShortName(req.getShortName());
companyInfo.setFullName(req.getFullName());
companyInfoMap.update(companyInfo);
log.debug("successfully processed, id {}", companyInfo.getId());
}
}

View file

@ -0,0 +1,43 @@
package ru.spcex.clearing.company.service;
import org.apache.kafka.clients.consumer.Consumer;
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.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.common.CommonDeleteRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Service
public class CompanyService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<Company> companyMap;
@Autowired
public CompanyService(Consumer<String, Object> kafkaQueue, ImdgProvider imdgProvider) {
super(kafkaQueue);
this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
}
@Override
public void afterPropertiesSet() {
callback(CommonDeleteRequest.class)
.setConsumer(this::deleteCompany)
.forDestination(Consts.DESTINATION_COMPANY_DELETE, callbacks::put);
init();
}
private void deleteCompany(BaseRequest<CommonDeleteRequest> userRequest) {
CommonDeleteRequest req = userRequest.getRequestPayload();
log.debug("CommonDeleteRequest received id = {}", req.getId());
Company company = companyMap.getSingleObjectByID(req.getId());
companyMap.delete(company);
}
}

View file

@ -0,0 +1,48 @@
package ru.spcex.clearing.company.service;
import org.apache.kafka.clients.consumer.Consumer;
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.CompanySymbols;
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.company.CompanySymbolUpdateRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Service
public class CompanySymbolService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<CompanySymbols> companySymbolsMap;
@Autowired
public CompanySymbolService(Consumer<String, Object> kafkaQueue, ImdgProvider imdgProvider) {
super(kafkaQueue);
this.companySymbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
}
@Override
public void afterPropertiesSet() {
callback(CompanySymbolUpdateRequest.class)
.setConsumer(this::companySymbolUpdate)
.forDestination(Consts.DESTINATION_COMPANY_SYMBOL_UPDATE, callbacks::put);
init();
}
public void companySymbolUpdate(BaseRequest<CompanySymbolUpdateRequest> userRequest) {
CompanySymbolUpdateRequest req = userRequest.getRequestPayload();
log.debug("CompanySymbolUpdateRequest received");
CompanySymbols companySymbols = companySymbolsMap.getSingleObjectByID(req.getId());
companySymbols.setCompanySymbol(req.getCompanySymbol());
companySymbols.setCompanySymbolValue(req.getCompanySymbolValue());
companySymbolsMap.update(companySymbols);
log.debug("successfully processed, id {}", companySymbols.getId());
}
}

View file

@ -0,0 +1,45 @@
package ru.spcex.clearing.company.service;
import org.apache.kafka.clients.consumer.Consumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import ru.clearing.classes.statics.data.profile.Contact;
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.company.ContactUpdateRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
public class ContactService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<Contact> contactMap;
@Autowired
public ContactService(Consumer<String, Object> kafkaQueue, ImdgProvider imdgProvider) {
super(kafkaQueue);
this.contactMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Contact, Contact.class);
}
@Override
public void afterPropertiesSet() {
callback(ContactUpdateRequest.class)
.setConsumer(this::contactUpdate)
.forDestination(Consts.DESTINATION_CONTACT_UPDATE, callbacks::put);
init();
}
public void contactUpdate(BaseRequest<ContactUpdateRequest> userRequest) {
ContactUpdateRequest req = userRequest.getRequestPayload();
log.debug("CompanySymbolUpdateRequest received");
Contact contact = contactMap.getSingleObjectByID(req.getId());
contact.setContactType(req.getContactType());
contact.setContactValue(req.getContactValue());
contactMap.update(contact);
log.debug("successfully processed, id {}", contact.getId());
}
}

View file

@ -0,0 +1,13 @@
spring.main.web-application-type=none
utility-service.hazelcast.cluster-members=127.0.0.1
utility-service.hazelcast.login=dev
utility-service.hazelcast.password=dev-pass
utility-service.kafka.bootstrap-servers=localhost:9092
utility-service.kafka.group-id=dev-group
utility-service.kafka.enable-auto-commit=false
utility-service.kafka.session-timeout-ms=30000
utility-service.kafka.auto-offset-reset=latest
utility-service.kafka.linger-ms=1
utility-service.kafka.buffer-memory=33554432

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- |%X{ru.nbch.scoring.web.logging.mdc_key}-->
<Pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %class{0}:%line - %message%n</Pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/company-service.log</file>
<encoder>
<!-- |%X{ru.nbch.scoring.web.logging.mdc_key}-->
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{0}:%msg%n</Pattern>
<charset>utf8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>
./logs/company-service.%i.log
</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>10</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>500MB</maxFileSize>
</triggeringPolicy>
</appender>
<root level="warn">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<logger name="ru.spcex" level="debug" additivity="false">
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</logger>
</configuration>

View file

@ -1,6 +1,26 @@
-- DB version: 0.0.0.5
/* Dictionaries */
-- interestStatus - Справочник статусов возваращения процентов
CREATE TABLE IF NOT EXISTS INTEREST_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE char(4), NAME varchar(255));
COMMENT ON TABLE INTEREST_STATUS_DICTIONARY IS 'Справочник статусов возваращения процентов';
COMMENT ON COLUMN INTEREST_STATUS_DICTIONARY.ID IS 'Идентификатор записи';
COMMENT ON COLUMN INTEREST_STATUS_DICTIONARY.CODE IS 'Код';
COMMENT ON COLUMN INTEREST_STATUS_DICTIONARY.NAME IS 'Наименование';
-- clearingStatus - Справочник результатов клиринга
CREATE TABLE IF NOT EXISTS CLEARING_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE char(4), NAME varchar(255));
COMMENT ON TABLE CLEARING_STATUS_DICTIONARY IS 'Справочник результатов клиринга';
COMMENT ON COLUMN CLEARING_STATUS_DICTIONARY.ID IS 'Идентификатор записи';
COMMENT ON COLUMN CLEARING_STATUS_DICTIONARY.CODE IS 'Код';
COMMENT ON COLUMN CLEARING_STATUS_DICTIONARY.NAME IS 'Наименование';
-- workflowStatus - Справочник статусов бизнес-процессов
CREATE TABLE IF NOT EXISTS WORKFLOW_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE char(4), NAME varchar(255));
COMMENT ON TABLE WORKFLOW_STATUS_DICTIONARY IS 'Справочник статусов бизнес-процессов';
@ -253,7 +273,7 @@ COMMENT ON COLUMN RESULT_STATUS_DICTIONARY.CODE IS 'Код';
COMMENT ON COLUMN RESULT_STATUS_DICTIONARY.NAME IS 'Статус обработки';
-- extError -
-- extError -
CREATE TABLE IF NOT EXISTS EXT_ERROR_DICTIONARY(ID bigint PRIMARY KEY, CODE char(4), NAME varchar(255));
COMMENT ON TABLE EXT_ERROR_DICTIONARY IS '';
@ -305,9 +325,9 @@ COMMENT ON COLUMN COMPANY.CREATED_AT IS 'Дата и время создания
COMMENT ON COLUMN COMPANY.UPDATED_AT IS 'Дата и время изменения записи';
COMMENT ON COLUMN COMPANY.TRADING_CODE IS 'Торговый код';
COMMENT ON COLUMN COMPANY.TRADING_CODE IS 'Код участника торгов';
COMMENT ON COLUMN COMPANY.CLEARING_CODE IS 'Клиринговый код';
COMMENT ON COLUMN COMPANY.CLEARING_CODE IS 'Код участника клиринга';
COMMENT ON COLUMN COMPANY.WORKFLOW_STATUS IS 'Статус (linked to workflowStatus)';
@ -316,7 +336,7 @@ COMMENT ON COLUMN COMPANY.SHORT_NAME IS 'Краткое наименование
COMMENT ON COLUMN COMPANY.FULL_NAME IS 'Полное наименование Компании';
-- companyInfo - Профиль Компании
CREATE TABLE IF NOT EXISTS COMPANY_INFO(ID bigint PRIMARY KEY, COMPANY_ID bigint, CORPORATION_SOLE_TYPE char(4), COUNTRY_CODE char(4), DESCRIPTION varchar, PROFESSIONAL_SIGN char(4), LEGAL_KIND char(4), ORGANIZATION_TYPE char(4), RESIDENCE char(4), SHORT_NAME_ENG varchar(255), FULL_NAME_ENG varchar(255));
CREATE TABLE IF NOT EXISTS COMPANY_INFO(ID bigint PRIMARY KEY, COMPANY_ID bigint, CORPORATION_SOLE_TYPE char(4), COUNTRY_CODE char(4), DESCRIPTION varchar, PROFESSIONAL_SIGN char(4), LEGAL_KIND char(4), ORGANIZATION_TYPE char(4), RESIDENCE char(4), SHORT_NAME_ENG varchar(255), FULL_NAME_ENG varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), TRADING_CODE varchar(255), CLEARING_CODE varchar(255));
COMMENT ON TABLE COMPANY_INFO IS 'Профиль Компании';
COMMENT ON COLUMN COMPANY_INFO.ID IS 'Идентификатор записи';
@ -341,9 +361,17 @@ COMMENT ON COLUMN COMPANY_INFO.SHORT_NAME_ENG IS 'Краткое наимено
COMMENT ON COLUMN COMPANY_INFO.FULL_NAME_ENG IS 'Полное наименование Компании на английском';
COMMENT ON COLUMN COMPANY_INFO.SHORT_NAME IS 'Краткое наименование Компании';
COMMENT ON COLUMN COMPANY_INFO.FULL_NAME IS 'Полное наименование Компании';
COMMENT ON COLUMN COMPANY_INFO.TRADING_CODE IS 'Код участника торгов';
COMMENT ON COLUMN COMPANY_INFO.CLEARING_CODE IS 'Код участника клиринга';
-- Update log of companyInfo - Профиль Компании
CREATE TABLE IF NOT EXISTS COMPANY_INFO_UPDATE(COMPANY_INFO_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, COMPANY_ID bigint, CORPORATION_SOLE_TYPE char(4), COUNTRY_CODE char(4), DESCRIPTION varchar, PROFESSIONAL_SIGN char(4), LEGAL_KIND char(4), ORGANIZATION_TYPE char(4), RESIDENCE char(4), SHORT_NAME_ENG varchar(255), FULL_NAME_ENG varchar(255));
CREATE TABLE IF NOT EXISTS COMPANY_INFO_UPDATE(COMPANY_INFO_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, COMPANY_ID bigint, CORPORATION_SOLE_TYPE char(4), COUNTRY_CODE char(4), DESCRIPTION varchar, PROFESSIONAL_SIGN char(4), LEGAL_KIND char(4), ORGANIZATION_TYPE char(4), RESIDENCE char(4), SHORT_NAME_ENG varchar(255), FULL_NAME_ENG varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), TRADING_CODE varchar(255), CLEARING_CODE varchar(255) );
COMMENT ON TABLE COMPANY_INFO_UPDATE IS 'Журнал изменений таблицы companyInfo';
COMMENT ON COLUMN COMPANY_INFO_UPDATE.COMPANY_INFO_ID IS 'Идентификатор записи в таблице COMPANY_INFO';
COMMENT ON COLUMN COMPANY_INFO_UPDATE.EVENT_TIME IS 'Дата и время изменения';
@ -371,6 +399,14 @@ COMMENT ON COLUMN COMPANY_INFO_UPDATE.SHORT_NAME_ENG IS 'Краткое наим
COMMENT ON COLUMN COMPANY_INFO_UPDATE.FULL_NAME_ENG IS 'Полное наименование Компании на английском';
COMMENT ON COLUMN COMPANY_INFO_UPDATE.SHORT_NAME IS 'Краткое наименование Компании';
COMMENT ON COLUMN COMPANY_INFO_UPDATE.FULL_NAME IS 'Полное наименование Компании';
COMMENT ON COLUMN COMPANY_INFO_UPDATE.TRADING_CODE IS 'Код участника торгов';
COMMENT ON COLUMN COMPANY_INFO_UPDATE.CLEARING_CODE IS 'Код участника клиринга';
-- clearingMemberCategory - Категории участника клиринга
CREATE TABLE IF NOT EXISTS CLEARING_MEMBER_CATEGORY(ID bigint PRIMARY KEY, COMPANY_ID bigint, CLEARING_MEMBER_CATEGORY char(4));
COMMENT ON TABLE CLEARING_MEMBER_CATEGORY IS 'Категории участника клиринга';
@ -860,7 +896,7 @@ COMMENT ON COLUMN LISTING_UPDATE.TRADING_CURRENCY IS 'Идентификатор
COMMENT ON COLUMN LISTING_UPDATE.WORKFLOW_STATUS IS 'Идентификатор статуса листинга в системе (linked to workflowStatus)';
-- market - Торговые площадки
CREATE TABLE IF NOT EXISTS MARKET(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, DESCRIPTION varchar(255), EXCHANGE_ID bigint, NAME varchar(255), MARKET_CODE varchar(255), SETTLEMENT_CURRENCY char(4), SECTOR char(4));
CREATE TABLE IF NOT EXISTS MARKET(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, DESCRIPTION varchar(255), EXCHANGE_ID bigint, NAME varchar(255), CODE char(4), SETTLEMENT_CURRENCY char(4), SECTOR char(4));
COMMENT ON TABLE MARKET IS 'Торговые площадки';
COMMENT ON COLUMN MARKET.ID IS 'Идентификатор записи';
@ -875,7 +911,7 @@ COMMENT ON COLUMN MARKET.EXCHANGE_ID IS 'Идентификатор площад
COMMENT ON COLUMN MARKET.NAME IS 'Наименование';
COMMENT ON COLUMN MARKET.MARKET_CODE IS 'Режим';
COMMENT ON COLUMN MARKET.CODE IS 'Режим';
COMMENT ON COLUMN MARKET.SETTLEMENT_CURRENCY IS 'Валютный код расчетов (linked to currency)';
@ -883,7 +919,7 @@ COMMENT ON COLUMN MARKET.SECTOR IS 'Идентификатор сектора (l
-- Update log of market - Торговые площадки
CREATE TABLE IF NOT EXISTS MARKET_UPDATE(MARKET_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, DESCRIPTION varchar(255), EXCHANGE_ID bigint, NAME varchar(255), MARKET_CODE varchar(255), SETTLEMENT_CURRENCY char(4), SECTOR char(4));
CREATE TABLE IF NOT EXISTS MARKET_UPDATE(MARKET_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, DESCRIPTION varchar(255), EXCHANGE_ID bigint, NAME varchar(255), CODE char(4), SETTLEMENT_CURRENCY char(4), SECTOR char(4));
COMMENT ON TABLE MARKET_UPDATE IS 'Журнал изменений таблицы market';
COMMENT ON COLUMN MARKET_UPDATE.MARKET_ID IS 'Идентификатор записи в таблице MARKET';
COMMENT ON COLUMN MARKET_UPDATE.EVENT_TIME IS 'Дата и время изменения';
@ -901,7 +937,7 @@ COMMENT ON COLUMN MARKET_UPDATE.EXCHANGE_ID IS 'Идентификатор пл
COMMENT ON COLUMN MARKET_UPDATE.NAME IS 'Наименование';
COMMENT ON COLUMN MARKET_UPDATE.MARKET_CODE IS 'Режим';
COMMENT ON COLUMN MARKET_UPDATE.CODE IS 'Режим';
COMMENT ON COLUMN MARKET_UPDATE.SETTLEMENT_CURRENCY IS 'Валютный код расчетов (linked to currency)';
@ -1193,7 +1229,7 @@ COMMENT ON COLUMN CONTRACT_REGISTER.VALID_FROM_DATE IS 'Дата начала с
COMMENT ON COLUMN CONTRACT_REGISTER.VALID_TO_DATE IS 'Дата окончания срока действия';
-- liabilitiesClaimsMoney - Требования и обязательства денежных средств
CREATE TABLE IF NOT EXISTS LIABILITIES_CLAIMS_MONEY(ID bigint PRIMARY KEY, COMPANY_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp, ACCOUNT_ID bigint, ACCOUNT_TYPE bigint, ACCOUNT bigint, LIABILITIES_AMOUNT numeric(72,2), CLAIMS_AMOUNT numeric(72,2), SETTLEMENT_DATE date, TRADING_DATE date, CURRENCY_CODE char(4), TRADING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255));
CREATE TABLE IF NOT EXISTS LIABILITIES_CLAIMS_MONEY(ID bigint PRIMARY KEY, COMPANY_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp, ACCOUNT_ID bigint, ACCOUNT_TYPE bigint, ACCOUNT bigint, LIABILITIES_AMOUNT numeric(72,2), REFUND_INTEREST numeric(72,2), ACCRUED_INTEREST numeric(72,2), CLAIMS_AMOUNT numeric(72,2), SETTLEMENT_DATE date, TRADING_DATE date, CURRENCY char(4), TRADING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255));
COMMENT ON TABLE LIABILITIES_CLAIMS_MONEY IS 'Требования и обязательства денежных средств';
COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.ID IS 'Идентификатор записи';
@ -1210,15 +1246,19 @@ COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.ACCOUNT_TYPE IS 'Тип счета (l
COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.ACCOUNT IS 'Счет (linked to account)';
COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.LIABILITIES_AMOUNT IS 'Регистр «Обязательства по денежным средствам, сформированные по результатам собственных сделок Участника клиринга»';
COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.LIABILITIES_AMOUNT IS 'Регистр «Обязательства по денежным средствам, сформированные по результатам собственных сделок Участника клиринга», исключая проценты';
COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.CLAIMS_AMOUNT IS 'Сумма требований';
COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.REFUND_INTEREST IS 'Проценты к возврату';
COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.ACCRUED_INTEREST IS 'Начисленные проценты';
COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.CLAIMS_AMOUNT IS 'Сумма требований, исключая проценты';
COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.SETTLEMENT_DATE IS 'Дата расчета';
COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.TRADING_DATE IS 'Дата торгов';
COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.CURRENCY_CODE IS 'Код валюты (linked to currency)';
COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.CURRENCY IS 'Код валюты (linked to currencyCode)';
COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.TRADING_CODE IS 'Торговый код Участника (linked to company)';
@ -1227,7 +1267,7 @@ COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.SHORT_NAME IS 'Короткое на
COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.FULL_NAME IS 'Полное наименование Участника (linked to company)';
-- liabilitiesClaimsAssets - Требования и обязательства финансовых активов
CREATE TABLE IF NOT EXISTS LIABILITIES_CLAIMS_ASSETS(ID bigint PRIMARY KEY, COMPANY_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp, ACCOUNT_ID bigint, ACCOUNT_TYPE bigint, ACCOUNT bigint, LIABILITIES_QUANTITY numeric(72,18), CLAIMS_QUANTITY numeric(72,18), SETTLEMENT_DATE date, TRADING_DATE date, REFUND_DATE date, SECURITY_ID bigint, TRADING_CODE varchar(255), SHORT_NAME varchar(255), CONTRACT varchar(255), COMMENT varchar(255), FULL_NAME varchar(255), PARENT_ID bigint);
CREATE TABLE IF NOT EXISTS LIABILITIES_CLAIMS_ASSETS(ID bigint PRIMARY KEY, COMPANY_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp, ACCOUNT_ID bigint, ACCOUNT_TYPE bigint, ACCOUNT bigint, LIABILITIES_QUANTITY numeric(72,18), CLAIMS_QUANTITY numeric(72,18), CURRENCY char(4), SETTLEMENT_DATE date, TRADING_DATE date, REFUND_DATE date, PRICE numeric(72,18), SECURITY_ID bigint, TRADING_CODE varchar(255), SHORT_NAME varchar(255), CONTRACT varchar(255), COMMENT varchar(255), FULL_NAME varchar(255), PARENT_ID bigint, LIABILITIES_CLAIMS_MONEY_ID bigint, INTEREST_STATUS bigint, CLEARING_STATUS bigint, PAYMENT_ID bigint, REFUND_PAYMENT_ID bigint);
COMMENT ON TABLE LIABILITIES_CLAIMS_ASSETS IS 'Требования и обязательства финансовых активов';
COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.ID IS 'Идентификатор записи';
@ -1248,12 +1288,16 @@ COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.LIABILITIES_QUANTITY IS 'Сумма
COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.CLAIMS_QUANTITY IS 'Сумма требований';
COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.CURRENCY IS 'Код валюты (linked to currencyCode)';
COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.SETTLEMENT_DATE IS 'Дата расчета';
COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.TRADING_DATE IS 'Дата торгов';
COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.REFUND_DATE IS 'Дата возврата';
COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.PRICE IS 'Ставка по депозиту';
COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.SECURITY_ID IS 'Инструмент (linked to security)';
COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.TRADING_CODE IS 'Торговый код Участника (linked to company)';
@ -1268,6 +1312,16 @@ COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.FULL_NAME IS 'Полное наим
COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.PARENT_ID IS 'Идентификатор записи основного договора без разделения';
COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.LIABILITIES_CLAIMS_MONEY_ID IS 'Регистры денежных средств (linked to liabilitiesClaimsMoney)';
COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.INTEREST_STATUS IS 'Статус возврата процентов (linked to interestStatus)';
COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.CLEARING_STATUS IS 'Статус клиринга (linked to clearingStatus)';
COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.PAYMENT_ID IS 'Платеж';
COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.REFUND_PAYMENT_ID IS 'Обратный платежа';
-- statement - Денежные средства от расчетной организации
CREATE TABLE IF NOT EXISTS STATEMENT(ID bigint PRIMARY KEY, ADDRESSEE_ID bigint, SENDER_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, STATEMENT_TYPE_ID bigint, COMMENT varchar(255), ACCOUNT_ID bigint, ACCOUNT bigint, IN_OUT_DIRECTION bigint, SETTLEMENT_DATE date, AMOUNT numeric(72,2), CASH_MOVEMENTCURRENCY_CODE char(4), STATUS_ID bigint);
COMMENT ON TABLE STATEMENT IS 'Денежные средства от расчетной организации';
@ -1386,6 +1440,144 @@ COMMENT ON COLUMN MARKET_DATA.UPDATED_AT IS 'Время изменения сд
COMMENT ON COLUMN MARKET_DATA.TRADING_DATE IS 'Дата торгов';
-- chargeTariff - Тарифы комиссий
CREATE TABLE IF NOT EXISTS CHARGE_TARIFF(ID bigint PRIMARY KEY, MARKET bigint, CLEARING_MEMBER_CATEGORY char(4), CHARGE_TYPE_ID bigint, CHARGE_RATE numeric(72,18), CURRENCY bigint, VALID_FROM_DATE date, VALID_TO_DATE date, CREATED_AT timestamp, UPDATED_AT timestamp);
COMMENT ON TABLE CHARGE_TARIFF IS 'Тарифы комиссий';
COMMENT ON COLUMN CHARGE_TARIFF.ID IS 'Идентификатор';
COMMENT ON COLUMN CHARGE_TARIFF.MARKET IS 'Секция (linked to market)';
COMMENT ON COLUMN CHARGE_TARIFF.CLEARING_MEMBER_CATEGORY IS 'Категория участника клиринга (linked to clearingCategory)';
COMMENT ON COLUMN CHARGE_TARIFF.CHARGE_TYPE_ID IS 'Тип комиссии (linked to chargeType)';
COMMENT ON COLUMN CHARGE_TARIFF.CHARGE_RATE IS 'Ставка комиссионного сбора';
COMMENT ON COLUMN CHARGE_TARIFF.CURRENCY IS 'Валюта начисления комиссии (linked to currencyCode)';
COMMENT ON COLUMN CHARGE_TARIFF.VALID_FROM_DATE IS 'Дата начала срока действия';
COMMENT ON COLUMN CHARGE_TARIFF.VALID_TO_DATE IS 'Дата окончания срока действия';
COMMENT ON COLUMN CHARGE_TARIFF.CREATED_AT IS 'Создано';
COMMENT ON COLUMN CHARGE_TARIFF.UPDATED_AT IS 'Изменено';
-- Update log of chargeTariff - Тарифы комиссий
CREATE TABLE IF NOT EXISTS CHARGE_TARIFF_UPDATE(CHARGE_TARIFF_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, MARKET bigint, CLEARING_MEMBER_CATEGORY char(4), CHARGE_TYPE_ID bigint, CHARGE_RATE numeric(72,18), CURRENCY bigint, VALID_FROM_DATE date, VALID_TO_DATE date, CREATED_AT timestamp, UPDATED_AT timestamp);
COMMENT ON TABLE CHARGE_TARIFF_UPDATE IS 'Журнал изменений таблицы chargeTariff';
COMMENT ON COLUMN CHARGE_TARIFF_UPDATE.CHARGE_TARIFF_ID IS 'Идентификатор записи в таблице CHARGE_TARIFF';
COMMENT ON COLUMN CHARGE_TARIFF_UPDATE.EVENT_TIME IS 'Дата и время изменения';
COMMENT ON COLUMN CHARGE_TARIFF_UPDATE.EVENT_USER_ID IS 'Инициатор изменения';
COMMENT ON COLUMN CHARGE_TARIFF_UPDATE.ID IS 'Идентификатор';
COMMENT ON COLUMN CHARGE_TARIFF_UPDATE.MARKET IS 'Секция (linked to market)';
COMMENT ON COLUMN CHARGE_TARIFF_UPDATE.CLEARING_MEMBER_CATEGORY IS 'Категория участника клиринга (linked to clearingCategory)';
COMMENT ON COLUMN CHARGE_TARIFF_UPDATE.CHARGE_TYPE_ID IS 'Тип комиссии (linked to chargeType)';
COMMENT ON COLUMN CHARGE_TARIFF_UPDATE.CHARGE_RATE IS 'Ставка комиссионного сбора';
COMMENT ON COLUMN CHARGE_TARIFF_UPDATE.CURRENCY IS 'Валюта начисления комиссии (linked to currencyCode)';
COMMENT ON COLUMN CHARGE_TARIFF_UPDATE.VALID_FROM_DATE IS 'Дата начала срока действия';
COMMENT ON COLUMN CHARGE_TARIFF_UPDATE.VALID_TO_DATE IS 'Дата окончания срока действия';
COMMENT ON COLUMN CHARGE_TARIFF_UPDATE.CREATED_AT IS 'Создано';
COMMENT ON COLUMN CHARGE_TARIFF_UPDATE.UPDATED_AT IS 'Изменено';
-- individualChargeTariff - Индивидуальные тарифы комиссий для Участника
CREATE TABLE IF NOT EXISTS INDIVIDUAL_CHARGE_TARIFF(ID bigint PRIMARY KEY, COMPANY_ID bigint, MARKET bigint, CLEARING_MEMBER_CATEGORY char(4), CHARGE_TYPE_ID bigint, CHARGE_RATE numeric(72,18), CURRENCY bigint, VALID_FROM_DATE date, VALID_TO_DATE date, CREATED_AT timestamp, UPDATED_AT timestamp);
COMMENT ON TABLE INDIVIDUAL_CHARGE_TARIFF IS 'Индивидуальные тарифы комиссий для Участника';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF.ID IS 'Идентификатор';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF.COMPANY_ID IS 'Участник (linked to company)';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF.MARKET IS 'Секция (linked to market)';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF.CLEARING_MEMBER_CATEGORY IS 'Категория участника клиринга (linked to clearingCategory)';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF.CHARGE_TYPE_ID IS 'Тип комиссии (linked to chargeType)';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF.CHARGE_RATE IS 'Ставка комиссионного сбора';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF.CURRENCY IS 'Валюта начисления комиссии (linked to currencyCode)';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF.VALID_FROM_DATE IS 'Дата начала срока действия';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF.VALID_TO_DATE IS 'Дата окончания срока действия';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF.CREATED_AT IS 'Создано';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF.UPDATED_AT IS 'Изменено';
-- Update log of individualChargeTariff - Индивидуальные тарифы комиссий для Участника
CREATE TABLE IF NOT EXISTS INDIVIDUAL_CHARGE_TARIFF_UPDATE(INDIVIDUAL_CHARGE_TARIFF_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, COMPANY_ID bigint, MARKET bigint, CLEARING_MEMBER_CATEGORY char(4), CHARGE_TYPE_ID bigint, CHARGE_RATE numeric(72,18), CURRENCY bigint, VALID_FROM_DATE date, VALID_TO_DATE date, CREATED_AT timestamp, UPDATED_AT timestamp);
COMMENT ON TABLE INDIVIDUAL_CHARGE_TARIFF_UPDATE IS 'Журнал изменений таблицы individualChargeTariff';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_UPDATE.INDIVIDUAL_CHARGE_TARIFF_ID IS 'Идентификатор записи в таблице INDIVIDUAL_CHARGE_TARIFF';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_UPDATE.EVENT_TIME IS 'Дата и время изменения';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_UPDATE.EVENT_USER_ID IS 'Инициатор изменения';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_UPDATE.ID IS 'Идентификатор';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_UPDATE.COMPANY_ID IS 'Участник (linked to company)';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_UPDATE.MARKET IS 'Секция (linked to market)';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_UPDATE.CLEARING_MEMBER_CATEGORY IS 'Категория участника клиринга (linked to clearingCategory)';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_UPDATE.CHARGE_TYPE_ID IS 'Тип комиссии (linked to chargeType)';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_UPDATE.CHARGE_RATE IS 'Ставка комиссионного сбора';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_UPDATE.CURRENCY IS 'Валюта начисления комиссии (linked to currencyCode)';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_UPDATE.VALID_FROM_DATE IS 'Дата начала срока действия';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_UPDATE.VALID_TO_DATE IS 'Дата окончания срока действия';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_UPDATE.CREATED_AT IS 'Создано';
COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_UPDATE.UPDATED_AT IS 'Изменено';
-- companyTariff - Тарифы комиссий в разрезе Участника
CREATE TABLE IF NOT EXISTS COMPANY_TARIFF(ID bigint PRIMARY KEY, MARKET bigint, CLEARING_MEMBER_CATEGORY char(4), FULL_NAME varchar(255), CONTRACT varchar(255), CHARGE_TYPE_ID bigint, CHARGE_RATE numeric(72,18), CURRENCY bigint, VALID_FROM_DATE date, VALID_TO_DATE date, CREATED_AT timestamp, UPDATED_AT timestamp, COMPANY_ID bigint);
COMMENT ON TABLE COMPANY_TARIFF IS 'Тарифы комиссий в разрезе Участника';
COMMENT ON COLUMN COMPANY_TARIFF.ID IS 'Идентификатор';
COMMENT ON COLUMN COMPANY_TARIFF.MARKET IS 'Секция (linked to market)';
COMMENT ON COLUMN COMPANY_TARIFF.CLEARING_MEMBER_CATEGORY IS 'Категория участника клиринга (linked to clearingCategory)';
COMMENT ON COLUMN COMPANY_TARIFF.FULL_NAME IS 'Полное наименование Участника (linked to company)';
COMMENT ON COLUMN COMPANY_TARIFF.CONTRACT IS 'Номер договора';
COMMENT ON COLUMN COMPANY_TARIFF.CHARGE_TYPE_ID IS 'Тип комиссии (linked to chargeType)';
COMMENT ON COLUMN COMPANY_TARIFF.CHARGE_RATE IS 'Ставка комиссионного сбора';
COMMENT ON COLUMN COMPANY_TARIFF.CURRENCY IS 'Валюта начисления комиссии (linked to currencyCode)';
COMMENT ON COLUMN COMPANY_TARIFF.VALID_FROM_DATE IS 'Дата начала срока действия';
COMMENT ON COLUMN COMPANY_TARIFF.VALID_TO_DATE IS 'Дата окончания срока действия';
COMMENT ON COLUMN COMPANY_TARIFF.CREATED_AT IS 'Создано';
COMMENT ON COLUMN COMPANY_TARIFF.UPDATED_AT IS 'Изменено';
COMMENT ON COLUMN COMPANY_TARIFF.COMPANY_ID IS 'Участник (linked to company)';
-- sDf01 - ДФ 02 - Направление уведомлений об операциях загрузки
CREATE TABLE IF NOT EXISTS S_DF01(ID bigint PRIMARY KEY, DATE date, CURR_CODE char(4), ACCOUNT varchar(25), REMAINDER_SUM varchar(20), DEAL char(4), ACC_CODE varchar(5), DAT varchar(8), MARKET varchar(1), ACC_NAME varchar(1), ACC_TYPE varchar(1), SUMENGAGE varchar(22), SUMUNBLOCK varchar(22), FILE_TYPE varchar(1), RESULT_CODE varchar(1), ERROR_TEXT varchar(255), EXT_ERROR_CODE char(4));
COMMENT ON TABLE S_DF01 IS 'ДФ 02 - Направление уведомлений об операциях загрузки';

View file

@ -77,6 +77,7 @@ public abstract class ObjectBaseMapStore<T extends SpcexObjectBase> extends Simp
return rs.getObject(columnName, Long.class);
}
// todo отрефакторить метод - длинное название
protected Instant getInstantFromTimestamp(ResultSet rs, String column) throws SQLException {
Timestamp date = rs.getTimestamp(column);
return date != null ? date.toInstant() : null;

View file

@ -2,9 +2,9 @@ package ru.spcex.clearing.imdg.businessevent;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.lang.NonNull;
import ru.clearing.classes.StaticData.Company.Company;
import ru.clearing.classes.StaticData.Company.CompanyUpdate;
import ru.clearing.classes.StaticData.Profile.CompanyInfo;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanyUpdate;
import ru.clearing.classes.statics.data.profile.CompanyInfo;
import ru.spcex.clearing.imdg.base.BusinessEventMapStore;
import ru.spcex.clearing.imdg.utils.DbUtilsHelper;
import ru.spcex.clearing.imdg.utils.TimeUtil;

View file

@ -0,0 +1,66 @@
package ru.spcex.clearing.imdg.businessobject;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.clearing.classes.StaticData.Account.Account;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.imdg.base.TemplateMapStore;
import ru.spcex.clearing.imdg.utils.DbUtilsHelper;
import ru.spcex.clearing.imdg.utils.TimeUtil;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
@Component
public class AccountMapStore extends TemplateMapStore<Account> {
public AccountMapStore(JdbcTemplate jdbcTemplate) {
super(jdbcTemplate);
}
@Override
public String getMapName() {
return IMDGDistributedNames.Map_Account;
}
@Override
public String getTableName() {
return "ACCOUNT";
}
@Override
public String[] getFields() {
return new String[]{
"ID", "CREATED_AT", "UPDATED_AT", "ACCOUNT", "ACCOUNT_TYPE", "RELATION_ID", "STATUS"
};
}
@Override
public Account objectReader(ResultSet resultSet) throws SQLException {
Account object = new Account();
object.setId(resultSet.getObject("ID", Long.class));
object.setCreated(getInstantFromTimestamp(resultSet, "CREATED_AT"));
object.setUpdated(getInstantFromTimestamp(resultSet, "UPDATED_AT"));
object.setAccount(resultSet.getObject("ACCOUNT", String.class));
object.setAccountType(resultSet.getObject("ACCOUNT_TYPE", String.class));
object.setRelationId(resultSet.getObject("RELATION_ID", Long.class));
object.setStatus(resultSet.getObject("STATUS", String.class));
return object;
}
@Override
public Object[] objectToField(Account object) {
Object[] args = new Object[]{
object.getId(),
TimeUtil.fromInstant(object.getCreated()),
TimeUtil.fromInstant(object.getUpdated()),
object.getAccount(),
object.getAccountType(),
object.getRelationId(),
object.getStatus()
};
return args;
}
}//todo updatemapstore !!!

View file

@ -4,8 +4,8 @@ import org.springframework.dao.support.DataAccessUtils;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
import ru.clearing.classes.StaticData.Company.Company;
import ru.clearing.classes.StaticData.Profile.CompanyInfo;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.profile.CompanyInfo;
import ru.spcex.clearing.imdg.base.BusinessObjectMapStore;
import ru.spcex.clearing.imdg.utils.DbUtilsHelper;
import ru.spcex.clearing.imdg.utils.TimeUtil;

View file

@ -0,0 +1,71 @@
package ru.spcex.clearing.imdg.businessobject;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.clearing.classes.StaticData.Company.Relation.Relation;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.imdg.base.TemplateMapStore;
import ru.spcex.clearing.imdg.utils.DbUtilsHelper;
import ru.spcex.clearing.imdg.utils.TimeUtil;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
@Component
public class RelationMapStore extends TemplateMapStore<Relation> {
public RelationMapStore(JdbcTemplate jdbcTemplate) {
super(jdbcTemplate);
}
@Override
public String getMapName() {
return IMDGDistributedNames.Map_Relation;
}
@Override
public String getTableName() {
return "RELATION";
}
@Override
public String[] getFields() {
return new String[]{
"ID", "CREATED_AT", "UPDATED_AT", "CONSUMER_ID", "SUPPLIER_ID", "SERVICE_STATUS", "SERVICE_ID", "SERVICE_PRODUCT_ID", "COMMENT"
};
}
@Override
public Relation objectReader(ResultSet resultSet) throws SQLException {
Relation object = new Relation();
object.setId(resultSet.getObject("ID", Long.class));
object.setCreated(getInstantFromTimestamp(resultSet, "CREATED_AT"));
object.setUpdated(getInstantFromTimestamp(resultSet, "UPDATED_AT"));
object.setConsumerId(resultSet.getObject("CONSUMER_ID", Long.class));
object.setSupplierId(resultSet.getObject("SUPPLIER_ID", Long.class));
object.setServiceStatus(resultSet.getObject("SERVICE_STATUS", String.class));
object.setServiceId(resultSet.getObject("SERVICE_ID", Long.class));
object.setServiceProductId(resultSet.getObject("SERVICE_PRODUCT_ID", Long.class));
object.setComment(resultSet.getObject("COMMENT", String.class));
return object;
}
@Override
public Object[] objectToField(Relation object) {
Object[] args = new Object[]{
object.getId(),
TimeUtil.fromInstant(object.getCreated()),
TimeUtil.fromInstant(object.getUpdated()),
object.getConsumerId(),
object.getSupplierId(),
object.getServiceStatus(),
object.getServiceId(),
object.getServiceProductId(),
object.getComment()
};
return args;
}
}
// todo Сделать BusinessEventMapStore RelationUpdateMapStore

View file

@ -0,0 +1,61 @@
package ru.spcex.clearing.imdg.object;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.clearing.classes.StaticData.Account.AccountRouting;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.imdg.base.TemplateMapStore;
import ru.spcex.clearing.imdg.utils.DbUtilsHelper;
import ru.spcex.clearing.imdg.utils.TimeUtil;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
@Component
public class AccountRoutingMapStore extends TemplateMapStore<AccountRouting> {
public AccountRoutingMapStore(JdbcTemplate jdbcTemplate) {
super(jdbcTemplate);
}
@Override
public String getMapName() {
return IMDGDistributedNames.Map_AccountRouting;
}
@Override
public String getTableName() {
return "ACCOUNT_ROUTING";
}
@Override
public String[] getFields() {
return new String[]{
"ID", "DESTINATION_ID", "RELATION_ID", "SOURCE_ID"
};
}
@Override
public AccountRouting objectReader(ResultSet resultSet) throws SQLException {
AccountRouting object = new AccountRouting();
object.setId(resultSet.getObject("ID", Long.class));
object.setDestinationId(resultSet.getObject("DESTINATION_ID", Long.class));
object.setRelationId(resultSet.getObject("RELATION_ID", Long.class));
object.setSourceId(resultSet.getObject("SOURCE_ID", Long.class));
return object;
}
@Override
public Object[] objectToField(AccountRouting object) {
Object[] args = new Object[]{
object.getId(),
object.getDestinationId(),
object.getRelationId(),
object.getSourceId()
};
return args;
}
}
// todo Сделать BusinessEventMapStore AccountRoutingUpdateMapStore

View file

@ -0,0 +1,79 @@
package ru.spcex.clearing.imdg.object;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.clearing.classes.StaticData.Account.BankAccount;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.imdg.base.TemplateMapStore;
import ru.spcex.clearing.imdg.utils.DbUtilsHelper;
import ru.spcex.clearing.imdg.utils.TimeUtil;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
@Component
public class BankAccountMapStore extends TemplateMapStore<BankAccount> {
public BankAccountMapStore(JdbcTemplate jdbcTemplate) {
super(jdbcTemplate);
}
@Override
public String getMapName() {
return IMDGDistributedNames.Map_BankAccount;
}
@Override
public String getTableName() {
return "BANK_ACCOUNT";
}
@Override
public String[] getFields() {
return new String[]{
"ID", "ACCOUNT_ID", "BANK_IDENTIFICATION_CODE", "BANK_NAME", "CORRESPONDENT_ACCOUNT_NAME", "CURRENCY", "DESTINATION", "IBAN", "INTERNATIONAL_TRANSFER_SIGN", "SWIFT_CODE", "TAXPAYER_IDENTIFICATION_NUMBER", "TAX_REGISTRATION_REASON_CODE", "CORRESPONDENT_ACCOUNT"
};
}
@Override
public BankAccount objectReader(ResultSet resultSet) throws SQLException {
BankAccount object = new BankAccount();
object.setId(resultSet.getObject("ID", Long.class));
object.setAccountId(resultSet.getObject("ACCOUNT_ID", Long.class));
object.setBankIdentificationCode(resultSet.getObject("BANK_IDENTIFICATION_CODE", String.class));
object.setBankName(resultSet.getObject("BANK_NAME", String.class));
object.setCorrespondentAccountName(resultSet.getObject("CORRESPONDENT_ACCOUNT_NAME", String.class));
object.setCurrency(resultSet.getObject("CURRENCY", String.class));
object.setDestination(resultSet.getObject("DESTINATION", String.class));
object.setIban(resultSet.getObject("IBAN", String.class));
object.setInternationalTransferSign(resultSet.getObject("INTERNATIONAL_TRANSFER_SIGN", String.class));
object.setSwiftCode(resultSet.getObject("SWIFT_CODE", String.class));
object.setTaxpayerIdentificationNumber(resultSet.getObject("TAXPAYER_IDENTIFICATION_NUMBER", String.class));
object.setTaxRegistrationReasonCode(resultSet.getObject("TAX_REGISTRATION_REASON_CODE", String.class));
object.setCorrespondentAccount(resultSet.getObject("CORRESPONDENT_ACCOUNT", String.class));
return object;
}
@Override
public Object[] objectToField(BankAccount object) {
Object[] args = new Object[]{
object.getId(),
object.getAccountId(),
object.getBankIdentificationCode(),
object.getBankName(),
object.getCorrespondentAccountName(),
object.getCurrency(),
object.getDestination(),
object.getIban(),
object.getInternationalTransferSign(),
object.getSwiftCode(),
object.getTaxpayerIdentificationNumber(),
object.getTaxRegistrationReasonCode(),
object.getCorrespondentAccount()
};
return args;
}
}
// todo Сделать BusinessEventMapStore BankAccountUpdateMapStore

View file

@ -0,0 +1,63 @@
package ru.spcex.clearing.imdg.object;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.clearing.classes.StaticData.Account.ClearingAccount;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.imdg.base.TemplateMapStore;
import ru.spcex.clearing.imdg.utils.DbUtilsHelper;
import ru.spcex.clearing.imdg.utils.TimeUtil;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
@Component
public class ClearingAccountMapStore extends TemplateMapStore<ClearingAccount> {
public ClearingAccountMapStore(JdbcTemplate jdbcTemplate) {
super(jdbcTemplate);
}
@Override
public String getMapName() {
return IMDGDistributedNames.Map_ClearingAccount;
}
@Override
public String getTableName() {
return "CLEARING_ACCOUNT";
}
@Override
public String[] getFields() {
return new String[]{
"ID", "ACCOUNT_ID", "CASH_ACCOUNT_ID", "DEPO_ACCOUNT_ID", "SETTLEMENT_CODE"
};
}
@Override
public ClearingAccount objectReader(ResultSet resultSet) throws SQLException {
ClearingAccount object = new ClearingAccount();
object.setId(resultSet.getObject("ID", Long.class));
object.setAccountId(resultSet.getObject("ACCOUNT_ID", Long.class));
object.setCashAccountId(resultSet.getObject("CASH_ACCOUNT_ID", Long.class));
object.setDepoAccountId(resultSet.getObject("DEPO_ACCOUNT_ID", Long.class));
object.setSettlementCode(resultSet.getObject("SETTLEMENT_CODE", String.class));
return object;
}
@Override
public Object[] objectToField(ClearingAccount object) {
Object[] args = new Object[]{
object.getId(),
object.getAccountId(),
object.getCashAccountId(),
object.getDepoAccountId(),
object.getSettlementCode()
};
return args;
}
}
// todo Сделать BusinessEventMapStore ClearingAccountUpdateMapStore

View file

@ -0,0 +1,55 @@
package ru.spcex.clearing.imdg.object;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.clearing.classes.StaticData.generated.ClearingMemberCategory;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.imdg.base.TemplateMapStore;
import java.sql.ResultSet;
import java.sql.SQLException;
@Component
public class ClearingMemberCategoryMapStore extends TemplateMapStore<ClearingMemberCategory> {
public ClearingMemberCategoryMapStore(JdbcTemplate jdbcTemplate) {
super(jdbcTemplate);
}
@Override
public String getMapName() {
return IMDGDistributedNames.Map_ClearingMemberCategory;
}
@Override
public String getTableName() {
return "CLEARING_MEMBER_CATEGORY";
}
@Override
public String[] getFields() {
return new String[]{
"ID", "COMPANY_ID", "CLEARING_MEMBER_CATEGORY"
};
}
@Override
public ClearingMemberCategory objectReader(ResultSet resultSet) throws SQLException {
ClearingMemberCategory object = new ClearingMemberCategory();
object.setId(resultSet.getObject("ID", Long.class));
object.setCompanyId(resultSet.getObject("COMPANY_ID", Long.class));
object.setClearingMemberCategory(resultSet.getObject("CLEARING_MEMBER_CATEGORY", String.class));
return object;
}
@Override
public Object[] objectToField(ClearingMemberCategory object) {
Object[] args = new Object[]{
object.getId(),
object.getCompanyId(),
object.getClearingMemberCategory()
};
return args;
}
}

View file

@ -2,7 +2,7 @@ package ru.spcex.clearing.imdg.object;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.clearing.classes.StaticData.Company.CompanyRoleSet;
import ru.clearing.classes.statics.data.company.CompanyRoleSet;
import ru.spcex.clearing.imdg.base.TemplateMapStore;
import ru.spcex.clearing.imdg.IMDGDistributedNames;

View file

@ -2,7 +2,7 @@ package ru.spcex.clearing.imdg.object;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.clearing.classes.StaticData.Company.CompanySymbols;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.spcex.clearing.imdg.base.ObjectBaseMapStore;
import ru.spcex.clearing.imdg.utils.DbUtilsHelper;

View file

@ -2,7 +2,7 @@ package ru.spcex.clearing.imdg.object;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.clearing.classes.StaticData.Profile.Contact;
import ru.clearing.classes.statics.data.profile.Contact;
import ru.spcex.clearing.imdg.base.ObjectBaseMapStore;
import ru.spcex.clearing.imdg.utils.DbUtilsHelper;

View file

@ -2,12 +2,11 @@ package ru.spcex.clearing.imdg.object;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.clearing.classes.StaticData.Misc.KeyRate;
import ru.clearing.classes.statics.data.misc.KeyRate;
import ru.spcex.clearing.imdg.base.TemplateMapStore;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.imdg.utils.TimeUtil;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
@ -42,7 +41,7 @@ public class KeyRateMapStore extends TemplateMapStore<KeyRate> {
protected KeyRate objectReader(ResultSet resultSet) throws SQLException {
KeyRate keyRate = new KeyRate();
keyRate.setId(resultSet.getObject("ID", Long.class));
keyRate.setRate(resultSet.getObject("RATE", BigDecimal.class));
keyRate.setRate(resultSet.getObject("RATE", Double.class));
keyRate.setStartDate(getInstantFromTimestamp(resultSet,"START_DATE"));
keyRate.setEndDate(getInstantFromTimestamp(resultSet, "END_DATE"));
keyRate.setDocument(resultSet.getObject("DOCUMENT", String.class));

View file

@ -2,7 +2,7 @@ package ru.spcex.clearing.imdg.object;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.clearing.classes.StaticData.Misc.MoneyMarketSecurity;
import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity;
import ru.spcex.clearing.imdg.base.TemplateMapStore;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.imdg.utils.TimeUtil;

View file

@ -2,7 +2,7 @@ package ru.spcex.clearing.imdg.object;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.clearing.classes.StaticData.Profile.ProfileDocument;
import ru.clearing.classes.statics.data.profile.ProfileDocument;
import ru.spcex.clearing.imdg.base.ObjectBaseMapStore;
import ru.spcex.clearing.imdg.utils.DbUtilsHelper;
import ru.spcex.clearing.imdg.utils.TimeUtil;

View file

@ -7,8 +7,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ru.clearing.classes.StaticData.Company.Company;
import ru.clearing.classes.StaticData.Company.CompanyUpdate;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanyUpdate;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@Service

View file

@ -24,6 +24,9 @@
<module>dbf-importer</module>
<module>dbf-exporter</module>
<module>securities-service</module>
<module>utility-service</module>
<module>company-service</module>
<module>reports-service</module>
</modules>
<properties>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>reports-service</artifactId>
<name>reports-service</name>
<description>Service for creating reports</description>
<version>SPCEX-1.0.0.0</version>
<parent>
<artifactId>clearing</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-1.0.0.0</version>
</parent>
<dependencies>
<!-- Spring boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.19</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>

View file

@ -0,0 +1,21 @@
package ru.spcex.clearing.reports_service;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import ru.spcex.clearing.reports_service.services.ReportsService;
@SpringBootApplication
public class ReportsServiceApplication {
public static void main(String[] args) {
try {
SpringApplicationBuilder builder = new SpringApplicationBuilder(ReportsServiceApplication.class);
builder.run(args);
} catch (Throwable e) {
LoggerFactory.getLogger(ReportsServiceApplication.class).error("DBF-Loader start failed: {} -> {}", e.getClass().getSimpleName(), e.getMessage());
System.exit(-1);
}
ReportsService reportsService = new ReportsService();
reportsService.writeXML(null);
}
}

View file

@ -0,0 +1,12 @@
package ru.spcex.clearing.reports_service.config;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties
@ComponentScan(basePackages = {"ru.spcex.clearing.reports_service"})
public class ReportsServiceConfig {
}

View file

@ -0,0 +1,27 @@
package ru.spcex.clearing.reports_service.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller("/")
public class DefaultController implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
@RequestMapping(method = RequestMethod.GET, path = "/test", produces = MediaType.TEXT_PLAIN_VALUE)
@ResponseBody
public String processGet() {
log.info("Call test method for exporter controller");
return "exporter controller test method";
}
@Override
public void afterPropertiesSet() throws Exception {
log.info("controller started");
}
}

View file

@ -0,0 +1,6 @@
package ru.spcex.clearing.reports_service.exceptions;
public class ConfigException extends RuntimeException {
public ConfigException(String msg) { super(msg); }
public ConfigException(String msg, Throwable cause) { super(msg, cause); }
}

View file

@ -0,0 +1,8 @@
package ru.spcex.clearing.reports_service.properties;
import org.springframework.stereotype.Component;
@Component("reportsServiceProperties")
public class AProperties {
}

View file

@ -0,0 +1,24 @@
package ru.spcex.clearing.reports_service.services;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.AbstractDriver;
import ru.spcex.clearing.reports_service.xml_test.ChildElementForWrite;
import ru.spcex.clearing.reports_service.xml_test.CustomLocalDateConverter;
import ru.spcex.clearing.reports_service.xml_test.RootElementForWrite;
public class ReportsService {
public void writeXML(AbstractDriver driver) {
XStream xStream = driver == null ? new XStream() : new XStream(driver);
// достаточно только для рутового объекта вызвать обработку аннотаций
xStream.processAnnotations(RootElementForWrite.class);
xStream.registerConverter(new CustomLocalDateConverter(), -100);
RootElementForWrite elementForWrite = new RootElementForWrite();
elementForWrite.getTestList().add(new ChildElementForWrite());
elementForWrite.getTestList().add(new ChildElementForWrite());
String dataXml = xStream.toXML(elementForWrite);
System.out.println(dataXml);
}
}

View file

@ -0,0 +1,80 @@
package ru.spcex.clearing.reports_service.xml_test;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
import com.thoughtworks.xstream.converters.basic.BooleanConverter;
import com.thoughtworks.xstream.converters.basic.DateConverter;
import java.util.Date;
// without aliases
public class ChildElementForWrite {
@XStreamAlias("childStr") // alias for field name
private String testChildString = "testChildStr";
@XStreamAsAttribute
private Integer testAttributeInt = Integer.MIN_VALUE;
// при использовании настраевомого встроенного конвертора, ему необходимо передать параметры в конструктор
// делается это посредством параметров strings, booleans, nulls.
// т.е. такая запись эквивалентна:
// new DateConverter("MM-yyyy-dd", null)
@XStreamConverter(value = DateConverter.class, strings = {"MM-yyyy-dd"}, nulls = {String[].class})
private Date testDate = new Date();
@XStreamAsAttribute
@XStreamAlias("isBoolean")
@XStreamConverter(value = BooleanConverter.class, booleans = {true}, strings = {"yes", "no"})
private Boolean testYesAttributeBool = Boolean.TRUE;
private Integer testChildInt = Integer.MAX_VALUE;
@XStreamOmitField
private String testIgnoredString = "testIgnore";
public String getTestChildString() {
return testChildString;
}
public void setTestChildString(String testChildString) {
this.testChildString = testChildString;
}
public Integer getTestAttributeInt() {
return testAttributeInt;
}
public void setTestAttributeInt(Integer testAttributeInt) {
this.testAttributeInt = testAttributeInt;
}
public Integer getTestChildInt() {
return testChildInt;
}
public void setTestChildInt(Integer testChildInt) {
this.testChildInt = testChildInt;
}
public String getTestIgnoredString() {
return testIgnoredString;
}
public void setTestIgnoredString(String testIgnoredString) {
this.testIgnoredString = testIgnoredString;
}
public Boolean getTestYesAttributeBool() {
return testYesAttributeBool;
}
public void setTestYesAttributeBool(Boolean testYesAttributeBool) {
this.testYesAttributeBool = testYesAttributeBool;
}
}

View file

@ -0,0 +1,32 @@
package ru.spcex.clearing.reports_service.xml_test;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
// самый большой минус работы с датами: если у какой то даты отличается формат, для нее нужен кастомный конвертер
public class CustomLocalDateConverter implements Converter {
private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
LocalDate date = (LocalDate) source;
writer.setValue(formatter.format(date));
writer.addAttribute("formatted", "true");
}
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
// not implemented (not used)
return null;
}
@Override
public boolean canConvert(Class type) {
return LocalDate.class.isAssignableFrom(type);
}
}

View file

@ -0,0 +1,29 @@
package ru.spcex.clearing.reports_service.xml_test;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
@XStreamAlias("withAttrsOnly")
public class ElementWithAttributeOnly {
@XStreamAsAttribute
private String attrStr = "attrStr";
@XStreamAsAttribute
private Long attrLong = Long.MIN_VALUE;
public String getAttrStr() {
return attrStr;
}
public void setAttrStr(String attrStr) {
this.attrStr = attrStr;
}
public Long getAttrLong() {
return attrLong;
}
public void setAttrLong(Long attrLong) {
this.attrLong = attrLong;
}
}

View file

@ -0,0 +1,155 @@
package ru.spcex.clearing.reports_service.xml_test;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@XStreamAlias("root") // alias for classname
public class RootElementForWrite {
@XStreamAlias("string") // alias for field
private String testString = "testString";
private BigDecimal testBigDecimal = new BigDecimal("666.666");
private Double testDouble = Double.MAX_VALUE;
private Long testLong = Long.MIN_VALUE;
private Boolean testBoolean = Boolean.FALSE;
private LocalDate testLocalDateDefault = LocalDate.now();
@XStreamConverter(CustomLocalDateConverter.class)
private LocalDate testLocalDateCustom = LocalDate.now();
private LocalDateTime testLocalDateTime = LocalDateTime.now();
private OffsetDateTime testOffsetDateTime = OffsetDateTime.now();
private Instant testInstant = Instant.now();
@XStreamAlias("namedList")
private List<ChildElementForWrite> testList = new ArrayList<>();
@XStreamImplicit
private List<ChildElementForWrite> testListTwo = Arrays.asList(new ChildElementForWrite(), new ChildElementForWrite());
// can marshal without getter/setter
private ElementWithAttributeOnly elementWithAttributeOnly = new ElementWithAttributeOnly();
public String getTestString() {
return testString;
}
public void setTestString(String testString) {
this.testString = testString;
}
public BigDecimal getTestBigDecimal() {
return testBigDecimal;
}
public void setTestBigDecimal(BigDecimal testBigDecimal) {
this.testBigDecimal = testBigDecimal;
}
public Double getTestDouble() {
return testDouble;
}
public void setTestDouble(Double testDouble) {
this.testDouble = testDouble;
}
public Long getTestLong() {
return testLong;
}
public void setTestLong(Long testLong) {
this.testLong = testLong;
}
public Boolean getTestBoolean() {
return testBoolean;
}
public void setTestBoolean(Boolean testBoolean) {
this.testBoolean = testBoolean;
}
public LocalDate getTestLocalDate() {
return testLocalDateCustom;
}
public void setTestLocalDate(LocalDate testLocalDate) {
this.testLocalDateCustom = testLocalDate;
}
public LocalDateTime getTestLocalDateTime() {
return testLocalDateTime;
}
public void setTestLocalDateTime(LocalDateTime testLocalDateTime) {
this.testLocalDateTime = testLocalDateTime;
}
public OffsetDateTime getTestOffsetDateTime() {
return testOffsetDateTime;
}
public void setTestOffsetDateTime(OffsetDateTime testOffsetDateTime) {
this.testOffsetDateTime = testOffsetDateTime;
}
public Instant getTestInstant() {
return testInstant;
}
public void setTestInstant(Instant testInstant) {
this.testInstant = testInstant;
}
public List<ChildElementForWrite> getTestList() {
return testList;
}
public void setTestList(List<ChildElementForWrite> testList) {
this.testList = testList;
}
public List<ChildElementForWrite> getTestListTwo() {
return testListTwo;
}
public void setTestListTwo(List<ChildElementForWrite> testListTwo) {
this.testListTwo = testListTwo;
}
public LocalDate getTestLocalDateDefault() {
return testLocalDateDefault;
}
public void setTestLocalDateDefault(LocalDate testLocalDateDefault) {
this.testLocalDateDefault = testLocalDateDefault;
}
public LocalDate getTestLocalDateCustom() {
return testLocalDateCustom;
}
public void setTestLocalDateCustom(LocalDate testLocalDateCustom) {
this.testLocalDateCustom = testLocalDateCustom;
}
}

View file

@ -0,0 +1,3 @@
server.port=8080
server.servlet.context-path=/reports_service
spring.main.web-application-type=servlet

View file

@ -0,0 +1,37 @@
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>UTF-8</charset>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/reports_service.log</file>
<encoder>
<charset>UTF-8</charset>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>
../logs/reports_service.%i.log
</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>10</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>500MB</maxFileSize>
</triggeringPolicy>
</appender>
<root level="warn">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<logger name="ru.spcex" level="debug" additivity="false">
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</logger>
</configuration>

View file

@ -6,7 +6,7 @@ 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.StaticData.Misc.MoneyMarketSecurity;
import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;

View file

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-1.0.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>utility-service</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-messaging</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-imdg-api-hazelcast-impl</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>application.properties</exclude>
</excludes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>

View file

@ -0,0 +1,12 @@
package ru.spcex.clearing.utility;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class UtilityServiceApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(UtilityServiceApplication.class);
springApplication.run(args);
}
}

View file

@ -0,0 +1,17 @@
package ru.spcex.clearing.utility.config;
import org.apache.kafka.clients.consumer.Consumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory;
import ru.spcex.clearing.utility.config.settings.UtilityServiceSettings;
@Configuration
public class KafkaConfig {
@Autowired
@Bean
public Consumer<String, Object> createProducer(UtilityServiceSettings settings) {
return KafkaConsumerFactory.consumer(settings.getKafka());
}
}

View file

@ -0,0 +1,49 @@
package ru.spcex.clearing.utility.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.utility.config.settings.UtilityServiceSettings;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
@Configuration
public class UtilityServiceImdgConfig {
@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,
UtilityServiceSettings settings
) {
return new HazelcastService(taskExecutorHazelcastClientInitializer,
taskExecutorIdGeneratorAwaiter,
settings.getHazelcast());
}
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;
}
}

View file

@ -0,0 +1,31 @@
package ru.spcex.clearing.utility.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.platform.imdg.iml.hazelcast.config.HazelcastClientParams;
@Component
@PropertySource("file:${spring.config.location}/application.properties")
@ConfigurationProperties("utility-service")
public class UtilityServiceSettings {
private HazelcastClientParams hazelcast;
private KafkaConsumerSettings kafka;
public HazelcastClientParams getHazelcast() {
return hazelcast;
}
public void setHazelcast(HazelcastClientParams hazelcast) {
this.hazelcast = hazelcast;
}
public KafkaConsumerSettings getKafka() {
return kafka;
}
public void setKafka(KafkaConsumerSettings kafka) {
this.kafka = kafka;
}
}

View file

@ -0,0 +1,75 @@
package ru.spcex.clearing.utility.service;
import org.apache.kafka.clients.consumer.Consumer;
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.misc.KeyRate;
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.common.CommonDeleteRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.KeyRateNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.KeyRateUpdateRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Service
public class KeyRateService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<KeyRate> keyRateMap;
@Autowired
public KeyRateService(Consumer<String, Object> kafkaQueue, ImdgProvider imdgProvider) {
super(kafkaQueue);
this.keyRateMap = imdgProvider.getImdg(IMDGDistributedNames.Map_KeyRate, KeyRate.class);
}
@Override
public void afterPropertiesSet() {
callback(KeyRateNewRequest.class)
.setConsumer(this::newKeyRate)
.forDestination(Consts.DESTINATION_KEY_RATE_NEW, callbacks::put);
callback(KeyRateUpdateRequest.class)
.setConsumer(this::updateKeyRate)
.forDestination(Consts.DESTINATION_KEY_RATE_UPDATE, callbacks::put);
callback(CommonDeleteRequest.class)
.setConsumer(this::deleteKeyRate)
.forDestination(Consts.DESTINATION_KEY_RATE_DELETE, callbacks::put);
init();
}
private void newKeyRate(BaseRequest<KeyRateNewRequest> userRequest) {
KeyRateNewRequest req = userRequest.getRequestPayload();
log.debug("MoneyMarketSecurityNewRequest received");
KeyRate keyRate = new KeyRate();
keyRate.setEndDate(req.getEndDate());
keyRate.setDocument(req.getDocument());
keyRate.setRate(req.getKeyRate());
keyRate.setStartDate(req.getStartDate());
keyRateMap.insert(keyRate);
log.debug("successfully processed, new id {}", keyRate.getId());
}
private void updateKeyRate(BaseRequest<KeyRateUpdateRequest> userRequest) {
KeyRateUpdateRequest req = userRequest.getRequestPayload();
log.debug("MoneyMarketSecurityUpdateRequest received id = {}", req.getId());
KeyRate keyRate = keyRateMap.getSingleObjectByID(req.getId());
keyRate.setEndDate(req.getEndDate());
keyRate.setDocument(req.getDocument());
keyRate.setRate(req.getKeyRate());
keyRate.setStartDate(req.getStartDate());
keyRateMap.update(keyRate);
}
private void deleteKeyRate(BaseRequest<CommonDeleteRequest> userRequest) {
CommonDeleteRequest req = userRequest.getRequestPayload();
log.debug("CommonDeleteRequest received id = {}", req.getId());
KeyRate keyRate = keyRateMap.getSingleObjectByID(req.getId());
keyRateMap.delete(keyRate);
}
}

View file

@ -0,0 +1,13 @@
spring.main.web-application-type=none
utility-service.hazelcast.cluster-members=127.0.0.1
utility-service.hazelcast.login=dev
utility-service.hazelcast.password=dev-pass
utility-service.kafka.bootstrap-servers=localhost:9092
utility-service.kafka.group-id=dev-group
utility-service.kafka.enable-auto-commit=false
utility-service.kafka.session-timeout-ms=30000
utility-service.kafka.auto-offset-reset=latest
utility-service.kafka.linger-ms=1
utility-service.kafka.buffer-memory=33554432

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- |%X{ru.nbch.scoring.web.logging.mdc_key}-->
<Pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %class{0}:%line - %message%n</Pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/utility-service.log</file>
<encoder>
<!-- |%X{ru.nbch.scoring.web.logging.mdc_key}-->
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{0}:%msg%n</Pattern>
<charset>utf8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>
./logs/utility-service.%i.log
</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>10</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>500MB</maxFileSize>
</triggeringPolicy>
</appender>
<root level="warn">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<logger name="ru.spcex" level="debug" additivity="false">
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</logger>
</configuration>

View file

@ -14,6 +14,12 @@ public final class IMDGDistributedNames {
// public static final String Map_CompanyInfo = "Map_CompanyInfo"; интегрировано в Map_Company
public static final String Map_Contact = "Map_Contact";
public static final String Map_ProfileDocument = "Map_ProfileDocument";
public static final String Map_Account = "Map_Account";
public static final String Map_Relation = "Map_Relation";
public static final String Map_ClearingAccount = "Map_ClearingAccount";
public static final String Map_BankAccount = "Map_BankAccount";
public static final String Map_ClearingMemberCategory = "Map_ClearingMemberCategory";
public static final String Map_AccountRouting = "Map_AccountRouting";
// public static final String Map_InterestStatusDictionary = "Map_InterestStatusDictionary"; future
public static final String Map_AllowedDictionary = "Map_AllowedDictionary";