This commit is contained in:
akulikov 2023-05-19 11:00:08 +03:00
parent 0d9ae577df
commit 8a6ae8dcda
35 changed files with 2590 additions and 0 deletions

View file

@ -0,0 +1,94 @@
<?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>gateway-api</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-imdg-api-hazelcast-impl</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-messaging</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>dictionary</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-enum</artifactId>
</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>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.2.0-M1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0-M1</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>

View file

@ -0,0 +1,35 @@
package ru.spcex.clearing.gatewayapi;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.web.context.WebApplicationContext;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
@SpringBootApplication
public class GatewayApiApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(GatewayApiApplication.class);
app.run(args);
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(GatewayApiApplication.class);
}
@Override
protected WebApplicationContext run(SpringApplication application) {
return super.run(application);
}
}

View file

@ -0,0 +1,42 @@
package ru.spcex.clearing.gatewayapi.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings;
import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings;
import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams;
@Component
@PropertySource("file:${spring.config.location}/application.properties")
@ConfigurationProperties("backend-api")
public class GatewayApiSettings {
private HazelcastClientParams hazelcast;
private KafkaProducerSettings kafkaProducer;
private KafkaConsumerSettings kafkaConsumer;
public HazelcastClientParams getHazelcast() {
return hazelcast;
}
public void setHazelcast(HazelcastClientParams hazelcast) {
this.hazelcast = hazelcast;
}
public KafkaProducerSettings getKafkaProducer() {
return kafkaProducer;
}
public void setKafkaProducer(KafkaProducerSettings kafkaProducer) {
this.kafkaProducer = kafkaProducer;
}
public KafkaConsumerSettings getKafkaConsumer() {
return kafkaConsumer;
}
public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) {
this.kafkaConsumer = kafkaConsumer;
}
}

View file

@ -0,0 +1,11 @@
package ru.spcex.clearing.gatewayapi.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
}

View file

@ -0,0 +1,23 @@
package ru.spcex.clearing.gatewayapi.config.deserializers;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import ru.spcex.platform.utils.time.TimeUtil;
import java.io.IOException;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
public class InstantDeserializer extends JsonDeserializer<Instant> {
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss:SSS");
@Override
public Instant deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String date = p.getText();
if (date == null || date.trim().length() == 0) {
return null;
}
return TimeUtil.parseInstantDateAndTime(date, formatter);
}
}

View file

@ -0,0 +1,23 @@
package ru.spcex.clearing.gatewayapi.config.deserializers;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
@Override
public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String date = p.getText();
if (date == null || date.trim().length() == 0) {
return null;
}
return LocalDate.parse(date, formatter);
}
}

View file

@ -0,0 +1,31 @@
package ru.spcex.clearing.gatewayapi.controller;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.spcex.clearing.gatewayapi.request.FullRequest;
@Controller
@RequestMapping("/")
public class GatewayController {
private final Logger log = LoggerFactory.getLogger(getClass());
@ApiOperation(value = "Test gateway post request")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = String.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = String.class)})
@RequestMapping(path = "/inbound_request", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.TEXT_PLAIN_VALUE)
@ResponseBody
public String inboundRequest(@RequestBody FullRequest request) {
log.info("toString: {}", request.toString());
log.info("Call test method for gateway-api controller");
return "gateway-api controller test method";
}
}

View file

@ -0,0 +1,28 @@
package ru.spcex.clearing.gatewayapi.controller;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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
@RequestMapping("/")
public class TestController {
private final Logger log = LoggerFactory.getLogger(getClass());
@ApiOperation(value = "Test gateway-api availability.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = String.class)})
@RequestMapping(method = RequestMethod.GET, path = "/system/ping", produces = MediaType.TEXT_PLAIN_VALUE)
@ResponseBody
public String processGet() {
log.info("Call test method for gateway-api controller");
return "gateway-api controller test method";
}
}

View file

@ -0,0 +1,79 @@
package ru.spcex.clearing.gatewayapi.request;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.gatewayapi.config.deserializers.InstantDeserializer;
import java.time.Instant;
import java.util.UUID;
public class FullRequest {
@JsonProperty("id")
@ApiModelProperty(
value = """
Передавать новый UUID, если процесс стартовал по расписанию, или UUID, возвращенный в Клиринговую
систему в ответ на запрос Клиринговой системы об экспорте ценных бумаг (см. п. «Сигнальный REST API»),
если процесс стартовал по запросу от Клиринговой системы.
""",
example = "ef47f76c-bcea-11ed-afa1-0242ac120002"
)
private UUID id;
@JsonProperty("type")
@ApiModelProperty(
value = """
Передавать «DAY_START», если процесс стартовал по расписанию, или «ON_DEMAND»,
если процесс стартовал по запросу от Клиринговой системы.
""",
example = "DAY_START"
)
private String type;
@JsonProperty("datetime")
@JsonDeserialize(using = InstantDeserializer.class)
@ApiModelProperty(
value = "Передавать дату и время формирования JSON объекта в формате «ДД.ММ.ГГГГ ЧЧ:ММ:СС:ссс».",
example = "01.01.2023 12:34:56:789"
)
private Instant datetime;
@JsonProperty("section")
@ApiModelProperty(
value = "Секция (FOND или MKR)", example = "FOND"
)
private String section;
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Instant getDatetime() {
return datetime;
}
public void setDatetime(Instant datetime) {
this.datetime = datetime;
}
public String getSection() {
return section;
}
public void setSection(String section) {
this.section = section;
}
}

View file

@ -0,0 +1,68 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import java.util.UUID;
public class Client {
@JsonProperty("company_id")
@ApiModelProperty(
value = "Ссылка на company",
example = "ef47f76c-bcea-11ed-afa1-0242ac120003"
)
private UUID companyId;
@JsonProperty("client_code")
@ApiModelProperty(
value = "Код клиента",
example = "CLI001"
)
private String clientCode;
@JsonProperty("money_account")
@ApiModelProperty(
value = "Денежный счет клиента",
example = "1234567890"
)
private String moneyAccount;
@JsonProperty("depo_account")
@ApiModelProperty(
value = "Бумажный счет клиента",
example = "2223334449"
)
private String depoAccount;
public UUID getCompanyId() {
return companyId;
}
public void setCompanyId(UUID companyId) {
this.companyId = companyId;
}
public String getClientCode() {
return clientCode;
}
public void setClientCode(String clientCode) {
this.clientCode = clientCode;
}
public String getMoneyAccount() {
return moneyAccount;
}
public void setMoneyAccount(String moneyAccount) {
this.moneyAccount = moneyAccount;
}
public String getDepoAccount() {
return depoAccount;
}
public void setDepoAccount(String depoAccount) {
this.depoAccount = depoAccount;
}
}

View file

@ -0,0 +1,132 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import java.util.UUID;
public class Company {
@JsonProperty("id")
@ApiModelProperty(
value = "Идентификатор Эмитента в Модуле регистрации биржевых инструментов",
example = "ef47f76c-bcea-11ed-afa1-0242ac120003"
)
private UUID id;
@JsonProperty("short_name")
@ApiModelProperty(
value = "Основные сведения\\Сокращенное наименование на русском языке",
example = "Банк ВТБ (ПАО)"
)
private String shortName;
@JsonProperty("full_name")
@ApiModelProperty(
value = "Основные сведения\\Полное наименование на русском языке",
example = "Банк ВТБ (публичное акционерное общество)"
)
private String fullName;
@JsonProperty("trading_code")
@ApiModelProperty(
value = "Биржевой код участника",
example = "49"
)
private String tradingCode;
@JsonProperty("clearing_code")
@ApiModelProperty(
value = "Краткий клиринговый код участника клиринга. Заполняется, если участник является участником клиринга.",
example = "49"
)
private String clearingCode;
@JsonProperty("registration_code")
@ApiModelProperty(
value = "Регистрационный код участника",
example = "E/I/7702070139///////1/044525187"
)
private String registrationCode;
@JsonProperty("initiator_code")
@ApiModelProperty(
value = "Код инициатора. Заполняется, если участник является инициатором.",
example = "AB"
)
private String initiatorCode;
@JsonProperty("workflow_status")
@ApiModelProperty(
value = """
«ACTV», если Эмитент не удален
«BLKD», если Эмитент удален
""",
example = "ACTV"
)
private String workflowStatus;
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getShortName() {
return shortName;
}
public void setShortName(String shortName) {
this.shortName = shortName;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getWorkflowStatus() {
return workflowStatus;
}
public void setWorkflowStatus(String workflowStatus) {
this.workflowStatus = workflowStatus;
}
public String getTradingCode() {
return tradingCode;
}
public void setTradingCode(String tradingCode) {
this.tradingCode = tradingCode;
}
public String getClearingCode() {
return clearingCode;
}
public void setClearingCode(String clearingCode) {
this.clearingCode = clearingCode;
}
public String getRegistrationCode() {
return registrationCode;
}
public void setRegistrationCode(String registrationCode) {
this.registrationCode = registrationCode;
}
public String getInitiatorCode() {
return initiatorCode;
}
public void setInitiatorCode(String initiatorCode) {
this.initiatorCode = initiatorCode;
}
}

View file

@ -0,0 +1,70 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import java.util.UUID;
public class CompanyClearingCategory {
@JsonProperty("company_id")
@ApiModelProperty(
value = "Ссылка на company",
example = "ef47f76c-bcea-11ed-afa1-0242ac120003"
)
private UUID companyId;
@JsonProperty("category")
@ApiModelProperty(
value = """
Категория клирингового обслуживания. Возможные значения:
· C - Категория «Ц»
· B - Категория «Б»
· F - Категория «Ф»
· I - Категория «И»
· V - Категория «В»
· T - Категория «Т»
· K - Категория «К»
""",
example = "F"
)
private String category;
@JsonProperty("workflow_status")
@ApiModelProperty(
value = """
Статус допуска к категории на текущую дату. Возможные значения:
· ACTV Участник клиринга
· APPL Допущен к клиринговому обслуживанию
· SSPD Допуск приостановлен
· ROPN Допуск возобновлен
· CLOS Допуск прекращен
""",
example = "CLOS"
)
private String workflowStatus;
public UUID getCompanyId() {
return companyId;
}
public void setCompanyId(UUID companyId) {
this.companyId = companyId;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getWorkflowStatus() {
return workflowStatus;
}
public void setWorkflowStatus(String workflowStatus) {
this.workflowStatus = workflowStatus;
}
}

View file

@ -0,0 +1,134 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import java.util.UUID;
public class CompanyInfo {
@JsonProperty("company_id")
@ApiModelProperty(
value = "Ссылка на company",
example = "ef47f76c-bcea-11ed-afa1-0242ac120003"
)
private UUID companyId;
@JsonProperty("country_code")
@ApiModelProperty(value = "RUS", example = "RUS")
private String countryCode;
@JsonProperty("legal_kind")
@ApiModelProperty(
value = "Вид субъекта. Всегда «JURD» (Юридическое лицо)",
example = "JURD"
)
private String legalKind;
@JsonProperty("organization_type")
@ApiModelProperty(
value = """
Признак кредитной организации. Возможные значения:
· «CRED» - является кредитной организацией
· «NCRD» - не является кредитной организациейe
""",
example = "CRED"
)
private String organizationType;
@JsonProperty("professional_sign")
@ApiModelProperty(
value = """
Признак проф. участника. Возможные значения:
· ALWD Да
· DEND - Нет
""",
example = "DNED"
)
private String professionalSign;
@JsonProperty("residence")
@ApiModelProperty(
value = "Резиденция. Трехсимвольный код страны из классификатора ОКСМ.",
example = "RUS"
)
private String residence;
@JsonProperty("short_name_eng")
@ApiModelProperty(
value = "Основные сведения\\Сокращенное наименование на английском языке",
example = "VTB (PJSC)"
)
private String shortNameEng;
@JsonProperty("full_name_eng")
@ApiModelProperty(
value = "Основные сведения\\Полное наименование на английском языке",
example = "VTB (public joint stock company)"
)
private String fullNameEng;
public UUID getCompanyId() {
return companyId;
}
public void setCompanyId(UUID companyId) {
this.companyId = companyId;
}
public String getCountryCode() {
return countryCode;
}
public void setCountryCode(String countryCode) {
this.countryCode = countryCode;
}
public String getLegalKind() {
return legalKind;
}
public void setLegalKind(String legalKind) {
this.legalKind = legalKind;
}
public String getOrganizationType() {
return organizationType;
}
public void setOrganizationType(String organizationType) {
this.organizationType = organizationType;
}
public String getResidence() {
return residence;
}
public void setResidence(String residence) {
this.residence = residence;
}
public String getShortNameEng() {
return shortNameEng;
}
public void setShortNameEng(String shortNameEng) {
this.shortNameEng = shortNameEng;
}
public String getFullNameEng() {
return fullNameEng;
}
public void setFullNameEng(String fullNameEng) {
this.fullNameEng = fullNameEng;
}
public String getProfessionalSign() {
return professionalSign;
}
public void setProfessionalSign(String professionalSign) {
this.professionalSign = professionalSign;
}
}

View file

@ -0,0 +1,76 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import java.util.UUID;
public class CompanySymbols {
@JsonProperty("company_id")
@ApiModelProperty(
value = "Ссылка на company",
example = "ef47f76c-bcea-11ed-afa1-0242ac120003"
)
private UUID companyId;
@JsonProperty("company_symbol")
@ApiModelProperty(
value = """
Тип реквизита. Возможные значения:
· INN - Индивидуальный налоговый номер (ИНН)
· CIO - Код иностранной организации (КИО)
· OGRN - Основной государственный регистрационный номер (ОГРН)
· CPP - Код причины постановки (КПП)
· OCPO - Общероссийский классификатор предприятий и организаций (ОКПО)
· BIC - Банковский идентификационный код (БИК)
· LICB - Номер банковской лицензии (Лицензия банка)
· LICR Номер брокерской лицензии
· LICD - Номер дилерской лицензии
· LICT - Номер лицензии по управлению ЦБ
· LICС - Номер лицензии по брокерской деятельности ПФИ (производных финансовых инструментов)
· LICF - Номер лицензии форекс-дилера
""",
example = "INN"
)
private String companySymbol;
@JsonProperty("company_symbol_value")
@ApiModelProperty(
value = """
Значения для company_symbol:
Для OCVD - Регистрационные данные\\ОКВЭД
Для INN - Основные сведения\\ИНН
Для CPP - Основные сведения\\КПП
Для OCPO - Основные сведения\\ОКПО
Для BIC - Основные сведения\\БИК
Для OGRN - Основные сведения\\ОГРН
""",
example = "7702070139"
)
private String companySymbolValue;
public UUID getCompanyId() {
return companyId;
}
public void setCompanyId(UUID companyId) {
this.companyId = companyId;
}
public String getCompanySymbol() {
return companySymbol;
}
public void setCompanySymbol(String companySymbol) {
this.companySymbol = companySymbol;
}
public String getCompanySymbolValue() {
return companySymbolValue;
}
public void setCompanySymbolValue(String companySymbolValue) {
this.companySymbolValue = companySymbolValue;
}
}

View file

@ -0,0 +1,76 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import java.util.UUID;
public class Contact {
@JsonProperty("company_id")
@ApiModelProperty(
value = "Ссылка на компанию",
example = "ef47f76c-bcea-11ed-afa1-0242ac120003"
)
private UUID companyId;
@JsonProperty("contact_type")
@ApiModelProperty(
value = """
Передавать строки:
· ADRS
· POST
· CONT
· MAIL
· GDIR
· TRST
· FAX
· INFO
· WEB
""",
example = "WEB"
)
private String contactType;
@JsonProperty("contact_value")
@ApiModelProperty(
value = """
Значения для contact_type:
Для ADRS - Контакты\\Юридический адрес
Для POST - Контакты\\Почтовый адрес
Для CONT - Контакты\\ФИО контактного лица
Для MAIL - Контакты\\Адрес электронной почты
Для GDIR - Контакты\\ФИО руководителя + «, » + Должность руководителя + «, » + Телефон руководителя
Для TRST - Контакты\\ФИО отв. за фондовую деятельность + «, » + Должность отв. за фондовую деятельность + «, » + Телефон отв. за фондовую деятельность
Для FAX - Контакты\\Факс
Для INFO - Контакты\\ФИО контактного лица + «, » + Должность контактного лица + «, » + Эл. почта контактного лица + «, » + Телефон контактного лица
Для WEB - Контакты\\Веб-сайт
""",
example = "example@ex.ample"
)
private String contactValue;
public UUID getCompanyId() {
return companyId;
}
public void setCompanyId(UUID companyId) {
this.companyId = companyId;
}
public String getContactType() {
return contactType;
}
public void setContactType(String contactType) {
this.contactType = contactType;
}
public String getContactValue() {
return contactValue;
}
public void setContactValue(String contactValue) {
this.contactValue = contactValue;
}
}

View file

@ -0,0 +1,138 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.gatewayapi.config.deserializers.LocalDateDeserializer;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.UUID;
public class CouponSchedule {
@JsonProperty("security_id")
@ApiModelProperty(
value = "Ссылка на security",
example = "ef47f76c-bcea-11ed-afa1-0242ac120004"
)
private UUID securityId;
@JsonProperty("period_start_date")
@JsonDeserialize(using = LocalDateDeserializer.class)
@ApiModelProperty(
value = "Дата начала купонного периода, формат «ДД.ММ.ГГГГ»",
example = "30.12.2023"
)
private LocalDate periodStartDate;
@JsonProperty("period_end_date")
@JsonDeserialize(using = LocalDateDeserializer.class)
@ApiModelProperty(
value = "Дата выплаты купона, формат «ДД.ММ.ГГГГ»",
example = "30.12.2023"
)
private LocalDate periodEndDate;
@JsonProperty("coupon_rate")
@ApiModelProperty(
value = "Процентная ставка",
example = "7.5"
)
private BigDecimal couponRate;
@JsonProperty("coupon_number")
@ApiModelProperty(
value = "Порядковый номер",
example = "100"
)
private Long couponNumber;
@JsonProperty("coupon_currency")
@ApiModelProperty(
value = "Валюта",
example = "RUB"
)
private String couponCurrency;
@JsonProperty("accrued_coupon")
@ApiModelProperty(
value = "Сумма",
example = "100.15"
)
private BigDecimal accruedCoupon;
@JsonProperty("is_deleted")
@ApiModelProperty(
value = """
true, если Купон удален
false, если Купон не удален
""",
example = "true"
)
private Boolean isDeleted;
public UUID getSecurityId() {
return securityId;
}
public void setSecurityId(UUID securityId) {
this.securityId = securityId;
}
public LocalDate getPeriodStartDate() {
return periodStartDate;
}
public void setPeriodStartDate(LocalDate periodStartDate) {
this.periodStartDate = periodStartDate;
}
public LocalDate getPeriodEndDate() {
return periodEndDate;
}
public void setPeriodEndDate(LocalDate periodEndDate) {
this.periodEndDate = periodEndDate;
}
public BigDecimal getCouponRate() {
return couponRate;
}
public void setCouponRate(BigDecimal couponRate) {
this.couponRate = couponRate;
}
public Long getCouponNumber() {
return couponNumber;
}
public void setCouponNumber(Long couponNumber) {
this.couponNumber = couponNumber;
}
public String getCouponCurrency() {
return couponCurrency;
}
public void setCouponCurrency(String couponCurrency) {
this.couponCurrency = couponCurrency;
}
public BigDecimal getAccruedCoupon() {
return accruedCoupon;
}
public void setAccruedCoupon(BigDecimal accruedCoupon) {
this.accruedCoupon = accruedCoupon;
}
public Boolean getDeleted() {
return isDeleted;
}
public void setDeleted(Boolean deleted) {
isDeleted = deleted;
}
}

View file

@ -0,0 +1,54 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import java.util.UUID;
public class Currency {
@JsonProperty("id")
@ApiModelProperty(
value = "id",
example = "ef47f76c-bcea-11ed-afa1-0242ac120005"
)
private UUID id;
@JsonProperty("currency_code")
@ApiModelProperty(
value = "Значение из справочника «Коды валют» (dir_currency_code) dir_currency_code.letter_code",
example = "RUB"
)
private String currencyCode;
@JsonProperty("currency_code_numeric")
@ApiModelProperty(
value = "Значение из справочника «Коды валют» (dir_currency_code) dir_currency_code.numeric_code",
example = "643"
)
private String currencyCodeNumeric;
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getCurrencyCode() {
return currencyCode;
}
public void setCurrencyCode(String currencyCode) {
this.currencyCode = currencyCode;
}
public String getCurrencyCodeNumeric() {
return currencyCodeNumeric;
}
public void setCurrencyCodeNumeric(String currencyCodeNumeric) {
this.currencyCodeNumeric = currencyCodeNumeric;
}
}

View file

@ -0,0 +1,68 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import java.util.UUID;
public class DirAuctionBiddingType {
@JsonProperty("id")
@ApiModelProperty(
value = "id",
example = "ef47f76c-bcea-11ed-afa1-0242ac120004"
)
private UUID id;
@JsonProperty("type_code")
@ApiModelProperty(
value = "Тип",
example = "D"
)
private String typeCode;
@JsonProperty("name")
@ApiModelProperty(
value = "Наименование",
example = "Депозитный аукцион"
)
private String name;
@JsonProperty("is_deleted")
@ApiModelProperty(
value = "Флаг удалённости",
example = "true"
)
private Boolean isDeleted;
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getTypeCode() {
return typeCode;
}
public void setTypeCode(String typeCode) {
this.typeCode = typeCode;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getDeleted() {
return isDeleted;
}
public void setDeleted(Boolean deleted) {
isDeleted = deleted;
}
}

View file

@ -0,0 +1,36 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
public class DirCurrencyCode {
@JsonProperty("letter_code")
@ApiModelProperty(
value = "Символьный код валюты",
example = "RUB"
)
private String letterCode;
@JsonProperty("numeric_code")
@ApiModelProperty(
value = "Численный код валюты",
example = "643"
)
private String numericCode;
public String getLetterCode() {
return letterCode;
}
public void setLetterCode(String letterCode) {
this.letterCode = letterCode;
}
public String getNumericCode() {
return numericCode;
}
public void setNumericCode(String numericCode) {
this.numericCode = numericCode;
}
}

View file

@ -0,0 +1,86 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import java.util.UUID;
public class DirTradingModeMkr {
@JsonProperty("id")
@ApiModelProperty(
value = "id",
example = "ef47f76c-bcea-11ed-afa1-0242ac120006"
)
private UUID id;
@JsonProperty("trading_code")
@ApiModelProperty(
value = "trading_code",
example = "XMDT"
)
private String tradingCode;
@JsonProperty("name")
@ApiModelProperty(
value = "name",
example = "Размещение: депозитный аукцион"
)
private String name;
@JsonProperty("settle_code")
@ApiModelProperty(
value = "settle_code",
example = "T0, Bn"
)
private String settleCode;
@JsonProperty("is_deleted")
@ApiModelProperty(
value = """
true, если Режим торгов удален
false, если Режим торгов не удален
""",
example = "true"
)
private Boolean isDeleted;
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getTradingCode() {
return tradingCode;
}
public void setTradingCode(String tradingCode) {
this.tradingCode = tradingCode;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSettleCode() {
return settleCode;
}
public void setSettleCode(String settleCode) {
this.settleCode = settleCode;
}
public Boolean getDeleted() {
return isDeleted;
}
public void setDeleted(Boolean deleted) {
isDeleted = deleted;
}
}

View file

@ -0,0 +1,285 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.gatewayapi.config.deserializers.LocalDateDeserializer;
import java.time.LocalDate;
import java.util.UUID;
public class ExchangeInstrument {
@JsonProperty("id")
@ApiModelProperty(
value = "id",
example = "ef47f76c-bcea-11ed-afa1-0242ac120002"
)
private UUID id;
@JsonProperty("code")
@ApiModelProperty(
value = "Код биржевого инструмента",
example = "DSTАА10VX7X8X9"
)
private String code;
@JsonProperty("name")
@ApiModelProperty(
value = "Наименование биржевого инструмента",
example = "Договор банковского депозита"
)
private String name;
@JsonProperty("initiator_id")
@ApiModelProperty(
value = "Идентификатор Инициатора (Участника торгов) в Модуле «Реестр Участников торгов, Участников клиринга и клиентов УТ/УК».",
example = "ef47f76c-bcea-11ed-afa1-0242ac120003"
)
private UUID initiatorId;
@JsonProperty("auction_bidding_type_id")
@ApiModelProperty(
value = "Тип аукциона\\торгов. Ссылка на dir_auction_bidding_type (id)",
example = "ef47f76c-bcea-11ed-afa1-0242ac120004"
)
private UUID auctionBiddingTypeId;
@JsonProperty("exchange_offexchange")
@ApiModelProperty(
value = """
Биржевой\\Внебиржевой
Передавать:
· «exchange», если «Биржевой»
· «off_exchange», если «Внебиржевой»
""",
example = "exchange"
)
private String exchangeOffExchange;
@JsonProperty("price_measurement_unit")
@ApiModelProperty(
value = """
Единица измерения цены
Передавать:
· «Percentage_of_face_value», если «Процент от номинала»
· «In_settlement_currency», если «В валюте расчетов»
""",
example = "Percentage_of_face_value"
)
private String priceMeasurementUnit;
@JsonProperty("price_type")
@ApiModelProperty(
value = """
Вид цены
Передавать:
· «FLOATING», если «Плавающая»
· «FIXED», если «Фиксированная»
"""
)
private String priceType;
@JsonProperty("settlement_currency_letter_code")
@ApiModelProperty(
value = "Валюта расчетов. Ссылка на dir_currency_code (letter_code)",
example = "RUB"
)
private String settlementCurrencyLetterCode;
@JsonProperty("order_execution_type_by_price")
@ApiModelProperty(
value = """
Тип исполнения заявок по цене
Передавать:
· «depositor_application_price», если «По цене заявки вкладчика»
· «Counter_price», если «По встречной цене»
""",
example = "Counter_price"
)
private String orderExecutionTypeByPrice;
@JsonProperty("order_execution_type_by_volume")
@ApiModelProperty(
value = """
Тип исполнения заявок по объему
Передавать:
· «Proportional_lot», если «Пропорционально с точностью до лота (остаток остается)»
· «Proportional_rub», если «Пропорционально с точностью до рубля (остаток остается)»
· «FULLY», если «Полностью»
""",
example = "FULLY"
)
private String orderExecutionTypeByVolume;
@JsonProperty("clearing_organization")
@ApiModelProperty(
value = "Клиринговая организация",
example = "Клиринговая организация"
)
private String clearingOrganization;
@JsonProperty("settlement_organization")
@ApiModelProperty(
value = "Расчётная организация",
example = "Расчётная организация"
)
private String settlementOrganization;
@JsonProperty("specification_approval_date")
@JsonDeserialize(using = LocalDateDeserializer.class)
@ApiModelProperty(
value = "Дата принятия Решения об утверждении Спецификации биржевого инструмента",
example = "30.12.2023"
)
private LocalDate specificationApprovalDate;
@JsonProperty("specification_approval_number")
@ApiModelProperty(
value = "Номер принятия Решения об утверждении Спецификации биржевого инструмента",
example = "070323-01"
)
private LocalDate specificationApprovalNumber;
@JsonProperty("workflow_status")
@ApiModelProperty(
value = """
«ACTV», если статус Спецификации биржевого инструмента:
БИ допущен к торгам
«BLKD», если статус Спецификации биржевого инструмента:
БИ не допущен к торгам
Торги БИ приостановлены
Торги БИ прекращены
""",
example = "ACTV"
)
private String workflowStatus;
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public UUID getInitiatorId() {
return initiatorId;
}
public void setInitiatorId(UUID initiatorId) {
this.initiatorId = initiatorId;
}
public UUID getAuctionBiddingTypeId() {
return auctionBiddingTypeId;
}
public void setAuctionBiddingTypeId(UUID auctionBiddingTypeId) {
this.auctionBiddingTypeId = auctionBiddingTypeId;
}
public String getExchangeOffExchange() {
return exchangeOffExchange;
}
public void setExchangeOffExchange(String exchangeOffExchange) {
this.exchangeOffExchange = exchangeOffExchange;
}
public String getPriceMeasurementUnit() {
return priceMeasurementUnit;
}
public void setPriceMeasurementUnit(String priceMeasurementUnit) {
this.priceMeasurementUnit = priceMeasurementUnit;
}
public String getPriceType() {
return priceType;
}
public void setPriceType(String priceType) {
this.priceType = priceType;
}
public String getSettlementCurrencyLetterCode() {
return settlementCurrencyLetterCode;
}
public void setSettlementCurrencyLetterCode(String settlementCurrencyLetterCode) {
this.settlementCurrencyLetterCode = settlementCurrencyLetterCode;
}
public String getOrderExecutionTypeByPrice() {
return orderExecutionTypeByPrice;
}
public void setOrderExecutionTypeByPrice(String orderExecutionTypeByPrice) {
this.orderExecutionTypeByPrice = orderExecutionTypeByPrice;
}
public String getOrderExecutionTypeByVolume() {
return orderExecutionTypeByVolume;
}
public void setOrderExecutionTypeByVolume(String orderExecutionTypeByVolume) {
this.orderExecutionTypeByVolume = orderExecutionTypeByVolume;
}
public String getClearingOrganization() {
return clearingOrganization;
}
public void setClearingOrganization(String clearingOrganization) {
this.clearingOrganization = clearingOrganization;
}
public String getSettlementOrganization() {
return settlementOrganization;
}
public void setSettlementOrganization(String settlementOrganization) {
this.settlementOrganization = settlementOrganization;
}
public LocalDate getSpecificationApprovalDate() {
return specificationApprovalDate;
}
public void setSpecificationApprovalDate(LocalDate specificationApprovalDate) {
this.specificationApprovalDate = specificationApprovalDate;
}
public LocalDate getSpecificationApprovalNumber() {
return specificationApprovalNumber;
}
public void setSpecificationApprovalNumber(LocalDate specificationApprovalNumber) {
this.specificationApprovalNumber = specificationApprovalNumber;
}
public String getWorkflowStatus() {
return workflowStatus;
}
public void setWorkflowStatus(String workflowStatus) {
this.workflowStatus = workflowStatus;
}
}

View file

@ -0,0 +1,243 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.gatewayapi.config.deserializers.LocalDateDeserializer;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.UUID;
public class Listing {
@JsonProperty("security_id")
@ApiModelProperty(
value = "Ссылка на security",
example = "ef47f76c-bcea-11ed-afa1-0242ac120004"
)
private UUID securityId;
@JsonProperty("lot_size")
@ApiModelProperty(
value = "Размер лота",
example = "10"
)
private BigDecimal lotSize;
@JsonProperty("symbol_code")
@ApiModelProperty(
value = "Значение из «Общая информация\\Код биржевого инструмента СПВБ»",
example = "VTB_001P-06"
)
private String symbolCode;
@JsonProperty("symbol_name")
@ApiModelProperty(
value = "Значение из «Общая информация\\Сокращенное наименование на русском языке»",
example = "Биржевые облигации ВТБ"
)
private String symbolName;
@JsonProperty("trading_currency")
@ApiModelProperty(
value = "Валюта торгов",
example = "RUB"
)
private String tradingCurrency;
@JsonProperty("workflow_status")
@ApiModelProperty(
value = """
«ACTV», если Режим торгов не удален
«BLKD», если Режим торгов удален
""",
example = "ACTV"
)
private String workflowStatus;
@JsonProperty("precision")
@ApiModelProperty(
value = "Точность цены, значение dir_price_min_step_precision.precision",
example = "10"
)
private Long precision;
@JsonProperty("min_step")
@ApiModelProperty(
value = "Минимальный шаг цены, значение dir_price_min_step_precision.min_step",
example = "10"
)
private Long minStep;
@JsonProperty("settle_code")
@ApiModelProperty(
value = "Код расчетов, значение dir_settle_code.settle_code",
example = "T0"
)
private String settleCode;
@JsonProperty("settle_days")
@ApiModelProperty(
value = "Из settle_code выделить подстроку все символы, кроме первого слева, и привести подстроку к числу",
example = "0"
)
private Long settleDays;
@JsonProperty("name")
@ApiModelProperty(
value = "Режим торгов, значение dir_trading_mode.name",
example = "Обл. с ПК - Торги"
)
private String name;
@JsonProperty("code")
@ApiModelProperty(
value = "Режим торгов, значение dir_trading_mode.trading_code",
example = "UBVC"
)
private String code;
@JsonProperty("sector")
@ApiModelProperty(
value = "FOND",
example = "FOND"
)
private String sector;
@JsonProperty("start_date")
@JsonDeserialize(using = LocalDateDeserializer.class)
@ApiModelProperty(
value = "Дата начала действия, формат «ДД.ММ.ГГГГ»",
example = "30.12.2023"
)
private LocalDate startDate;
@JsonProperty("end_date")
@JsonDeserialize(using = LocalDateDeserializer.class)
@ApiModelProperty(
value = "Дата окончания действия, формат «ДД.ММ.ГГГГ»",
example = "30.12.2023"
)
private LocalDate endDate;
public UUID getSecurityId() {
return securityId;
}
public void setSecurityId(UUID securityId) {
this.securityId = securityId;
}
public BigDecimal getLotSize() {
return lotSize;
}
public void setLotSize(BigDecimal lotSize) {
this.lotSize = lotSize;
}
public String getSymbolCode() {
return symbolCode;
}
public void setSymbolCode(String symbolCode) {
this.symbolCode = symbolCode;
}
public String getSymbolName() {
return symbolName;
}
public void setSymbolName(String symbolName) {
this.symbolName = symbolName;
}
public String getTradingCurrency() {
return tradingCurrency;
}
public void setTradingCurrency(String tradingCurrency) {
this.tradingCurrency = tradingCurrency;
}
public String getWorkflowStatus() {
return workflowStatus;
}
public void setWorkflowStatus(String workflowStatus) {
this.workflowStatus = workflowStatus;
}
public Long getPrecision() {
return precision;
}
public void setPrecision(Long precision) {
this.precision = precision;
}
public Long getMinStep() {
return minStep;
}
public void setMinStep(Long minStep) {
this.minStep = minStep;
}
public String getSettleCode() {
return settleCode;
}
public void setSettleCode(String settleCode) {
this.settleCode = settleCode;
}
public Long getSettleDays() {
return settleDays;
}
public void setSettleDays(Long settleDays) {
this.settleDays = settleDays;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getSector() {
return sector;
}
public void setSector(String sector) {
this.sector = sector;
}
public LocalDate getStartDate() {
return startDate;
}
public void setStartDate(LocalDate startDate) {
this.startDate = startDate;
}
public LocalDate getEndDate() {
return endDate;
}
public void setEndDate(LocalDate endDate) {
this.endDate = endDate;
}
}

View file

@ -0,0 +1,76 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.gatewayapi.config.deserializers.LocalDateDeserializer;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.UUID;
public class Nominal {
@JsonProperty("security_id")
@ApiModelProperty(
value = "Ссылка на security",
example = "ef47f76c-bcea-11ed-afa1-0242ac120004"
)
private UUID securityId;
@JsonProperty("nominal")
@ApiModelProperty(
value = "Номинал",
example = "1000"
)
private BigDecimal nominal;
@JsonProperty("date")
@JsonDeserialize(using = LocalDateDeserializer.class)
@ApiModelProperty(
value = "Дата, формат «ДД.ММ.ГГГГ»",
example = "30.12.2023"
)
private LocalDate date;
@JsonProperty("is_deleted")
@ApiModelProperty(
value = """
true, если Номинал удален
false, если Номинал не удален
""",
example = "true"
)
private Boolean isDeleted;
public UUID getSecurityId() {
return securityId;
}
public void setSecurityId(UUID securityId) {
this.securityId = securityId;
}
public BigDecimal getNominal() {
return nominal;
}
public void setNominal(BigDecimal nominal) {
this.nominal = nominal;
}
public LocalDate getDate() {
return date;
}
public void setDate(LocalDate date) {
this.date = date;
}
public Boolean getDeleted() {
return isDeleted;
}
public void setDeleted(Boolean deleted) {
isDeleted = deleted;
}
}

View file

@ -0,0 +1,130 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.gatewayapi.config.deserializers.LocalDateDeserializer;
import java.time.LocalDate;
import java.util.UUID;
public class ProfileDocument {
@JsonProperty("company_id")
@ApiModelProperty(
value = "Ссылка на company",
example = "ef47f76c-bcea-11ed-afa1-0242ac120003"
)
private UUID companyId;
@JsonProperty("document_type")
@ApiModelProperty(
value = """
Тип. документа. Возможные значения:
· CNTR - Договор клиринга
· FORM - Анкета участника
· LICB - Банковская лицензия
· LICR - Брокерская лицензия
· LICD - Номер дилерской лицензии
· LICT - Номер лицензии по управлению ЦБ
· LICС - Номер лицензии по брокерской деятельности ПФИ (производных финансовых инструментов)
· LICF - Номер лицензии форекс-дилера
· EDOC - Договор об электронном взаимодействии
· XCNT - Документ о расторжении Договора клиринга
""",
example = "XCNT"
)
private String documentType;
@JsonProperty("issue_date")
@JsonDeserialize(using = LocalDateDeserializer.class)
@ApiModelProperty(
value = "Дата выдачи документа",
example = "30.12.2023"
)
private LocalDate issueDate;
@JsonProperty("issuer")
@ApiModelProperty(
value = "Кем выдан",
example = ""
)
private String issuer;
@JsonProperty("number")
@ApiModelProperty(
value = "Номер документа",
example = "122/Б"
)
private String number;
@JsonProperty("valid_to_date")
@JsonDeserialize(using = LocalDateDeserializer.class)
@ApiModelProperty(
value = "Дата окончания срока действия",
example = "30.12.2023"
)
private LocalDate validToDate;
@JsonProperty("link")
@ApiModelProperty(
value = "Ссылка на документ в модуле хранения документов",
example = "00cd62ba-bb30-4e9e-a8b6-7937d7492212"
)
private String link;
public UUID getCompanyId() {
return companyId;
}
public void setCompanyId(UUID companyId) {
this.companyId = companyId;
}
public String getDocumentType() {
return documentType;
}
public void setDocumentType(String documentType) {
this.documentType = documentType;
}
public LocalDate getIssueDate() {
return issueDate;
}
public void setIssueDate(LocalDate issueDate) {
this.issueDate = issueDate;
}
public String getIssuer() {
return issuer;
}
public void setIssuer(String issuer) {
this.issuer = issuer;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public LocalDate getValidToDate() {
return validToDate;
}
public void setValidToDate(LocalDate validToDate) {
this.validToDate = validToDate;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
}

View file

@ -0,0 +1,314 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.gatewayapi.config.deserializers.LocalDateDeserializer;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.UUID;
public class Security {
@JsonProperty("id")
@ApiModelProperty(
value = "id (uuid)",
example = "ef47f76c-bcea-11ed-afa1-0242ac120004"
)
private UUID id;
@JsonProperty("instrument_type")
@ApiModelProperty(
value = """
«EQTY», если Общая информация\\Вид ценной бумаги = «E - Долевые ценные бумаги (акции)»
«BOND», если Общая информация\\Вид ценной бумаги = «B - Долговые ценные бумаги (облигации)»
""",
example = "BOND"
)
private String instrumentType;
@JsonProperty("issuer_id")
@ApiModelProperty(
value = "Ссылка на company",
example = "ef47f76c-bcea-11ed-afa1-0242ac120003"
)
private UUID issuerId;
@JsonProperty("short_name")
@ApiModelProperty(
value = "Основные сведения\\Сокращенное наименование на русском языке",
example = "Биржевые облигации ВТБ"
)
private String shortName;
@JsonProperty("full_name")
@ApiModelProperty(
value = "Основные сведения\\Полное наименование на русском языке",
example = """
Биржевые облигации документарные процентные неконвертируемые на предъявителя
с обязательным централизованным хранением серии 001P-06"
"""
)
private String fullName;
@JsonProperty("short_name_eng")
@ApiModelProperty(
value = "Основные сведения\\Сокращенное наименование на английском языке",
example = "VTB exchange-traded bonds"
)
private String shortNameEng;
@JsonProperty("full_name_eng")
@ApiModelProperty(
value = "Основные сведения\\Полное наименование на английском языке",
example = """
Exchange-traded interest-bearing non-convertible bearer bonds
with obligatory centralized storage of series 001P-06
"""
)
private String fullNameEng;
@JsonProperty("security_symbol")
@ApiModelProperty(
value = "Общая информация\\Код биржевого инструмента СПВБ",
example = "VTB_001P-06"
)
private String securitySymbol;
@JsonProperty("isin")
@ApiModelProperty(
value = "Общая информация\\ISIN",
example = "RU000A0ZYWY5"
)
private String isin;
@JsonProperty("workflow_status")
@ApiModelProperty(
value = """
«ACTV», если статус ценной бумаги:
Допущена к торгам в режиме размещения
Допущена к торгам в режиме обращения
«BLKD», если статус ценной бумаги:
Не допущена к торгам
Торги временно приостановлены
Выведена из обращения
""",
example = "ACTV"
)
private String workflowStatus;
@JsonProperty("share_type")
@ApiModelProperty(
value = """
«S», если Общая информация\\Тип ценной бумаги = «S - Обыкновенная акция»
«P», если Общая информация\\Тип ценной бумаги = «P - Привилегированная акция»
""",
example = "S"
)
private String shareType;
@JsonProperty("bond_type")
@ApiModelProperty(
value = """
«Z», если Общая информация\\Тип ценной бумаги = «Z - Дисконтная облигация»
«F», если Общая информация\\Тип ценной бумаги = «F - Купонная облигация с постоянным купоном»
«V», если Общая информация\\Тип ценной бумаги = «V - Купонная облигация с переменным купоном»
«C», если Общая информация\\Тип ценной бумаги = «C - Купонная облигация Банка России»
«E», если Общая информация\\Тип ценной бумаги = «E - Биржевая облигация»
«I», если Общая информация\\Тип ценной бумаги = «I - Облигации с индексированным номиналом»
«M», если Общая информация\\Тип ценной бумаги = «M - Облигации с амортизацией долга»
"""
)
private String bondType;
@JsonProperty("maturity_date")
@JsonDeserialize(using = LocalDateDeserializer.class)
@ApiModelProperty(
value = "Дополнительная информация\\Дата погашения облигации",
example = "30.12.2023"
)
private LocalDate maturityDate;
@JsonProperty("nominal_value")
@ApiModelProperty(
value = "Общая информация\\Номинал инструмента",
example = "1000"
)
private BigDecimal nominalValue;
@JsonProperty("nominal_for_date")
@ApiModelProperty(
value = "Общая информация\\Текущее значение номинала",
example = "1000"
)
private BigDecimal nominalForDate;
@JsonProperty("nominal_currency")
@ApiModelProperty(
value = "Общая информация\\Валюта номинала",
example = "RUB"
)
private String nominalCurrency;
@JsonProperty("coupon_type")
@ApiModelProperty(
value = """
«NUL», если Дополнительная информация\\Тип купона = «NUL - Дисконтная облигация (Нулевой)»
«VAR», если Дополнительная информация\\Тип купона = «VAR - Плавающая процентная ставка (Переменный)»
«FIX», если Дополнительная информация\\Тип купона = «FIX - Фиксированная процентная ставка (Постоянный)»
""",
example = "NUL"
)
private String couponType;
@JsonProperty("coupon_frequency")
@ApiModelProperty(
value = "Дополнительная информация\\Количество купонов в год",
example = "1000"
)
private BigDecimal couponFrequency;
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getInstrumentType() {
return instrumentType;
}
public void setInstrumentType(String instrumentType) {
this.instrumentType = instrumentType;
}
public UUID getIssuerId() {
return issuerId;
}
public void setIssuerId(UUID issuerId) {
this.issuerId = issuerId;
}
public String getShortName() {
return shortName;
}
public void setShortName(String shortName) {
this.shortName = shortName;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getShortNameEng() {
return shortNameEng;
}
public void setShortNameEng(String shortNameEng) {
this.shortNameEng = shortNameEng;
}
public String getFullNameEng() {
return fullNameEng;
}
public void setFullNameEng(String fullNameEng) {
this.fullNameEng = fullNameEng;
}
public String getSecuritySymbol() {
return securitySymbol;
}
public void setSecuritySymbol(String securitySymbol) {
this.securitySymbol = securitySymbol;
}
public String getIsin() {
return isin;
}
public void setIsin(String isin) {
this.isin = isin;
}
public String getWorkflowStatus() {
return workflowStatus;
}
public void setWorkflowStatus(String workflowStatus) {
this.workflowStatus = workflowStatus;
}
public String getShareType() {
return shareType;
}
public void setShareType(String shareType) {
this.shareType = shareType;
}
public String getBondType() {
return bondType;
}
public void setBondType(String bondType) {
this.bondType = bondType;
}
public LocalDate getMaturityDate() {
return maturityDate;
}
public void setMaturityDate(LocalDate maturityDate) {
this.maturityDate = maturityDate;
}
public BigDecimal getNominalValue() {
return nominalValue;
}
public void setNominalValue(BigDecimal nominalValue) {
this.nominalValue = nominalValue;
}
public BigDecimal getNominalForDate() {
return nominalForDate;
}
public void setNominalForDate(BigDecimal nominalForDate) {
this.nominalForDate = nominalForDate;
}
public String getNominalCurrency() {
return nominalCurrency;
}
public void setNominalCurrency(String nominalCurrency) {
this.nominalCurrency = nominalCurrency;
}
public String getCouponType() {
return couponType;
}
public void setCouponType(String couponType) {
this.couponType = couponType;
}
public BigDecimal getCouponFrequency() {
return couponFrequency;
}
public void setCouponFrequency(BigDecimal couponFrequency) {
this.couponFrequency = couponFrequency;
}
}

View file

@ -0,0 +1,119 @@
package ru.spcex.clearing.gatewayapi.request.objects;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import java.util.UUID;
public class TradingMode {
@JsonProperty("exchange_instrument_id")
@ApiModelProperty(
value = "Ссылка на exchange_instrument",
example = "ef47f76c-bcea-11ed-afa1-0242ac120002"
)
private UUID exchangeInstrumentId;
@JsonProperty("Ссылка на trading_mode")
@ApiModelProperty(
value = "Ссылка на trading_mode_mkr",
example = "ef47f76c-bcea-11ed-afa1-0242ac120006"
)
private UUID tradingModeId;
@JsonProperty("min_step")
@ApiModelProperty(
value = "Минимальный шаг цены, значение listing.dir_price_min_step_precision.min_step",
example = "6"
)
private Long minStep;
@JsonProperty("precision")
@ApiModelProperty(
value = """
Значение listing.dir_price_min_step_precision.precision, соответствующее
значению listing.dir_price_min_step_precision.min_step в поле «Минимальный шаг цены»
""",
example = "1"
)
private Long precision;
@JsonProperty("lot_size")
@ApiModelProperty(
value = "Размер лота",
example = "10"
)
private Long lotSize;
@JsonProperty("trading_currency_letter_code")
@ApiModelProperty(
value = "Валюта торгов. Ссылка на dir_currency_code (letter_code)",
example = "ef47f76c-bcea-11ed-afa1-0242ac120005"
)
private UUID tradingCurrencyLetterCode;
@JsonProperty("is_deleted")
@ApiModelProperty(
value = """
true, если Режим торгов удален
false, если Режим торгов не удален
""",
example = "true"
)
private Boolean isDeleted;
public UUID getExchangeInstrumentId() {
return exchangeInstrumentId;
}
public void setExchangeInstrumentId(UUID exchangeInstrumentId) {
this.exchangeInstrumentId = exchangeInstrumentId;
}
public UUID getTradingModeId() {
return tradingModeId;
}
public void setTradingModeId(UUID tradingModeId) {
this.tradingModeId = tradingModeId;
}
public Long getMinStep() {
return minStep;
}
public void setMinStep(Long minStep) {
this.minStep = minStep;
}
public Long getPrecision() {
return precision;
}
public void setPrecision(Long precision) {
this.precision = precision;
}
public Long getLotSize() {
return lotSize;
}
public void setLotSize(Long lotSize) {
this.lotSize = lotSize;
}
public UUID getTradingCurrencyLetterCode() {
return tradingCurrencyLetterCode;
}
public void setTradingCurrencyLetterCode(UUID tradingCurrencyLetterCode) {
this.tradingCurrencyLetterCode = tradingCurrencyLetterCode;
}
public Boolean getDeleted() {
return isDeleted;
}
public void setDeleted(Boolean deleted) {
isDeleted = deleted;
}
}

View file

@ -0,0 +1,20 @@
server.port=8080
server.servlet.context-path=/gateway-api
spring.main.web-application-type=servlet
gateway-api.example-setting=test
gateway-api.hazelcast.cluster-members=127.0.0.1:5701
gateway-api.hazelcast.login=dev
gateway-api.hazelcast.password=dev-pass
gateway-api.kafka-producer.bootstrap-servers=localhost:9092
gateway-api.kafka-producer.acks=all
gateway-api.kafka-producer.retries=0
gateway-api.kafka-producer.batch-size=16384
gateway-api.kafka-producer.linger-ms=1
gateway-api.kafka-producer.buffer-memory=33554432
gateway-api.kafka-consumer.bootstrap-servers=localhost:9092
gateway-api.kafka-consumer.group-id=dev-group-gateway-api
gateway-api.kafka-consumer.enable-auto-commit=true
gateway-api.kafka-consumer.session-timeout-ms=30000
gateway-api.kafka-consumer.auto-offset-reset=latest
gateway-api.kafka-consumer.linger-ms=1
gateway-api.kafka-consumer.buffer-memory=33554432

View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<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/gateway-api.log</file>
<encoder>
<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/gateway-api.%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>
<!--<logger name="org.springframework" level="info" />-->
</configuration>

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<display-name>${project.name} ${project.version} (${timestamp})</display-name>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<absolute-ordering>
<name>spcex_web</name>
</absolute-ordering>
</web-app>

View file

@ -38,6 +38,7 @@
<module>cleaning-builders</module>
<module>trade-importer</module>
<module>lim-exporter</module>
<module>gateway-api</module>
</modules>
<properties>

View file

@ -45,6 +45,7 @@
<folder_root_reports-service>${folder_root_clearing}/clearing-parent/reports-service</folder_root_reports-service>
<folder_root_utility-service>${folder_root_clearing}/clearing-parent/utility-service</folder_root_utility-service>
<folder_root_scheduler-service>${folder_root_clearing}/clearing-parent/scheduler-service</folder_root_scheduler-service>
<folder_root_gateway-api>${folder_root_clearing}/clearing-parent/gateway-api</folder_root_gateway-api>
<!-- IMDG -->
<external_libraries.hazelcast.version>3.12.4</external_libraries.hazelcast.version>
<external_libraries.slf4j.version>1.7.33</external_libraries.slf4j.version>

View file

@ -19,6 +19,7 @@ rem copy clearing\modules\dbf-importer\*.jar allinone
rem copy clearing\modules\reports-service\*.jar allinone
rem copy clearing\modules\securities-service\*.jar allinone
rem copy clearing\modules\utility-service\*.jar allinone
rem copy clearing\modules\gateway-api\*.jar allinone
copy ..\..\..\clearing-parent\account-service\target\account-service.jar allinone
copy ..\..\..\clearing-parent\backend-api\target\backend-api.jar allinone
@ -35,5 +36,6 @@ copy ..\..\..\clearing-parent\scheduler-service\target\scheduler-service.jar all
copy ..\..\..\clearing-parent\securities-service\target\securities-service.jar allinone
copy ..\..\..\clearing-parent\trade-importer\target\trade-importer.jar allinone
copy ..\..\..\clearing-parent\utility-service\target\utility-service.jar allinone
copy ..\..\..\clearing-parent\gateway-api\target\gateway-api.jar allinone
:exit1:

View file

@ -343,6 +343,32 @@
</fileSets>
</configuration>
</execution>
<execution>
<id>copy-gateway-api-bin</id>
<phase>prepare-package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<fileSets>
<fileSet>
<sourceFile>${folder_root_gateway-api}/target/gateway-api.jar
</sourceFile>
<destinationFile>
${folder.clearing.distr.modules}/gateway-api/gateway-api.jar
</destinationFile>
</fileSet>
<fileSet>
<sourceFile>
${folder_root_gateway-api}/src/main/resources/application.properties
</sourceFile>
<destinationFile>
${folder.clearing.distr.modules}/gateway-api/application.properties
</destinationFile>
</fileSet>
</fileSets>
</configuration>
</execution>
</executions>
</plugin>
<plugin>

View file

@ -0,0 +1,9 @@
#!/bin/bash
CLEARING_HOME=/opt/mfd/clearing/
cd $CLEARING_HOME/bin
CMD="java -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7020 -jar gateway-api.jar --spring.config.location=$CLEARING_HOME/settings/gateway-api/"
$CMD >/dev/null 2>&1 &

View file

@ -0,0 +1,6 @@
FROM debian:stable-20220125-jdk17
ADD gateway-api.jar /opt/clearing/bin/gateway-api.jar
ADD application.properties /opt/clearing/bin/application.properties
USER root
ENTRYPOINT java -jar /opt/clearing/bin/gateway-api.jar --spring.config.location=/opt/clearing/bin/