diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/KafkaConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/KafkaConfig.java index 34973fffa..f1cac72b8 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/KafkaConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/KafkaConfig.java @@ -1,18 +1,49 @@ package ru.spcex.clearing.account.config; import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; import ru.spcex.clearing.account.config.settings.AccountServiceSettings; import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory; +import ru.spcex.clearing.platform.messaging.config.KafkaProducerFactory; +import ru.spcex.clearing.platform.messaging.service.RequestInfo; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgId; +import ru.spcex.platform.imdg.api.ImdgProvider; @Configuration public class KafkaConfig { @Autowired + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Bean - public Consumer createProducer(AccountServiceSettings settings) { - return KafkaConsumerFactory.consumer(settings.getKafka()); + public Consumer createConsumer(AccountServiceSettings settings) { + return KafkaConsumerFactory.consumer(settings.getKafkaConsumer()); + } + + @Autowired + @Bean + public Producer createProducer(AccountServiceSettings settings) { + return KafkaProducerFactory.producer(settings.getKafkaProducer()); + } + + @Autowired + @Bean + public KafkaSender kafkaSender(Producer kafkaProducer, ImdgProvider imdgProvider) { + ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator(); + return KafkaSender + .setup() + .producer(kafkaProducer) + .idGenerator(imdgIdGenerator::nextId) + .imdgProvider(s -> { + Imdg imdg = imdgProvider.getImdg(s, RequestInfo.class); + return imdg::insert; + }) + .build(); } } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/settings/AccountServiceSettings.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/settings/AccountServiceSettings.java index f6f1166bb..1848ace41 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/settings/AccountServiceSettings.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/settings/AccountServiceSettings.java @@ -4,6 +4,7 @@ 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 @@ -11,7 +12,8 @@ import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; @ConfigurationProperties("account-service") public class AccountServiceSettings { private HazelcastClientParams hazelcast; - private KafkaConsumerSettings kafka; + private KafkaConsumerSettings kafkaConsumer; + private KafkaProducerSettings kafkaProducer; public HazelcastClientParams getHazelcast() { return hazelcast; @@ -21,11 +23,19 @@ public class AccountServiceSettings { this.hazelcast = hazelcast; } - public KafkaConsumerSettings getKafka() { - return kafka; + public KafkaConsumerSettings getKafkaConsumer() { + return kafkaConsumer; } - public void setKafka(KafkaConsumerSettings kafka) { - this.kafka = kafka; + public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) { + this.kafkaConsumer = kafkaConsumer; + } + + public KafkaProducerSettings getKafkaProducer() { + return kafkaProducer; + } + + public void setKafkaProducer(KafkaProducerSettings kafkaProducer) { + this.kafkaProducer = kafkaProducer; } } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java new file mode 100644 index 000000000..57bea0fa9 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java @@ -0,0 +1,76 @@ +package ru.spcex.clearing.account.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.account.Account; +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.account.sdf01.AccountSdf01Request; +import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf01RequestPart; +import ru.spcex.clearing.platform.messaging.domain.cud.balance.AccountSdf01ToStatementRequestPart; +import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class AccountService extends QueueConsumer implements InitializingBean { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Imdg accountMap; + private final KafkaSender kafkaSender; + + @Autowired + public AccountService(Consumer kafkaQueue, ImdgProvider imdgProvider, KafkaSender kafkaSender) { + super(kafkaQueue); + this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); + this.kafkaSender = kafkaSender; + } + + @Override + public void afterPropertiesSet() { + callback(AccountSdf01Request.class) + .setConsumer(this::accountNew) + .forDestination(Consts.ACCOUNT_NEW, callbacks::put); + init(); + } + + private void accountNew(BaseRequest userRequest) { + AccountSdf01Request req = userRequest.getRequestPayload(); + log.debug("AccountSdf01Request received"); + List accountToStatement = new ArrayList<>(); + for (AccountSdf01RequestPart accountReq : req.getAccounts()) { + Account account = new Account(); + account.setAccount(accountReq.getAccount()); + //fixme account.setCompany(); + accountMap.insert(account); + AccountSdf01ToStatementRequestPart responsePart = responsePart(accountReq.getSdf01Id()); + accountToStatement.add(responsePart); + } + sendStatementRequestBack(req.getGroupingSdf01Id(), accountToStatement); + log.debug("successfully processed, grouping id={}, processed number={}", req.getGroupingSdf01Id(), accountToStatement.size()); + } + + private AccountSdf01ToStatementRequestPart responsePart(Long sdf01Id) { + AccountSdf01ToStatementRequestPart responsePart = new AccountSdf01ToStatementRequestPart(); + responsePart.setSdf01Id(sdf01Id); + responsePart.setErrorCode(null); + responsePart.setErrorText(null); + return responsePart; + } + + private void sendStatementRequestBack(Long groupingSdf01Id, List results) { + StatementRequest request = new StatementRequest(); + request.setSdf01GroupId(groupingSdf01Id); + request.setAccountCreationResults(results); + kafkaSender.sendRequestToQueue(Consts.STATEMENT_PROCESS, request); + } +} diff --git a/clearing-parent/account-service/src/main/resources/application.properties b/clearing-parent/account-service/src/main/resources/application.properties index f2d6fe4d8..b778da132 100644 --- a/clearing-parent/account-service/src/main/resources/application.properties +++ b/clearing-parent/account-service/src/main/resources/application.properties @@ -1,11 +1,19 @@ spring.main.web-application-type=none -account-service.hazelcast.cluster-members=127.0.0.1 +account-service.hazelcast.cluster-members=127.0.0.1:5701 account-service.hazelcast.login=dev account-service.hazelcast.password=dev-pass -account-service.kafka.bootstrap-servers=localhost:9092 -account-service.kafka.group-id=dev-group -account-service.kafka.enable-auto-commit=false -account-service.kafka.session-timeout-ms=30000 -account-service.kafka.auto-offset-reset=latest -account-service.kafka.linger-ms=1 -account-service.kafka.buffer-memory=33554432 \ No newline at end of file + +account-service.kafka-consumer.bootstrap-servers=localhost:9092 +account-service.kafka-consumer.group-id=dev-group-account-service +account-service.kafka-consumer.enable-auto-commit=true +account-service.kafka-consumer.session-timeout-ms=30000 +account-service.kafka-consumer.auto-offset-reset=latest +account-service.kafka-consumer.linger-ms=1 +account-service.kafka-consumer.buffer-memory=33554432 + +account-service.kafka-producer.bootstrap-servers=localhost:9092 +account-service.kafka-producer.acks=all +account-service.kafka-producer.retries=0 +account-service.kafka-producer.batch-size=16384 +account-service.kafka-producer.linger-ms=1 +account-service.kafka-producer.buffer-memory=33554432 \ No newline at end of file diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/WebConfig.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/WebConfig.java index 005fa63aa..1cc5893df 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/WebConfig.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/config/WebConfig.java @@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; +import org.springframework.boot.web.servlet.server.CookieSameSiteSupplier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; @@ -75,4 +76,9 @@ public class WebConfig implements WebMvcConfigurer { public RequestContextListener requestContextListener() { return new RequestContextListener(); } + + @Bean + public CookieSameSiteSupplier applicationCookieSameSiteSupplier() { + return CookieSameSiteSupplier.ofNone(); + } } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/QueueExceptionHandler.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/QueueExceptionHandler.java index f2c2036a9..5b6503559 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/QueueExceptionHandler.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/QueueExceptionHandler.java @@ -55,7 +55,7 @@ public class QueueExceptionHandler extends ResponseEntityExceptionHandler { UnrecognizedPropertyException jacksonException = (UnrecognizedPropertyException) ex.getCause(); message = new EnumMessage(BackEndError.UnknownJsonProperty, jacksonException.getPropertyName()); } catch (ClassCastException e) { - log.error(ExceptionUtils.getStackTrace(e)); + log.error(ExceptionUtils.getStackTrace(ex)); message = new EnumMessage(BackEndError.FailedToReadHttpMessage); } errorResponse.setCode(message.getSubject().getId()); diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/user/UserSettingsSessionController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/user/UserSettingsSessionController.java deleted file mode 100644 index 549d04aee..000000000 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/user/UserSettingsSessionController.java +++ /dev/null @@ -1,38 +0,0 @@ -package ru.spcex.clearing.backendapi.controller.queue.user; - -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.beans.factory.annotation.Autowired; -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; -import ru.clearing.classes.statics.data.user.UserSettings; -import ru.spcex.clearing.backendapi.controller.response.entity.user.UserSettingsBackendGetAll; -import ru.spcex.clearing.backendapi.service.IStateLoader; -import ru.spcex.clearing.imdg.IMDGDistributedNames; - -import java.util.Collection; - -@Controller -@RequestMapping("/user-settings") -public class UserSettingsSessionController { - private final IStateLoader stateLoader; - - @Autowired - public UserSettingsSessionController(IStateLoader stateLoader) { - this.stateLoader = stateLoader; - } - - @ApiOperation(value = "get all user settings.") - @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = UserSettingsBackendGetAll.class)}) - @RequestMapping(method = RequestMethod.GET) - @ResponseBody - public UserSettingsBackendGetAll getAll() { - Collection all = stateLoader.getAll(IMDGDistributedNames.Map_UserSettings, UserSettings.class); - var response = new UserSettingsBackendGetAll(); - response.fromEntity(all); - return response; - } -} diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/utilities/UserSettingsController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/utilities/UserSettingsController.java new file mode 100644 index 000000000..7a52b494b --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/utilities/UserSettingsController.java @@ -0,0 +1,76 @@ +package ru.spcex.clearing.backendapi.controller.queue.utilities; + +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +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.clearing.classes.statics.data.user.User; +import ru.clearing.classes.statics.data.user.UserSettings; +import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController; +import ru.spcex.clearing.backendapi.controller.request.cud.utilities.UserSettingsUpdateAction; +import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse; +import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse; +import ru.spcex.clearing.backendapi.controller.response.entity.user.UserSettingsBackendGetAll; +import ru.spcex.clearing.backendapi.security.KeycloakUtils; +import ru.spcex.clearing.backendapi.service.IOperator; +import ru.spcex.clearing.backendapi.service.IStateLoader; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ExecutionException; + +@Controller +@RequestMapping("/utilities/user-settings") +public class UserSettingsController extends AbstractQueueController { + private final IStateLoader stateLoader; + private final Imdg userImdg; + + @Autowired + public UserSettingsController(IOperator operator, IStateLoader stateLoader, ImdgProvider imdgProvider) { + super(operator); + this.stateLoader = stateLoader; + this.userImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_User, User.class); + } + + @ApiOperation(value = "get all user settings.") + @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = UserSettingsBackendGetAll.class)}) + @RequestMapping(method = RequestMethod.GET) + @ResponseBody + public UserSettingsBackendGetAll getAll() { + Collection all = stateLoader.getAll(IMDGDistributedNames.Map_UserSettings, UserSettings.class); + var response = new UserSettingsBackendGetAll(); + response.fromEntity(all); + return response; + } + + @ApiOperation(value = "update user settings.") + @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)}) + @RequestMapping(method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public CudResponse update( + @ApiParam(value = "Новые значения полей объекта.", required = true) + @RequestBody UserSettingsUpdateAction userSettingsUpdateAction) throws ExecutionException, InterruptedException { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String username = KeycloakUtils.getUserNameFromAuthentication(authentication); + User user = userImdg.getSingleObjectByFieldValues(Map.of("identifier", username)); + if (user == null) { + throw new IllegalStateException("cannot obtain userId from logged in user " + username); + } + userSettingsUpdateAction.setUserId(user.getId()); + return processRequest(Consts.USER_SETTINGS_UPDATE, userSettingsUpdateAction); + } + +} diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/utilities/UserSettingsUpdateAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/utilities/UserSettingsUpdateAction.java new file mode 100644 index 000000000..cc4bbf384 --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/utilities/UserSettingsUpdateAction.java @@ -0,0 +1,54 @@ +package ru.spcex.clearing.backendapi.controller.request.cud.utilities; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; +import io.swagger.annotations.ApiModelProperty; +import ru.spcex.clearing.backendapi.domain.actions.IAction; +import ru.spcex.clearing.platform.messaging.domain.ActionType; +import ru.spcex.clearing.platform.messaging.domain.cud.utilities.UserSettingsUpdateRequest; + +public class UserSettingsUpdateAction implements IAction { + @ApiModelProperty(hidden = true) + @JsonProperty + public Long userId; + + @JsonProperty + public String version; + public String json; + + @JsonProperty("json") + public void unpackRawJson(JsonNode json) { + this.json = json.toString(); + } + + @ApiModelProperty(hidden = true) + @Override + public ActionType getActionType() { + return ActionType.UPDATE; + } + + @Override + public UserSettingsUpdateRequest toRequest() { + var req = new UserSettingsUpdateRequest(); + req.setVersion(version); + req.setJson(json); + req.setUserId(userId); + return req; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } +} diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/company/CompanyBackendGetAll.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/company/CompanyBackendGetAll.java index d7f4fab4f..59ee43b96 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/company/CompanyBackendGetAll.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/company/CompanyBackendGetAll.java @@ -53,23 +53,25 @@ public class CompanyBackendGetAll extends BasicSpcexResponse { singleItem.setUpdated(company.getUpdated()); CompanyBackendGetFields.CompanyInfoFields companyInfoFields = new CompanyBackendGetFields.CompanyInfoFields(); CompanyInfo profile = company.getProfile(); - companyInfoFields.setId(profile.getId()); - companyInfoFields.setCompanyId(profile.getCompanyId()); - companyInfoFields.setCorporationSoleType(profile.getCorporationSoleType()); - companyInfoFields.setCountryCode(profile.getCountryCode()); - companyInfoFields.setDescription(profile.getDescription()); - companyInfoFields.setProfessionalSign(profile.getProfessionalSign()); - companyInfoFields.setLegalKind(profile.getLegalKind()); - companyInfoFields.setOrganizationType(profile.getOrganizationType()); - companyInfoFields.setResidence(profile.getResidence()); - companyInfoFields.setShortName(profile.getShortName()); - companyInfoFields.setFullName(profile.getFullName()); - companyInfoFields.setShortNameEng(profile.getShortNameEng()); - companyInfoFields.setFullNameEng(profile.getFullNameEng()); - companyInfoFields.setTradingCode(profile.getTradingCode()); - companyInfoFields.setClearingCode(profile.getClearingCode()); - companyInfoFields.setRegistrationCode(profile.getRegistrationCode()); - singleItem.setProfile(companyInfoFields); + if (profile != null) { + companyInfoFields.setId(profile.getId()); + companyInfoFields.setCompanyId(profile.getCompanyId()); + companyInfoFields.setCorporationSoleType(profile.getCorporationSoleType()); + companyInfoFields.setCountryCode(profile.getCountryCode()); + companyInfoFields.setDescription(profile.getDescription()); + companyInfoFields.setProfessionalSign(profile.getProfessionalSign()); + companyInfoFields.setLegalKind(profile.getLegalKind()); + companyInfoFields.setOrganizationType(profile.getOrganizationType()); + companyInfoFields.setResidence(profile.getResidence()); + companyInfoFields.setShortName(profile.getShortName()); + companyInfoFields.setFullName(profile.getFullName()); + companyInfoFields.setShortNameEng(profile.getShortNameEng()); + companyInfoFields.setFullNameEng(profile.getFullNameEng()); + companyInfoFields.setTradingCode(profile.getTradingCode()); + companyInfoFields.setClearingCode(profile.getClearingCode()); + companyInfoFields.setRegistrationCode(profile.getRegistrationCode()); + singleItem.setProfile(companyInfoFields); + } payload.getItems().add(singleItem); } } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/KeycloakUtils.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/KeycloakUtils.java new file mode 100644 index 000000000..52bc02e40 --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/KeycloakUtils.java @@ -0,0 +1,20 @@ +package ru.spcex.clearing.backendapi.security; + +import org.keycloak.KeycloakPrincipal; +import org.keycloak.adapters.spi.KeycloakAccount; +import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; +import org.springframework.security.core.Authentication; + +public class KeycloakUtils { + /** + * Достать username из Keycloak имплементации Authentication + */ + public static String getUserNameFromAuthentication(Authentication authentication) { + KeycloakAuthenticationToken auth = (KeycloakAuthenticationToken) authentication; + KeycloakAccount details = (KeycloakAccount) auth.getDetails(); + return ((KeycloakPrincipal) details.getPrincipal()) + .getKeycloakSecurityContext() + .getToken() + .getPreferredUsername(); + } +} diff --git a/clearing-parent/backend-api/src/main/resources/application.properties b/clearing-parent/backend-api/src/main/resources/application.properties index 8c83a2cef..32e6e67c6 100644 --- a/clearing-parent/backend-api/src/main/resources/application.properties +++ b/clearing-parent/backend-api/src/main/resources/application.properties @@ -1,5 +1,9 @@ server.port=8080 server.servlet.context-path=/backend-api +server.ssl.key-store-type=PKCS12 +server.ssl.key-store=classpath:keystore/client.p12 +server.ssl.key-store-password=Aa123456 +server.ssl.enabled=true spring.main.web-application-type=servlet backend-api.example-setting=test diff --git a/clearing-parent/backend-api/src/main/resources/data.xml b/clearing-parent/backend-api/src/main/resources/data.xml index da29f9695..4b7da1df1 100644 --- a/clearing-parent/backend-api/src/main/resources/data.xml +++ b/clearing-parent/backend-api/src/main/resources/data.xml @@ -1,22 +1,29 @@ - - - - + - + + + + + + + + + + + @@ -31,8 +38,9 @@ - - + + + @@ -44,7 +52,7 @@ - + @@ -54,14 +62,15 @@ - - - - - - - - + + + + + + + + + @@ -83,7 +92,6 @@ - @@ -135,97 +143,119 @@ - + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + + + + + - + - + - + - + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/clearing-parent/backend-api/src/main/resources/meta.xml b/clearing-parent/backend-api/src/main/resources/meta.xml index d0ff64de3..9c62bb341 100644 --- a/clearing-parent/backend-api/src/main/resources/meta.xml +++ b/clearing-parent/backend-api/src/main/resources/meta.xml @@ -39,12 +39,17 @@ - + - + + + + + + @@ -104,11 +109,11 @@ - + - + @@ -215,14 +220,29 @@ - + + + + + + + + + + + + + + + + - + @@ -233,22 +253,22 @@ - + - + - + - + @@ -258,14 +278,14 @@ - + - + @@ -364,12 +384,16 @@ - + - - - + + + + + + + @@ -425,15 +449,15 @@ - + - + - + @@ -481,6 +505,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + @@ -516,10 +575,10 @@ - + - + @@ -547,7 +606,7 @@ - + @@ -558,7 +617,7 @@ - + @@ -570,7 +629,7 @@ - + @@ -673,8 +732,8 @@ - - + + @@ -691,57 +750,97 @@ + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - + + - + - + - + + @@ -795,12 +894,58 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -826,20 +971,20 @@ - + - - - - - - - + + + + + + + - + @@ -847,7 +992,7 @@ - + @@ -866,7 +1011,7 @@ - + @@ -895,15 +1040,15 @@ - + - - + + - + @@ -921,8 +1066,8 @@ - - + + @@ -932,18 +1077,18 @@ - + - + - + - + @@ -951,16 +1096,16 @@ - + - + - + @@ -984,7 +1129,7 @@ - + @@ -997,7 +1142,7 @@ - + @@ -1009,7 +1154,7 @@ - + @@ -1027,7 +1172,7 @@ - + @@ -1166,7 +1311,7 @@ - + @@ -1194,7 +1339,7 @@ - + @@ -1265,12 +1410,12 @@ - + - + @@ -1302,19 +1447,19 @@ - + - - - - - - + + + + + + @@ -1322,7 +1467,6 @@ - @@ -1331,7 +1475,7 @@ - + @@ -1345,7 +1489,7 @@ - + @@ -1354,12 +1498,57 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1390,77 +1579,102 @@ - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - + + + + + + + + + + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/ValidationConfig.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/ValidationConfig.java index d8ec3a972..72446bfdc 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/ValidationConfig.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/ValidationConfig.java @@ -4,11 +4,15 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.sdf.SDf01; +import ru.spcex.clearing.balance.validation.AccountBalanceValidation; +import ru.spcex.clearing.balance.validation.AccountBalanceValidationRule; import ru.spcex.clearing.balance.validation.Sdf01ValidationRule; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.ValidatorImpl; @@ -26,7 +30,9 @@ public class ValidationConfig { context.setValidatedObject(sDf01); BiConsumer> addImdg = (s, aClass) -> context.addImdg(s, imdgProvider.getImdg(s, aClass)); addImdg.accept(IMDGDistributedNames.Map_Account, Account.class); + addImdg.accept(IMDGDistributedNames.Map_Company, Company.class); return new ValidatorImpl<>(context, + Sdf01ValidationRule.CompanyPresent, Sdf01ValidationRule.AccountPresent, Sdf01ValidationRule.CurrencyCode, Sdf01ValidationRule.CurrentDateOnly, @@ -35,4 +41,21 @@ public class ValidationConfig { }; } + @Autowired + @Bean("accountBalanceValidator") + public Function accountBalanceValidator(ImdgProvider imdgProvider) { + return fieldsToValidateWrapper -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(fieldsToValidateWrapper); + BiConsumer> addImdg = (s, aClass) -> context.addImdg(s, imdgProvider.getImdg(s, aClass)); + addImdg.accept(IMDGDistributedNames.Map_Account, Account.class); + addImdg.accept(IMDGDistributedNames.Map_Company, Company.class); + return new ValidatorImpl<>(context, + AccountBalanceValidationRule.CompanyPresent, + AccountBalanceValidationRule.AccountOk); + }; + } + + + } diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/errors/BalanceError.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/errors/BalanceError.java index 6b9cad972..2cd8704de 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/errors/BalanceError.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/errors/BalanceError.java @@ -8,7 +8,8 @@ public enum BalanceError implements IEnumId { CurrentDateOnly(5214L), WrongMarket(5215L), WrongAccount(5215L), - AccountNotPresent(-1L); + AccountNotPresent(5217L), + AccountNotActive(5218L) ; private final Long id; diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/AccountBalanceService.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/AccountBalanceService.java new file mode 100644 index 000000000..3e46d3f42 --- /dev/null +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/AccountBalanceService.java @@ -0,0 +1,79 @@ +package ru.spcex.clearing.balance.service; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.AccountBalance; +import ru.clearing.classes.statics.data.company.Company; +import ru.spcex.clearing.balance.validation.AccountBalanceValidation; +import ru.spcex.clearing.balance.validation.ValidationStored; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.BalanceAccountType; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidator; + +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +@Component +public class AccountBalanceService { + private final ImdgProvider imdgProvider; + private final Imdg accountBalanceImdg; + private final Function validationFactory; + + public AccountBalanceService(ImdgProvider imdgProvider, + @Qualifier("accountBalanceValidator") Function validationFactory) { + this.imdgProvider = imdgProvider; + this.validationFactory = validationFactory; + this.accountBalanceImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class); + } + + public AccountResult createAccountBalance(Long addresseeId, Long accountId, BigDecimal amount, + String cashMovementCurrencyCode) { + IValidator validator = validationFactory.apply(new AccountBalanceValidation(addresseeId, accountId)); + Optional validationError = validator + .tillFirstError(); + if (validationError.isPresent()) return new AccountResult(validationError.get()); + Account account = validator.getStored(ValidationStored.Account); + Company company = validator.getStored(ValidationStored.Company); + //которой accountBalance.accountId=statement.accountId и accountBalance.companyId=statement.companyId: + + AccountBalance accountBalance = accountBalanceImdg.getSingleObjectByFieldValues( + Map.of("accountId", accountId, "companyId", addresseeId) + ); + if (accountBalance == null) { + accountBalance = new AccountBalance(); + accountBalance.setCompanyId(addresseeId); + accountBalance.setCreated(Instant.now()); + accountBalance.setAccountId(accountId); + accountBalance.setAccountType(account.getAccountType()); + accountBalance.setAccount(account.getAccount()); + accountBalance.setOpenBalanceAmount(amount); + accountBalance.setFreeBalanceAmount(amount); + accountBalance.setBalanceAmount(amount); + accountBalance.setBalanceAccountType(BalanceAccountType.Active.getKey()); + accountBalance.setClearingDate(LocalDate.now()); + accountBalance.setCurrencyCode(cashMovementCurrencyCode); + accountBalance.setTradingCode(company.getTradingCode()); + accountBalance.setShortName(company.getShortName()); + accountBalance.setFullName(company.getFullName()); + return new AccountResult(accountBalance); + } else { + accountBalance.setUpdated(Instant.now()); + accountBalance.setAccountId(accountId); + accountBalance.setAccountType(account.getAccountType()); + accountBalance.setAccount(account.getAccount()); + accountBalance.setOpenBalanceAmount(amount); + accountBalance.setFreeBalanceAmount(amount); + accountBalance.setBalanceAmount(amount); + accountBalance.setCurrencyCode(cashMovementCurrencyCode); + return new AccountResult(accountBalance); + } + } +} diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/AccountResult.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/AccountResult.java new file mode 100644 index 000000000..0e38e0dde --- /dev/null +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/AccountResult.java @@ -0,0 +1,25 @@ +package ru.spcex.clearing.balance.service; + +import ru.clearing.classes.statics.data.account.AccountBalance; +import ru.spcex.platform.utils.enumeration.EnumMessage; + +public class AccountResult { + private EnumMessage error; //if was + private AccountBalance account; + + public AccountResult(EnumMessage validationError) { + this.error = validationError; + } + + public AccountResult(AccountBalance account) { + this.account = account; + } + + public EnumMessage getError() { + return error; + } + + public AccountBalance getAccount() { + return account; + } +} diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf02Service.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf02Service.java index 1b873fde7..451a98c1c 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf02Service.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf02Service.java @@ -14,6 +14,8 @@ import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +//fixme remove +@Deprecated @Service public class Sdf02Service extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java index afc945838..ddaf951a4 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java @@ -8,98 +8,236 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.AccountBalance; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.sdf.SDf01; +import ru.clearing.classes.statics.data.sdf.SDf02; import ru.clearing.classes.statics.data.statement.Statement; import ru.spcex.clearing.balance.errors.BalanceError; import ru.spcex.clearing.balance.validation.ValidationStored; 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.account.AccountNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf01Request; +import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf01RequestPart; +import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileRequest; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.enumeration.*; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.number.BigDecimalUtil; +import ru.spcex.platform.utils.time.TimeUtil; import ru.spcex.platform.utils.validation.IValidator; -import java.util.Map; -import java.util.Optional; +import java.time.Instant; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; import java.util.function.Function; +import java.util.stream.Collectors; @Service public class StatementService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); + private final static DateTimeFormatter datFormatter = DateTimeFormatter.ofPattern("dd.MM.yy"); private final ImdgProvider imdgProvider; private final KafkaSender kafkaReqProducer; private final LoggingService errorLogger; private final Imdg sdf01Imdg; - private final Imdg companyImdg; - private final Imdg accountImdg; + private final Imdg sdf02Imdg; + private final Imdg accountBalanceImdg; private final Imdg statementImdg; private final Function sDf01Validator; + private final AccountBalanceService accountBalanceService; + private final IMessageResolver errorResolver; @Autowired public StatementService(Consumer kafkaQueue, ImdgProvider imdgProvider, KafkaSender kafkaReqProducer, LoggingService errorLogger, - @Qualifier("sdf01Validator") Function sDf01Validator) { + @Qualifier("sdf01Validator") Function sDf01Validator, + AccountBalanceService accountBalanceService, + IMessageResolver errorResolver) { super(kafkaQueue); this.imdgProvider = imdgProvider; this.sdf01Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf01, SDf01.class); - this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); + this.sdf02Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf02, SDf02.class); + this.accountBalanceService = accountBalanceService; this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class); + this.accountBalanceImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountBalance, AccountBalance.class); this.kafkaReqProducer = kafkaReqProducer; this.errorLogger = errorLogger; this.sDf01Validator = sDf01Validator; + this.errorResolver = errorResolver; } @Override public void afterPropertiesSet() throws Exception { callback(StatementRequest.class) .setConsumer(this::process) - .forDestination(Consts.DESTINATION_SDF02_NEW, callbacks::put); + .forDestination(Consts.STATEMENT_PROCESS, callbacks::put); init(); } private void process(BaseRequest systemRequest) { - StatementRequest sdfInfo = systemRequest.getRequestPayload(); - SDf01 sdf01 = sdf01Imdg.getSingleObjectByID(sdfInfo.getSdf01Id()); - Company company = companyImdg.getSingleObjectByFieldValues(Map.of("tradingCode", sdf01.getDeal())); - if (company == null) { - errorLogger.logError("sdf01.id={}", new EnumMessage(BalanceError.CompanyNotFound), sdfInfo.getSdf01Id()); - return; - } - IValidator validator = sDf01Validator.apply(sdf01); - Optional error = validator.tillFirstError(); - if (BalanceError.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) { - kafkaReqProducer.sendRequestToQueue(Consts.ACCOUNT_NEW, createAccountRequest(sdf01.getAccount())); - log.info("account not found - send request for creation"); - return; - } - if (error.isPresent()) { - errorLogger.logError("sdf01.id={}", error.get(), sdf01.getId()); - return; - } - Statement statement = statementImdg.getSingleObjectByFieldValues(Map.of("account", sdf01.getAccount())); - - if (statement == null) { - createFlow(sdfInfo, validator.getStored(ValidationStored.Sdf01Account)); + StatementRequest statementRequest = systemRequest.getRequestPayload(); + Collection sdf01Group; + if (statementRequest.getAccountCreationResults().size() == 0) { + sdf01Group = sdf01Imdg.getCollectionObjectsByFieldValues(Map.of("generationId", statementRequest.getSdf01GroupId())); } else { -// updateFlow(statement); + sdf01Group = statementRequest.getAccountCreationResults() + .stream() + .filter(part -> part.getErrorCode() == null) //fixme эти случае должны попадать в ошибочный sdf02 + .map(part -> sdf01Imdg.getSingleObjectByID(part.getSdf01Id())) + .collect(Collectors.toList()); } + sdf01Group = sdf01Group + .stream() + .sorted(Comparator.comparing(SpcexObjectBase::getId)) + .collect(Collectors.toList()); + List accountRequests = new ArrayList<>(); + Long generationIdForGroup = imdgProvider.getImdgIdGenerator().nextId(); + for (SDf01 sdf01 : sdf01Group) { + IValidator validator = sDf01Validator.apply(sdf01); + Optional error = validator.tillFirstError(); + Company company = validator.getStored(ValidationStored.Company); + if (statementRequest.getAccountCreationResults().size() == 0 + && BalanceError.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) { + //на данном шаге company существует -> getId ok + //формируем пакетный запрос на добавление account + //ответ придет в этот же метод, process + accountRequests.add(createAccountRequestPart(sdf01.getId(), sdf01.getAccount(), company.getId())); + log.info("account {} for sdf01.id={} not found - send request for creation", sdf01.getAccount(), sdf01.getId()); + } else if (BalanceError.AccountNotPresent.equals(error.map(EnumMessage::getSubject).orElse(null))) { + log.error("fatal error: resumed processing after generating accounts, but no account found for sdf01.id={}", sdf01.getId()); + } + if (error.isPresent()) { + errorLogger.logError("sdf01.id={}", error.get(), sdf01.getId()); + sdf02Imdg.insert(createErrorSdf02(sdf01, error.get(), generationIdForGroup)); + continue; + } + Statement statement = statementImdg.getSingleObjectByFieldValues(Map.of("account", sdf01.getAccount())); + if (statement == null) { + statement = createFlow(sdf01, + company, + validator.getStored(ValidationStored.Account)); + } else { + updateFlow(statement, sdf01, + validator.getStored(ValidationStored.Account)); + } + SDf02 sdf02New = createSuccessSdf02(sdf01, generationIdForGroup); + sdf02Imdg.insert(sdf02New); + statement.setOutSDfId(sdf02New.getId()); + AccountResult accountResult = accountBalanceService.createAccountBalance(statement.getAddresseeId(), statement.getAccountId(), statement.getAmount(), statement.getCashMovementCurrencyCode()); + if (accountResult.getError() != null) { + statement.setErrorCode(accountResult.getError().getSubject().getId().toString()); + statement.setErrorText(errorResolver.resolve(accountResult.getError())); + } else { + accountBalanceImdg.insert(accountResult.getAccount()); //insert == update? + statement.setStatus(OperationStatus.Executed.getKey()); + } + statementImdg.update(statement); + if (accountRequests.size() > 0) { + kafkaReqProducer.sendRequestToQueue(Consts.ACCOUNT_NEW, createAccountsRequest(sdf01.getGenerationId(), accountRequests)); + } + } + ExportToFileRequest exportRequest = new ExportToFileRequest(); + exportRequest.setSdfGroupId(generationIdForGroup); + exportRequest.setNameOfTable("DF-02"); + kafkaReqProducer.sendRequestToQueue(Consts.EXPORT_PROCESS, exportRequest); } - private void createFlow(StatementRequest sdfInfo, Account storedObject) { - + private Statement createFlow(SDf01 sdf01, Company company, Account account) { + Statement statement = new Statement(); + statement.setAddresseeId(company.getId()); + statement.setSenderId(Sender.Prc.getId()); + statement.setCreated(Instant.now()); + statement.setClearingDate(TimeUtil.today()); + statement.setStatementType(StatementType.full.getKey()); + statement.setAccountId(account.getId()); + statement.setAccount(sdf01.getAccount()); + statement.setInOutDirection(InOutDirection.in.getKey()); + statement.setSettlementDate(TimeUtil.localDateToInstant(LocalDate.parse(sdf01.getDat(), datFormatter))); + statement.setAmount(BigDecimalUtil.parse(sdf01.getRemainder())); + statement.setCashMovementCurrencyCode(CurrencyCode.RUB.getKey()); + statement.setStatus(OperationStatus.Pending.getKey()); + statement.setInSDfId(sdf01.getId()); + statement.setInOutSDfType(InOutSDfType.type1.getKey()); + statementImdg.insert(statement); + return statement; } - private AccountNewRequest createAccountRequest(String account) { - AccountNewRequest req = new AccountNewRequest(); + private void updateFlow(Statement statement, SDf01 sdf01, Account account) { + statement.setUpdated(Instant.now()); + statement.setAccountId(account.getId()); + statement.setAccount(sdf01.getAccount()); + statement.setInOutDirection(InOutDirection.in.getKey()); + statement.setSettlementDate(TimeUtil.localDateToInstant(LocalDate.parse(sdf01.getDat(), datFormatter))); + statement.setAmount(BigDecimalUtil.parse(sdf01.getRemainder())); + statement.setCashMovementCurrencyCode(CurrencyCode.RUB.getKey()); + statementImdg.update(statement); + } + + private AccountSdf01RequestPart createAccountRequestPart(Long sdf01Id, String account, Long companyId) { + AccountSdf01RequestPart req = new AccountSdf01RequestPart(); req.setAccount(account); + req.setCompanyId(companyId); + req.setSdf01Id(sdf01Id); return req; } + + private AccountSdf01Request createAccountsRequest(Long sdf01GroupingId, List accountRequests) { + AccountSdf01Request r = new AccountSdf01Request(); + r.setGroupingSdf01Id(sdf01GroupingId); + r.setAccounts(accountRequests); + return r; + } + + private SDf02 createErrorSdf02(SDf01 sdf01, EnumMessage error, Long generationIdForGroup) { + SDf02 sDf02 = new SDf02(); + sDf02.setCurr_code(sdf01.getCurr_code()); + sDf02.setAccount(sdf01.getAccount()); + sDf02.setRemainder(sdf01.getRemainder()); + sDf02.setDeal(sdf01.getDeal()); + sDf02.setAcc_code(sdf01.getAcc_code()); + sDf02.setDat(sdf01.getDat()); + sDf02.setMarket(sdf01.getMarket()); + sDf02.setAcc_name(sdf01.getAcc_name()); + sDf02.setAcc_type(sdf01.getAcc_type()); + sDf02.setSumengage(sdf01.getSumengage()); + sDf02.setSumunblock(sdf01.getSumunblock()); + sDf02.setFile_type(sdf01.getFile_type()); + sDf02.setInSDf01Id(sdf01.getId()); + String errorId = error.getSubject().getId().toString(); + sDf02.setResult(errorId.substring(errorId.length() - 3)); + sDf02.setGenerationId(generationIdForGroup); + sDf02.setGenerationTime(Instant.now()); + return sDf02; + } + + private SDf02 createSuccessSdf02(SDf01 sdf01, Long generationIdForGroup) { + SDf02 sDf02 = new SDf02(); + sDf02.setCurr_code(sdf01.getCurr_code()); + sDf02.setAccount(sdf01.getAccount()); + sDf02.setRemainder(sdf01.getRemainder()); + sDf02.setDeal(sdf01.getDeal()); + sDf02.setAcc_code(sdf01.getAcc_code()); + sDf02.setDat(sdf01.getDat()); + sDf02.setMarket(sdf01.getMarket()); + sDf02.setAcc_name(sdf01.getAcc_name()); + sDf02.setAcc_type(sdf01.getAcc_type()); + sDf02.setSumengage(sdf01.getSumengage()); + sDf02.setSumunblock(sdf01.getSumunblock()); + sDf02.setFile_type(sdf01.getFile_type()); + sDf02.setInSDf01Id(sdf01.getId()); + sDf02.setGenerationId(generationIdForGroup); + sDf02.setGenerationTime(Instant.now()); + sDf02.setResult("OK!"); + return sDf02; + } } diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/AccountBalanceValidation.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/AccountBalanceValidation.java new file mode 100644 index 000000000..5bfbbe358 --- /dev/null +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/AccountBalanceValidation.java @@ -0,0 +1,3 @@ +package ru.spcex.clearing.balance.validation; + +public record AccountBalanceValidation(Long addresseeId, Long accountId) {} diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/AccountBalanceValidationRule.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/AccountBalanceValidationRule.java new file mode 100644 index 000000000..5861ebd63 --- /dev/null +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/AccountBalanceValidationRule.java @@ -0,0 +1,55 @@ +package ru.spcex.clearing.balance.validation; + +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; +import ru.spcex.clearing.balance.errors.BalanceError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.time.format.DateTimeFormatter; +import java.util.Map; +import java.util.Optional; + +public enum AccountBalanceValidationRule implements IValidationRule> { + CompanyPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + AccountBalanceValidation validatedObject = context.getValidatedObject(); + Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + Company company = companyImdg.getSingleObjectByID(validatedObject.addresseeId()); + if (company == null) { + return of( BalanceError.CompanyNotFound); + } + context.storeObject(ValidationStored.Company, company); + return empty(); + } + }, + AccountOk() { + @Override + public Optional validate(ImdgValidationContext context) { + AccountBalanceValidation validatedObject = context.getValidatedObject(); + Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + Account account = accountImdg.getSingleObjectByFieldValues(Map.of("id", validatedObject.accountId(), + "accountType", AccountType.Clrn.getKey())); + if (account == null) { + return of(BalanceError.AccountNotPresent); + } + if (!Status.Active.equalsByKey(account.getStatus())) { + return of(BalanceError.AccountNotActive, account.getId()); + } + context.storeObject(ValidationStored.Account, account); + return empty(); + } + }; + private final static DateTimeFormatter datFormatter = DateTimeFormatter.ofPattern("dd.MM.yy"); + + @Override + public String ruleName() { + return "Sdf01ValidationRule." + name(); + } +} diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf01ValidationRule.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf01ValidationRule.java index b5ed4842f..855184e0e 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf01ValidationRule.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/validation/Sdf01ValidationRule.java @@ -1,20 +1,35 @@ package ru.spcex.clearing.balance.validation; import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.sdf.SDf01; -import ru.spcex.clearing.balance.config.ImdgValidationContext; import ru.spcex.clearing.balance.errors.BalanceError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidationRule; import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.Map; import java.util.Optional; public enum Sdf01ValidationRule implements IValidationRule> { + CompanyPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + SDf01 sdf01 = context.getValidatedObject(); + Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + Company company = companyImdg.getSingleObjectByFieldValues(Map.of("tradingCode", sdf01.getDeal())); + if (company == null) { + return of( BalanceError.CompanyNotFound); + } + context.storeObject(ValidationStored.Company, company); + return empty(); + } + }, AccountPresent() { @Override public Optional validate(ImdgValidationContext context) { @@ -25,7 +40,7 @@ public enum Sdf01ValidationRule implements IValidationRule validate(ImdgValidationContext context) { SDf01 sdf01 = context.getValidatedObject(); //fixme string format??? - if (!LocalDate.now().toString().equals(sdf01.getDat())) { + if (!LocalDate.now().equals(LocalDate.parse(sdf01.getDat(), datFormatter))) { return of(BalanceError.CurrentDateOnly); } return empty(); @@ -70,6 +85,8 @@ public enum Sdf01ValidationRule implements IValidationRule * DB table: S_DF13 **/ public class SDf13 extends SpcexObjectBase { @@ -44,6 +43,7 @@ public class SDf13 extends SpcexObjectBase { private String sc_code; private String acc_deb; private String rclientn1; + private String inn_cred; private String kpp_cred; private String rclientn4; private String acc_kr_1; @@ -301,6 +301,14 @@ public class SDf13 extends SpcexObjectBase { this.rclientn1 = rclientn1; } + public String getInn_cred() { + return inn_cred; + } + + public void setInn_cred(String inn_cred) { + this.inn_cred = inn_cred; + } + public String getKpp_cred() { return kpp_cred; } diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf16.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf16.java index e1c291584..755552aca 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf16.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf16.java @@ -7,14 +7,13 @@ import java.math.BigDecimal; import java.time.Instant; /** - * ДФ 16 - Ответ КС на запрос на дозачисление/списание денежных средств + * ДФ-16 Формат запроса по возврату депозита или дозачисление/списание денежных средств *

* DB table: S_DF16 **/ public class SDf16 extends SpcexObjectBase { private static final long serialVersionUID = ConstSerializable.serialVersionUID; - private Instant date; private String account; private BigDecimal sum; private String market; @@ -23,19 +22,10 @@ public class SDf16 extends SpcexObjectBase { private BigDecimal BIC; private String SPEC; private BigDecimal number; - private String resultCode; private String fileName; private Instant generationTime; private Long generationId; - public Instant getDate() { - return date; - } - - public void setDate(Instant value) { - this.date = value; - } - public String getAccount() { return account; } @@ -100,14 +90,6 @@ public class SDf16 extends SpcexObjectBase { this.number = value; } - public String getResultCode() { - return resultCode; - } - - public void setResultCode(String value) { - this.resultCode = value; - } - public String getFileName() { return fileName; } diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf17.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf17.java index e952baa38..39a18eb66 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf17.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf17.java @@ -8,7 +8,7 @@ import java.time.Instant; /** * ДФ-17 Формат ответа на запрос по возврату депозита или дозачисление/списание денежных средств - * + *

* DB table: S_DF17 **/ public class SDf17 extends SpcexObjectBase { @@ -22,105 +22,105 @@ public class SDf17 extends SpcexObjectBase { private BigDecimal BIC; private String SPEC; private BigDecimal number; - private String result; + private BigDecimal result; private Instant generationTime; private Long generationId; - private Long in_s_df16_id; - + private Long inSDf16Id; public String getAccount() { return account; } - public void setAccount(String account) { - this.account = account; + public void setAccount(String value) { + this.account = value; } public BigDecimal getSum() { return sum; } - public void setSum(BigDecimal sum) { - this.sum = sum; + public void setSum(BigDecimal value) { + this.sum = value; } public String getMarket() { return market; } - public void setMarket(String market) { - this.market = market; + public void setMarket(String value) { + this.market = value; } public String getType() { return type; } - public void setType(String type) { - this.type = type; + public void setType(String value) { + this.type = value; } public BigDecimal getINN() { return INN; } - public void setINN(BigDecimal INN) { - this.INN = INN; + public void setINN(BigDecimal value) { + this.INN = value; } public BigDecimal getBIC() { return BIC; } - public void setBIC(BigDecimal BIC) { - this.BIC = BIC; + public void setBIC(BigDecimal value) { + this.BIC = value; } public String getSPEC() { return SPEC; } - public void setSPEC(String SPEC) { - this.SPEC = SPEC; + public void setSPEC(String value) { + this.SPEC = value; } public BigDecimal getNumber() { return number; } - public void setNumber(BigDecimal number) { - this.number = number; + public void setNumber(BigDecimal value) { + this.number = value; } - public String getResult() { + public BigDecimal getResult() { return result; } - public void setResult(String result) { - this.result = result; + public void setResult(BigDecimal value) { + this.result = value; } public Instant getGenerationTime() { return generationTime; } - public void setGenerationTime(Instant generationTime) { - this.generationTime = generationTime; + public void setGenerationTime(Instant value) { + this.generationTime = value; } public Long getGenerationId() { return generationId; } - public void setGenerationId(Long generationId) { - this.generationId = generationId; + public void setGenerationId(Long value) { + this.generationId = value; } - public Long getIn_s_df16_id() { - return in_s_df16_id; + public Long getInSDf16Id() { + return inSDf16Id; } - public void setIn_s_df16_id(Long in_s_df16_id) { - this.in_s_df16_id = in_s_df16_id; + public void setInSDf16Id(Long value) { + this.inSDf16Id = value; } + } \ No newline at end of file diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf18.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf18.java index 3bd48ccdf..c388f3c4b 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf18.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf18.java @@ -16,7 +16,7 @@ public class SDf18 extends SpcexObjectBase { private String account; private String deal; - private BigDecimal status; + private Long status; private BigDecimal result; private Instant generationTime; private Long generationId; @@ -38,11 +38,11 @@ public class SDf18 extends SpcexObjectBase { this.deal = value; } - public BigDecimal getStatus() { + public Long getStatus() { return status; } - public void setStatus(BigDecimal value) { + public void setStatus(Long value) { this.status = value; } diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/KafkaConfig.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/KafkaConfig.java index 5815678c4..6ce4bca40 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/KafkaConfig.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/KafkaConfig.java @@ -14,7 +14,7 @@ public class KafkaConfig { @Autowired @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Bean - public Consumer createProducer(CompanyServiceSettings settings) { + public Consumer createConsumer(CompanyServiceSettings settings) { return KafkaConsumerFactory.consumer(settings.getKafka()); } } diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyInfoService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyInfoService.java index 72b9437e3..85775c9bb 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyInfoService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyInfoService.java @@ -6,6 +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.statics.data.company.Company; import ru.clearing.classes.statics.data.profile.CompanyInfo; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; @@ -18,13 +19,15 @@ 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 companyInfoMap; +// private final Imdg companyInfoMap; + private final Imdg companyMap; @Autowired public CompanyInfoService(Consumer kafkaQueue, ImdgProvider imdgProvider) { super(kafkaQueue); - this.companyInfoMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, CompanyInfo.class); +// this.companyInfoMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanyInfo, CompanyInfo.class); + this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); } @Override @@ -38,7 +41,9 @@ public class CompanyInfoService extends QueueConsumer implements InitializingBea public void companyInfoUpdate(BaseRequest userRequest) { CompanyInfoUpdateRequest req = userRequest.getRequestPayload(); log.debug("CompanyInfoUpdateRequest received"); - CompanyInfo companyInfo = companyInfoMap.getSingleObjectByID(req.getId()); +// CompanyInfo companyInfo = companyInfoMap.getSingleObjectByID(req.getId()); + Company company = companyMap.getSingleObjectByID(req.getId()); + CompanyInfo companyInfo = company == null ? null : company.getProfile(); companyInfo.setCorporationSoleType(req.getCorporationSoleType()); companyInfo.setCountryCode(req.getCountryCode()); @@ -51,7 +56,8 @@ public class CompanyInfoService extends QueueConsumer implements InitializingBea companyInfo.setFullNameEng(req.getFullNameEng()); companyInfo.setShortName(req.getShortName()); companyInfo.setFullName(req.getFullName()); - companyInfoMap.update(companyInfo); +// companyInfoMap.update(companyInfo); + companyMap.update(company); log.debug("successfully processed, id {}", companyInfo.getId()); } } diff --git a/clearing-parent/company-service/src/main/resources/application.properties b/clearing-parent/company-service/src/main/resources/application.properties index 2d6a2cfe0..292578a7e 100644 --- a/clearing-parent/company-service/src/main/resources/application.properties +++ b/clearing-parent/company-service/src/main/resources/application.properties @@ -1,10 +1,10 @@ spring.main.web-application-type=none -company-service.hazelcast.cluster-members=127.0.0.1 +company-service.hazelcast.cluster-members=127.0.0.1:5701 company-service.hazelcast.login=dev company-service.hazelcast.password=dev-pass company-service.kafka.bootstrap-servers=localhost:9092 -company-service.kafka.group-id=dev-group -company-service.kafka.enable-auto-commit=false +company-service.kafka.group-id=dev-group-company-service +company-service.kafka.enable-auto-commit=true company-service.kafka.session-timeout-ms=30000 company-service.kafka.auto-offset-reset=latest company-service.kafka.linger-ms=1 diff --git a/clearing-parent/db-scripts/src/main/resources/db/DATA.sql b/clearing-parent/db-scripts/src/main/resources/db/DATA.sql index 311bd602b..47425d6e6 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/DATA.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/DATA.sql @@ -2,13 +2,7 @@ -- DATA version: 0.0.0.0 /* Dictionaries */ -INSERT INTO COURIER_TYPE_DICTIONARY(ID, CODE, NAME) values (1, 'POST', 'Почтой'); - -INSERT INTO COURIER_TYPE_DICTIONARY(ID, CODE, NAME) values (2, 'CAB', 'Личный кабинет с ЭЦП'); - -INSERT INTO COURIER_TYPE_DICTIONARY(ID, CODE, NAME) values (3, 'ORIG', 'Оригинал на бумаге'); - -INSERT INTO COURIER_TYPE_DICTIONARY(ID, CODE, NAME) values (3, 'STHS', 'Модуль обмена с Расчетной Организацией'); +INSERT INTO COURIER_TYPE_DICTIONARY(ID, CODE, NAME) values (1, 'STHS', 'ЭДО с Расчетной Организацией'); INSERT INTO TERM_TYPE_DICTIONARY(ID, CODE, NAME) values (1, 'S', 'Срочный'); @@ -18,12 +12,24 @@ INSERT INTO TERM_TYPE_DICTIONARY(ID, CODE, NAME) values (3, 'V', 'До вост INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (1, 'GBAL', 'Зачисление остатков'); -INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (2, '', ''); +INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (2, 'GBLC', 'Подтверждение зачисления остатков'); INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (3, 'ABLK', 'Блокировка счета'); INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (4, 'GALB', 'Запрос остатков по всем счетам'); +INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (5, 'ADBL', 'Дозачисление/списание остатков'); + +INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (6, 'ADBC', 'Подтверждение дозачисления/списания остатков'); + +INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (7, 'CORD', 'Формирование сводного платежного поручения'); + +INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (8, 'CORC', 'Получение подтверждения переводов'); + +INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (34, 'GBLD', 'Поступление средств'); + +INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (35, 'GBDC', 'Подтверждение поступления средств'); + INSERT INTO TASK_STATUS_DICTIONARY(ID, CODE, NAME) values (1, 'ACTV', 'Активна'); INSERT INTO TASK_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'BLKD', 'Не активна'); @@ -34,6 +40,14 @@ INSERT INTO TRADING_STATUS_DICTIONARY(ID, CODE, NAME) values (1, 'TRAD', 'Тор INSERT INTO TRADING_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'NTRD', 'Неторговый'); +INSERT INTO TRANSACTION_STATUS_DICTIONARY(ID, CODE, NAME) values (1, 'STLD', 'Рассчитан'); + +INSERT INTO TRANSACTION_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'SENT', 'Отправлен в ПРЦ'); + +INSERT INTO TRANSACTION_STATUS_DICTIONARY(ID, CODE, NAME) values (3, 'OK', 'Обработан ПРЦ'); + +INSERT INTO TRANSACTION_STATUS_DICTIONARY(ID, CODE, NAME) values (4, 'FAIL', 'Ошибка ПРЦ'); + INSERT INTO SOURCE_DICTIONARY(ID, CODE, NAME) values (1, 'TIMT', 'Расписание'); INSERT INTO SOURCE_DICTIONARY(ID, CODE, NAME) values (2, 'SCHD', 'Планировщик'); @@ -62,9 +76,11 @@ INSERT INTO WORKFLOW_STATUS_DICTIONARY(ID, CODE, NAME) values (1, 'ACTV', 'Ак INSERT INTO WORKFLOW_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'BLKD', 'Не активен'); -INSERT INTO MONEY_FLOW_SIDE_DICTIONARY(ID, CODE, NAME) values (1, 'SELL', 'Привлечь'); +INSERT INTO ACCOUNT_STATUS_DICTIONARY(ID, CODE, NAME) values (1, 'ACTV', 'Активен'); -INSERT INTO MONEY_FLOW_SIDE_DICTIONARY(ID, CODE, NAME) values (2, 'BUY', 'Разместить'); +INSERT INTO ACCOUNT_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'BLKD', 'Заблокирован'); + +INSERT INTO ACCOUNT_STATUS_DICTIONARY(ID, CODE, NAME) values (3, 'CLOS', 'Закрыт'); INSERT INTO BALANCE_ACCOUNT_TYPE_DICTIONARY(ID, CODE, NAME) values (1, 'ACNT', 'Остатки по счетам'); @@ -88,7 +104,7 @@ INSERT INTO SERVICE_STATUS_DICTIONARY(ID, CODE, NAME) values (3, 'SSPD', 'При INSERT INTO SERVICE_STATUS_DICTIONARY(ID, CODE, NAME) values (4, 'CLOS', 'Закрыт'); -INSERT INTO SERVICE_STATUS_DICTIONARY(ID, CODE, NAME) values (4, 'ROPN', 'Возобновлен'); +INSERT INTO SERVICE_STATUS_DICTIONARY(ID, CODE, NAME) values (5, 'ROPN', 'Возобновлен'); INSERT INTO STATEMENT_TYPE_DICTIONARY(ID, CODE, NAME) values (1, 'FULL', 'Установка суммы'); @@ -108,21 +124,23 @@ INSERT INTO SERVICE_DICTIONARY(ID, CODE, NAME) values (1, 'MKR', 'Денежны INSERT INTO SERVICE_PRODUCT_DICTIONARY(ID, CODE, NAME) values (1, 'PRNT', 'Расчет обязательств с процентом'); -INSERT INTO SERVICE_PRODUCT_DICTIONARY(ID, CODE, NAME) values (2, 'ZERO', 'Расчет обязательств без процента'); +INSERT INTO SERVICE_PRODUCT_DICTIONARY(ID, CODE, NAME) values (2, 'ZERO', 'Расчет обязательств без процента (по умолчанию)'); -INSERT INTO CLEARING_CATEGORY_DICTIONARY(ID, CODE, NAME) values (1, 'C', 'Категория «Ц» - Банк России'); +INSERT INTO SECTOR_DICTIONARY(ID, CODE, NAME) values (1, 'MKR', 'Секция Денежного рынка МКР'); -INSERT INTO CLEARING_CATEGORY_DICTIONARY(ID, CODE, NAME) values (2, 'B', 'Категория «Б» - Кредитная организация ДР'); +INSERT INTO CLEARING_MEMBER_CATEGORY_DICTIONARY(ID, CODE, NAME) values (1, 'C', 'Категория «Ц» - Банк России'); -INSERT INTO CLEARING_CATEGORY_DICTIONARY(ID, CODE, NAME) values (3, 'F', 'Категория «Ф» - Участник рынка РЦБ'); +INSERT INTO CLEARING_MEMBER_CATEGORY_DICTIONARY(ID, CODE, NAME) values (2, 'B', 'Категория «Б» - Кредитная организация ДР'); -INSERT INTO CLEARING_CATEGORY_DICTIONARY(ID, CODE, NAME) values (4, 'I', 'Категория «И» - Инициатор по ТБС'); +INSERT INTO CLEARING_MEMBER_CATEGORY_DICTIONARY(ID, CODE, NAME) values (3, 'F', 'Категория «Ф» - Участник рынка РЦБ'); -INSERT INTO CLEARING_CATEGORY_DICTIONARY(ID, CODE, NAME) values (5, 'V', 'Категория «В» - Инициатор по ТКС'); +INSERT INTO CLEARING_MEMBER_CATEGORY_DICTIONARY(ID, CODE, NAME) values (4, 'I', 'Категория «И» - Инициатор по ТБС'); -INSERT INTO CLEARING_CATEGORY_DICTIONARY(ID, CODE, NAME) values (6, 'T', 'Категория «Т» - Участник товарного рынка'); +INSERT INTO CLEARING_MEMBER_CATEGORY_DICTIONARY(ID, CODE, NAME) values (5, 'V', 'Категория «В» - Инициатор по ТКС'); -INSERT INTO CLEARING_CATEGORY_DICTIONARY(ID, CODE, NAME) values (7, 'K', 'Категория «К» - Участник клиринга - Контроллер'); +INSERT INTO CLEARING_MEMBER_CATEGORY_DICTIONARY(ID, CODE, NAME) values (6, 'T', 'Категория «Т» - Участник товарного рынка'); + +INSERT INTO CLEARING_MEMBER_CATEGORY_DICTIONARY(ID, CODE, NAME) values (7, 'K', 'Категория «К» - Участник клиринга - Контроллер'); INSERT INTO MANAGEMENT_JOURNAL_TYPE_DICTIONARY(ID, CODE, NAME) values (1, 'CRPA', 'Корпоративное событие, связанное с допуском'); @@ -268,147 +286,187 @@ INSERT INTO RESULT_STATUS_DICTIONARY(ID, CODE, NAME) values (1, 'NACK', 'Неу INSERT INTO RESULT_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'ACK', 'Успешно'); -INSERT INTO IN_OUT_S_DF_TYPE_DICTIONARY(ID, CODE, NAME) values (1, '0102', 'Входящий DF-01/Исходящий DF-02'); +INSERT INTO IN_OUT_S_DF_TYPE_DICTIONARY(ID, CODE, NAME) values (1, '0102', 'Входящий ДФ-01/Исходящий ДФ-02'); + +INSERT INTO IN_OUT_S_DF_TYPE_DICTIONARY(ID, CODE, NAME) values (2, '1617', 'Входящий ДФ-16/Исходящий ДФ-17'); + +INSERT INTO IN_OUT_S_DF_TYPE_DICTIONARY(ID, CODE, NAME) values (3, '0910', 'Входящий ДФ-09/Исходящий ДФ-10'); + +INSERT INTO SESSION_STATUS_DICTIONARY(ID, CODE, NAME) values (1, 'ACTV', 'Сессия активна'); + +INSERT INTO SESSION_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'CLRN', 'Идет клиринг'); + +INSERT INTO OBJECT_TYPE_DICTIONARY(ID, CODE, NAME) values (1, 'STMT', 'STATEMENT'); + +INSERT INTO NOTIFICATION_STATUS_DICTIONARY(ID, CODE, NAME) values (1, 'ACPT', 'Принято'); + +INSERT INTO NOTIFICATION_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'CNCL', 'Отменено'); INSERT INTO CURRENCY_CODE_DICTIONARY(ID, CODE, NAME) values (643, 'RUB', 'Российский рубль'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1000, '1 000', 'Общая ошибка модуля securities_services.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1000, '1000', 'Общая ошибка модуля securities_services.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1001, '1 001', 'Нет прав на проведение данной операции.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1001, '1001', 'Нет прав на проведение данной операции.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1002, '1 002', 'Не заданы обязательные поля.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1002, '1002', 'Не заданы обязательные поля.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1003, '1 003', 'Запись с указанным идентификатором в справочнике %s не найдена.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1003, '1003', 'Запись с указанным идентификатором в справочнике %s не найдена.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1004, '1 004', 'Неверное значение поля %s.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1004, '1004', 'Неверное значение поля %s.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1005, '1 005', 'Такая запись уже существует.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1005, '1005', 'Такая запись уже существует.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1006, '1 006', 'Запись не найдена.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1006, '1006', 'Запись не найдена.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1007, '1 007', 'Пользователь не найден.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1007, '1007', 'Пользователь не найден.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1008, '1 008', 'Пользователь неактивен.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1008, '1008', 'Пользователь неактивен.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1010, '1 010', 'Такой Инструмент уже существует.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1010, '1010', 'Такой Инструмент уже существует.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1011, '1 011', 'Инструмент не найден.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1011, '1011', 'Инструмент не найден.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1012, '1 012', 'Инструмент неактивен.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (1012, '1012', 'Инструмент неактивен.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (2000, '2 000', 'Общая ошибка модуля utility_service'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (2000, '2000', 'Общая ошибка модуля utility_service'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (2001, '2 001', 'Нет прав на проведение данной операции.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (2001, '2001', 'Нет прав на проведение данной операции.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (2002, '2 002', 'Не заданы обязательные поля.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (2002, '2002', 'Не заданы обязательные поля.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (2003, '2 003', 'Запись с указанным идентификатором в справочнике %s не найдена.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (2003, '2003', 'Запись с указанным идентификатором в справочнике %s не найдена.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (2004, '2 004', 'Неверное значение поля %s.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (2004, '2004', 'Неверное значение поля %s.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (2005, '2 005', 'Такая запись уже существует.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (2005, '2005', 'Такая запись уже существует.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (2006, '2 006', 'Запись не найдена.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (2006, '2006', 'Запись не найдена.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3000, '3 000', 'Общая ошибка модуля company_services'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3000, '3000', 'Общая ошибка модуля company_services'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3001, '3 001', 'Нет прав на проведение данной операции.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3001, '3001', 'Нет прав на проведение данной операции.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3002, '3 002', 'Не заданы обязательные поля.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3002, '3002', 'Не заданы обязательные поля.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3003, '3 003', 'Запись с указанным идентификатором в справочнике %s не найдена.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3003, '3003', 'Запись с указанным идентификатором в справочнике %s не найдена.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3004, '3 004', 'Неверное значение поля %s.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3004, '3004', 'Неверное значение поля %s.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3005, '3 005', 'Такая запись уже существует.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3005, '3005', 'Такая запись уже существует.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3006, '3 006', 'Запись не найдена.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3006, '3006', 'Запись не найдена.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3010, '3 010', 'Такая Компания уже существует'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3010, '3010', 'Такая Компания уже существует'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3011, '3 011', 'Компания не найдена.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3011, '3011', 'Компания не найдена.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3012, '3 012', 'Компания неактивна.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3012, '3012', 'Компания неактивна.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3013, '3 013', 'Профиль Компании не найден.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3013, '3013', 'Профиль Компании не найден.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3014, '3 014', 'Реквизит Компании не найден.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3014, '3014', 'Реквизит Компании не найден.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3015, '3 015', 'Контакт Компании не найден.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3015, '3015', 'Контакт Компании не найден.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3016, '3 016', 'Категория Компании не найдена.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3016, '3016', 'Категория Компании не найдена.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3017, '3 017', 'Компании уже присвоена Категория %s.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (3017, '3017', 'Компании уже присвоена Категория %s.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (4000, '4 000', 'Общая ошибка модуля report_serivces'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (4000, '4000', 'Общая ошибка модуля report_serivces'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5000, '5 000', 'Общая ошибка модуля account_services'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5000, '5000', 'Общая ошибка модуля account_services'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5001, '5 001', 'Нет прав на проведение данной операции.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5001, '5001', 'Нет прав на проведение данной операции.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5002, '5 002', 'Не заданы обязательные поля.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5002, '5002', 'Не заданы обязательные поля.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5003, '5 003', 'Запись с указанным идентификатором в справочнике %s не найдена.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5003, '5003', 'Запись с указанным идентификатором в справочнике %s не найдена.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5004, '5 004', 'Неверное значение поля %s.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5004, '5004', 'Неверное значение поля %s.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5005, '5 005', 'Такая запись уже существует.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5005, '5005', 'Такая запись уже существует.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5006, '5 006', 'Запись не найдена.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5006, '5006', 'Запись не найдена.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5010, '5 010', 'Счет %s уже существует.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5010, '5010', 'Счет %s уже существует.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5011, '5 011', 'Счет %s не найден.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5011, '5011', 'Счет %s не найден.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5012, '5 012', 'Счет %s неактивен.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5012, '5012', 'Счет %s неактивен.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5200, '5 200', 'Общая ошибка модуля balance_services'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5013, '5013', 'Компания не найдена.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5211, '5 211', 'Компания не найдена.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5014, '5014', 'Компания неактивна.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5212, '5 212', 'Компания неактивна.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5200, '5200', 'Общая ошибка модуля balance_services'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5213, '5 213', 'Валюта не найдена.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5210, '5210', 'Клиринговая сессия неактивна.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5214, '5 214', 'Загрузка остатков возможна только на текущую дату.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5211, '5211', 'Компания не найдена.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5215, '5 215', 'Загрузка остатков возможна только по рынку МКР.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5212, '5212', 'Компания неактивна.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5216, '5 216', 'Загрузка остатков возможна только по собственным счетам.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5213, '5213', 'Валюта не найдена.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5217, '5 217', 'Счет %s не найден.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5214, '5214', 'Загрузка остатков возможна только на текущую дату.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5218, '5 218', 'Счет %s неактивен.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5215, '5215', 'Загрузка остатков возможна только по рынку МКР.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5400, '5 400', 'Общая ошибка модуля проведения расчетов'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5216, '5216', 'Загрузка остатков возможна только по собственным счетам.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5600, '5 600', 'Общая ошибка модуля dbf-loader'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5217, '5217', 'Счет %s не найден.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5800, '5 800', 'Общая ошибка модуля dbf-export'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5218, '5218', 'Счет %s неактивен.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (6000, '6 000', 'Общая ошибка модуля api-lk-company'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5219, '5219', 'Дозачисления/списания возможны только по рынку МКР.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7000, '7 000', 'Общая ошибка модуля scheduler_service'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5220, '5220', 'Сумма списания превышает сумму средств на счете.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7001, '7 001', 'Нет прав на проведение данной операции.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5221, '5221', 'Поступление средств возможно только по рынку МКР.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7002, '7 002', 'Не заданы обязательные поля.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5400, '5400', 'Общая ошибка модуля проведения расчетов'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7003, '7 003', 'Запись с указанным идентификатором в справочнике %s не найдена.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5600, '5600', 'Общая ошибка модуля dbf-loader'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7004, '7 004', 'Неверное значение поля %s.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5800, '5800', 'Общая ошибка модуля dbf-export'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7005, '7 005', 'Такая запись уже существует.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (6000, '6000', 'Общая ошибка модуля api-lk-company'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7006, '7 006', 'Запись не найдена.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7000, '7000', 'Общая ошибка модуля scheduler_service'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7010, '7 010', 'Невозможно добавить задачу на прошедшую дату.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7001, '7001', 'Нет прав на проведение данной операции.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7011, '7 011', 'Невозможно добавить задачу на прошедшее время.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7002, '7002', 'Не заданы обязательные поля.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7012, '7 012', 'Указанный в задаче нструмент не найден.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7003, '7003', 'Запись с указанным идентификатором в справочнике %s не найдена.'); -INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7013, '7 013', 'Указанный инструмент неактивен.'); +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7004, '7004', 'Неверное значение поля %s.'); + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7005, '7005', 'Такая запись уже существует.'); + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7006, '7006', 'Запись не найдена.'); + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7010, '7010', 'Невозможно добавить задачу на прошедшую дату.'); + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7011, '7011', 'Невозможно добавить задачу на прошедшее время.'); + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7012, '7012', 'Указанный в задаче нструмент не найден.'); + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (7013, '7013', 'Указанный инструмент неактивен.'); + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (8000, '8000', 'Общая ошибка модуля utility_service'); + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (8001, '8001', 'Нет прав на проведение данной операции.'); + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (8002, '8002', 'Не заданы обязательные поля.'); + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (8003, '8003', 'Запись с указанным идентификатором в справочнике %s не найдена.'); + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (8004, '8004', 'Неверное значение поля %s.'); + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (8005, '8005', 'Такая запись уже существует.'); + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (8006, '8006', 'Запись не найдена.'); /* Business objects */ diff --git a/clearing-parent/db-scripts/src/main/resources/db/DDL.sql b/clearing-parent/db-scripts/src/main/resources/db/DDL.sql index 24c27681f..e4588f8ce 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/DDL.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/DDL.sql @@ -81,6 +81,16 @@ COMMENT ON COLUMN TRADING_STATUS_DICTIONARY.CODE IS 'Код'; COMMENT ON COLUMN TRADING_STATUS_DICTIONARY.NAME IS 'Торговый статус'; +-- transactionStatus - Справочник статусов транзакций +CREATE TABLE IF NOT EXISTS TRANSACTION_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE char(4), NAME varchar(50)); +COMMENT ON TABLE TRANSACTION_STATUS_DICTIONARY IS 'Справочник статусов транзакций'; + +COMMENT ON COLUMN TRANSACTION_STATUS_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN TRANSACTION_STATUS_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN TRANSACTION_STATUS_DICTIONARY.NAME IS 'Статус транзакции'; + -- source - Справочник источников CREATE TABLE IF NOT EXISTS SOURCE_DICTIONARY(ID bigint PRIMARY KEY, CODE char(4), NAME varchar(50)); COMMENT ON TABLE SOURCE_DICTIONARY IS 'Справочник источников'; @@ -201,15 +211,15 @@ COMMENT ON COLUMN COUNTRY_CODE_DICTIONARY.CODE IS 'Код'; COMMENT ON COLUMN COUNTRY_CODE_DICTIONARY.NAME IS 'Наименование'; --- clearingCategory - Справочник категорий участника клиринга -CREATE TABLE IF NOT EXISTS CLEARING_CATEGORY_DICTIONARY(ID bigint PRIMARY KEY, CODE char(4), NAME varchar(255)); -COMMENT ON TABLE CLEARING_CATEGORY_DICTIONARY IS 'Справочник категорий участника клиринга'; +-- clearingMemberCategory - Справочник категорий участника клиринга +CREATE TABLE IF NOT EXISTS CLEARING_MEMBER_CATEGORY_DICTIONARY(ID bigint PRIMARY KEY, CODE char(4), NAME varchar(255)); +COMMENT ON TABLE CLEARING_MEMBER_CATEGORY_DICTIONARY IS 'Справочник категорий участника клиринга'; -COMMENT ON COLUMN CLEARING_CATEGORY_DICTIONARY.ID IS 'Идентификатор записи'; +COMMENT ON COLUMN CLEARING_MEMBER_CATEGORY_DICTIONARY.ID IS 'Идентификатор записи'; -COMMENT ON COLUMN CLEARING_CATEGORY_DICTIONARY.CODE IS 'Код'; +COMMENT ON COLUMN CLEARING_MEMBER_CATEGORY_DICTIONARY.CODE IS 'Код'; -COMMENT ON COLUMN CLEARING_CATEGORY_DICTIONARY.NAME IS 'Наименование'; +COMMENT ON COLUMN CLEARING_MEMBER_CATEGORY_DICTIONARY.NAME IS 'Наименование'; -- contactType - Справочник типов контактов Компании CREATE TABLE IF NOT EXISTS CONTACT_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE char(4), NAME varchar(255)); @@ -433,35 +443,65 @@ COMMENT ON COLUMN IN_OUT_S_DF_TYPE_DICTIONARY.CODE IS 'Код'; COMMENT ON COLUMN IN_OUT_S_DF_TYPE_DICTIONARY.NAME IS 'Тип записи'; +-- sessionStatus - Справочник статусов клиринговой сессии +CREATE TABLE IF NOT EXISTS SESSION_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE char(4), NAME varchar(50)); +COMMENT ON TABLE SESSION_STATUS_DICTIONARY IS 'Справочник статусов клиринговой сессии'; + +COMMENT ON COLUMN SESSION_STATUS_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN SESSION_STATUS_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN SESSION_STATUS_DICTIONARY.NAME IS 'Наименование'; + +-- objectType - Справочник типов объектов +CREATE TABLE IF NOT EXISTS OBJECT_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE char(4), NAME varchar(50)); +COMMENT ON TABLE OBJECT_TYPE_DICTIONARY IS 'Справочник типов объектов'; + +COMMENT ON COLUMN OBJECT_TYPE_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN OBJECT_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN OBJECT_TYPE_DICTIONARY.NAME IS 'Наименование'; + +-- notificationStatus - Справочник статусов сообщений +CREATE TABLE IF NOT EXISTS NOTIFICATION_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE char(4), NAME varchar(50)); +COMMENT ON TABLE NOTIFICATION_STATUS_DICTIONARY IS 'Справочник статусов сообщений'; + +COMMENT ON COLUMN NOTIFICATION_STATUS_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN NOTIFICATION_STATUS_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN NOTIFICATION_STATUS_DICTIONARY.NAME IS 'Наименование'; + /* Business objects */ --- user - Пользователь -CREATE TABLE IF NOT EXISTS USER_CLR(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, IDENTIFIER varchar(250)); -COMMENT ON TABLE USER_CLR IS 'Пользователь'; +-- userCls - Пользователь +CREATE TABLE IF NOT EXISTS USER_CLS(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, IDENTIFIER varchar(250)); +COMMENT ON TABLE USER_CLS IS 'Пользователь'; -COMMENT ON COLUMN USER_CLR.ID IS 'Идентификатор'; +COMMENT ON COLUMN USER_CLS.ID IS 'Идентификатор'; -COMMENT ON COLUMN USER_CLR.CREATED_AT IS 'Создано'; +COMMENT ON COLUMN USER_CLS.CREATED_AT IS 'Создано'; -COMMENT ON COLUMN USER_CLR.UPDATED_AT IS 'Изменено'; +COMMENT ON COLUMN USER_CLS.UPDATED_AT IS 'Изменено'; -COMMENT ON COLUMN USER_CLR.IDENTIFIER IS 'Внешний идентификатор'; +COMMENT ON COLUMN USER_CLS.IDENTIFIER IS 'Внешний идентификатор'; --- History log of user - Пользователь -CREATE TABLE IF NOT EXISTS USER_CLR_HISTORY(USER_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, IDENTIFIER varchar(250)); -COMMENT ON TABLE USER_CLR_HISTORY IS 'История изменений таблицы user'; -COMMENT ON COLUMN USER_CLR_HISTORY.USER_ID IS 'Идентификатор записи в таблице USER'; -COMMENT ON COLUMN USER_CLR_HISTORY.EVENT_TIME IS 'Дата и время изменения'; -COMMENT ON COLUMN USER_CLR_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +-- History log of userCls - Пользователь +CREATE TABLE IF NOT EXISTS USER_CLS_HISTORY(USER_CLS_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, IDENTIFIER varchar(250)); +COMMENT ON TABLE USER_CLS_HISTORY IS 'История изменений таблицы userCls'; +COMMENT ON COLUMN USER_CLS_HISTORY.USER_CLS_ID IS 'Идентификатор записи в таблице USER_CLS'; +COMMENT ON COLUMN USER_CLS_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN USER_CLS_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; -COMMENT ON COLUMN USER_CLR_HISTORY.ID IS 'Идентификатор'; +COMMENT ON COLUMN USER_CLS_HISTORY.ID IS 'Идентификатор'; -COMMENT ON COLUMN USER_CLR_HISTORY.CREATED_AT IS 'Создано'; +COMMENT ON COLUMN USER_CLS_HISTORY.CREATED_AT IS 'Создано'; -COMMENT ON COLUMN USER_CLR_HISTORY.UPDATED_AT IS 'Изменено'; +COMMENT ON COLUMN USER_CLS_HISTORY.UPDATED_AT IS 'Изменено'; -COMMENT ON COLUMN USER_CLR_HISTORY.IDENTIFIER IS 'Внешний идентификатор'; +COMMENT ON COLUMN USER_CLS_HISTORY.IDENTIFIER IS 'Внешний идентификатор'; -- userRoleSession - Набор ролей CREATE TABLE IF NOT EXISTS USER_ROLE_SESSION(ID bigint PRIMARY KEY, USER_ID bigint, USER_ROLE char(4), COMPANY_ID bigint, STATUS char(4)); @@ -469,7 +509,7 @@ COMMENT ON TABLE USER_ROLE_SESSION IS 'Набор ролей'; COMMENT ON COLUMN USER_ROLE_SESSION.ID IS 'Идентификатор записи'; -COMMENT ON COLUMN USER_ROLE_SESSION.USER_ID IS 'Идентификатор пользователя (linked to user)'; +COMMENT ON COLUMN USER_ROLE_SESSION.USER_ID IS 'Идентификатор пользователя (linked to userCls)'; COMMENT ON COLUMN USER_ROLE_SESSION.USER_ROLE IS 'Идентификатор роли (linked to userRole)'; @@ -483,14 +523,14 @@ COMMENT ON TABLE USER_SETTINGS IS 'Настройки пользователя'; COMMENT ON COLUMN USER_SETTINGS.ID IS 'Идентификатор'; -COMMENT ON COLUMN USER_SETTINGS.USER_ID IS 'Пользователь (linked to user)'; +COMMENT ON COLUMN USER_SETTINGS.USER_ID IS 'Пользователь (linked to userCls)'; COMMENT ON COLUMN USER_SETTINGS.VERSION IS 'Версия настроек пользователя'; COMMENT ON COLUMN USER_SETTINGS.JSON IS 'Данные конфигурации'; -- userConnect - Активность пользователей в системе -CREATE TABLE IF NOT EXISTS USER_CONNECT(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, USER_ID bigint, CONNECTION_TIME timestamp, DISCONNECTION_TIME timestamp, SERVER_I_P varchar(250), CLIENT_I_P varchar(250), CONNECTION_STATE char(4), CLEARING_DATE date, ERROR_CODE char(4), ERROR_TEXT char(4)); +CREATE TABLE IF NOT EXISTS USER_CONNECT(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, USER_ID bigint, CONNECTION_TIME timestamp, DISCONNECTION_TIME timestamp, SERVER_I_P varchar(250), CLIENT_I_P varchar(250), CONNECTION_STATE char(4), CLEARING_DATE date, ERROR_CODE bigint, ERROR_TEXT char(4)); COMMENT ON TABLE USER_CONNECT IS 'Активность пользователей в системе'; COMMENT ON COLUMN USER_CONNECT.ID IS 'Идентификатор'; @@ -499,7 +539,7 @@ COMMENT ON COLUMN USER_CONNECT.CREATED_AT IS 'Создано'; COMMENT ON COLUMN USER_CONNECT.UPDATED_AT IS 'Изменено'; -COMMENT ON COLUMN USER_CONNECT.USER_ID IS 'Пользователь (linked to user)'; +COMMENT ON COLUMN USER_CONNECT.USER_ID IS 'Пользователь (linked to userCls)'; COMMENT ON COLUMN USER_CONNECT.CONNECTION_TIME IS 'Последнее соединение'; @@ -519,7 +559,7 @@ COMMENT ON COLUMN USER_CONNECT.ERROR_TEXT IS 'Полный текст ошибк -- History log of userConnect - Активность пользователей в системе -CREATE TABLE IF NOT EXISTS USER_CONNECT_HISTORY(USER_CONNECT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, USER_ID bigint, CONNECTION_TIME timestamp, DISCONNECTION_TIME timestamp, SERVER_I_P varchar(250), CLIENT_I_P varchar(250), CONNECTION_STATE char(4), CLEARING_DATE date, ERROR_CODE char(4), ERROR_TEXT char(4)); +CREATE TABLE IF NOT EXISTS USER_CONNECT_HISTORY(USER_CONNECT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, USER_ID bigint, CONNECTION_TIME timestamp, DISCONNECTION_TIME timestamp, SERVER_I_P varchar(250), CLIENT_I_P varchar(250), CONNECTION_STATE char(4), CLEARING_DATE date, ERROR_CODE bigint, ERROR_TEXT char(4)); COMMENT ON TABLE USER_CONNECT_HISTORY IS 'История изменений таблицы userConnect'; COMMENT ON COLUMN USER_CONNECT_HISTORY.USER_CONNECT_ID IS 'Идентификатор записи в таблице USER_CONNECT'; COMMENT ON COLUMN USER_CONNECT_HISTORY.EVENT_TIME IS 'Дата и время изменения'; @@ -531,7 +571,7 @@ COMMENT ON COLUMN USER_CONNECT_HISTORY.CREATED_AT IS 'Создано'; COMMENT ON COLUMN USER_CONNECT_HISTORY.UPDATED_AT IS 'Изменено'; -COMMENT ON COLUMN USER_CONNECT_HISTORY.USER_ID IS 'Пользователь (linked to user)'; +COMMENT ON COLUMN USER_CONNECT_HISTORY.USER_ID IS 'Пользователь (linked to userCls)'; COMMENT ON COLUMN USER_CONNECT_HISTORY.CONNECTION_TIME IS 'Последнее соединение'; @@ -635,7 +675,7 @@ COMMENT ON COLUMN TASK_RUNNER.CREATED_AT IS 'Создано'; COMMENT ON COLUMN TASK_RUNNER.UPDATED_AT IS 'Изменено'; -COMMENT ON COLUMN TASK_RUNNER.SENDER_ID IS 'Отправитель (linked to user)'; +COMMENT ON COLUMN TASK_RUNNER.SENDER_ID IS 'Отправитель (linked to userCls)'; COMMENT ON COLUMN TASK_RUNNER.TASK IS 'Задача (linked to task)'; @@ -745,7 +785,7 @@ COMMENT ON COLUMN CLEARING_MEMBER_CATEGORY.ID IS 'Идентификатор з COMMENT ON COLUMN CLEARING_MEMBER_CATEGORY.COMPANY_ID IS 'Идентификатор Компании (linked to company)'; -COMMENT ON COLUMN CLEARING_MEMBER_CATEGORY.CLEARING_MEMBER_CATEGORY IS 'Идентификатор категории участника клиринга (linked to clearingCategory)'; +COMMENT ON COLUMN CLEARING_MEMBER_CATEGORY.CLEARING_MEMBER_CATEGORY IS 'Идентификатор категории участника клиринга (linked to clearingMemberCategory)'; -- contact - Контакты Компании CREATE TABLE IF NOT EXISTS CONTACT(ID bigint PRIMARY KEY, COMPANY_ID bigint, CONTACT_TYPE char(4), CONTACT_VALUE varchar(255)); @@ -801,6 +841,76 @@ COMMENT ON COLUMN COMPANY_SYMBOLS.COMPANY_SYMBOL IS 'Идентификатор COMMENT ON COLUMN COMPANY_SYMBOLS.COMPANY_SYMBOL_VALUE IS 'Значение справочника'; +-- clearmemberRegistry - Реестр участников клиринга +CREATE TABLE IF NOT EXISTS CLEARMEMBER_REGISTRY(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, TRADING_CODE varchar(255), CLEARING_CODE varchar(255), FULL_NAME varchar(255), SHORT_NAME varchar(255), CATEGORY_LIST char(4), CORPORATION_SOLE char(4), ACCOUNT varchar(50), BANK bigint, BANK_NAME varchar(255), INN varchar(255), BIC varchar(255), OGRN varchar(255), CPP varchar(255), OCPO varchar(255), CONTRACT_NUMBER varchar(255), CONTRACT_DATE date, REGISTRATION_DATE date, SYSTEM_DATE date, ACCESS_DATE timestamp, SUSPENTION_DATE timestamp, REOPENING_DATE timestamp, CLOSE_DATE timestamp, EXCLUSION_DATE timestamp, ADDRESS varchar(255), EMAIL varchar(255)); +COMMENT ON TABLE CLEARMEMBER_REGISTRY IS 'Реестр участников клиринга'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.CREATED_AT IS 'Дата и время создания записи'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.UPDATED_AT IS 'Дата и время изменения записи'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.TRADING_CODE IS 'Код участника торгов'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.CLEARING_CODE IS 'Код участника клиринга'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.FULL_NAME IS 'Полное наименование участника клиринга'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.SHORT_NAME IS 'Краткое наименование участника клиринга'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.CATEGORY_LIST IS 'Идентификатор категории участника клиринга (linked to clearingCategory)'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.CORPORATION_SOLE IS 'Идентификатор единоличного исполнительного органа (linked to corporationSoleType)'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.ACCOUNT IS 'Cчета'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.BANK IS 'Банк (linked to bankAccount)'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.BANK_NAME IS 'Наименование банка'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.INN IS 'Идентификационный номер налогоплательщика (ИНН)'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.BIC IS 'Банковский идентификационный код (БИК)'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.OGRN IS 'Основной государственный регистрационный номер'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.CPP IS 'Код причины постановки (КПП)'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.OCPO IS 'Код в Общероссийском классификаторе предприятий'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.CONTRACT_NUMBER IS 'Номер договора'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.CONTRACT_DATE IS 'Дата выдачи'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.REGISTRATION_DATE IS 'Дата регистрации'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.SYSTEM_DATE IS 'Системная дата'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.ACCESS_DATE IS 'Дата допуска к КО'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.SUSPENTION_DATE IS 'Дата приостановления'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.REOPENING_DATE IS 'Дата возобновления'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.CLOSE_DATE IS 'Дата прекращения'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.EXCLUSION_DATE IS 'Дата исключения из реестра'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.ADDRESS IS 'Адрес местонахождения'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY.EMAIL IS 'Электронная почта'; + +-- clearmemberRegistryChange - Журнал изменений информации участников клиринга +CREATE TABLE IF NOT EXISTS CLEARMEMBER_REGISTRY_CHANGE(DATE timestamp, CLEARING_CODE varchar(255), COMMENT varchar(255)); +COMMENT ON TABLE CLEARMEMBER_REGISTRY_CHANGE IS 'Журнал изменений информации участников клиринга'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY_CHANGE.DATE IS 'Дата и время изменения записи'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY_CHANGE.CLEARING_CODE IS 'Код участника клиринга'; + +COMMENT ON COLUMN CLEARMEMBER_REGISTRY_CHANGE.COMMENT IS 'Комментарий'; + -- keyRate - Ключевая ставка ЦБ CREATE TABLE IF NOT EXISTS KEY_RATE(ID bigint PRIMARY KEY, RATE numeric(72,18), START_DATE date, END_DATE date, DOCUMENT varchar(255), WORKFLOW_STATUS char(4)); COMMENT ON TABLE KEY_RATE IS 'Ключевая ставка ЦБ'; @@ -828,7 +938,7 @@ COMMENT ON COLUMN COMPANY_ROLE_SET.COMPANY_ID IS 'Идентификатор с COMMENT ON COLUMN COMPANY_ROLE_SET.ROLE_ID IS 'Значение справочника (linked to companyRole)'; -- account - Счета -CREATE TABLE IF NOT EXISTS ACCOUNT(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, ACCOUNT varchar(12), ACCOUNT_TYPE char(4), RELATION_ID bigint, STATUS char(4), PROCESSING_SIGN char(4)); +CREATE TABLE IF NOT EXISTS ACCOUNT(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, ACCOUNT varchar(50), ACCOUNT_TYPE char(4), RELATION_ID bigint, ACCOUNT_STATUS char(4), PROCESSING_SIGN char(4)); COMMENT ON TABLE ACCOUNT IS 'Счета'; COMMENT ON COLUMN ACCOUNT.ID IS 'Идентификатор'; @@ -843,13 +953,13 @@ COMMENT ON COLUMN ACCOUNT.ACCOUNT_TYPE IS 'Идентификатор типа COMMENT ON COLUMN ACCOUNT.RELATION_ID IS 'Идентификатор договорных отношений (linked to relation)'; -COMMENT ON COLUMN ACCOUNT.STATUS IS 'Идентификатор статуса (linked to accountStatus)'; +COMMENT ON COLUMN ACCOUNT.ACCOUNT_STATUS IS 'Идентификатор статуса (linked to accountStatus)'; COMMENT ON COLUMN ACCOUNT.PROCESSING_SIGN IS 'Признак обработки счета (linked to allowed)'; -- History log of account - Счета -CREATE TABLE IF NOT EXISTS ACCOUNT_HISTORY(ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, ACCOUNT varchar(12), ACCOUNT_TYPE char(4), RELATION_ID bigint, STATUS char(4), PROCESSING_SIGN char(4)); +CREATE TABLE IF NOT EXISTS ACCOUNT_HISTORY(ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, ACCOUNT varchar(50), ACCOUNT_TYPE char(4), RELATION_ID bigint, ACCOUNT_STATUS char(4), PROCESSING_SIGN char(4)); COMMENT ON TABLE ACCOUNT_HISTORY IS 'История изменений таблицы account'; COMMENT ON COLUMN ACCOUNT_HISTORY.ACCOUNT_ID IS 'Идентификатор записи в таблице ACCOUNT'; COMMENT ON COLUMN ACCOUNT_HISTORY.EVENT_TIME IS 'Дата и время изменения'; @@ -867,7 +977,7 @@ COMMENT ON COLUMN ACCOUNT_HISTORY.ACCOUNT_TYPE IS 'Идентификатор т COMMENT ON COLUMN ACCOUNT_HISTORY.RELATION_ID IS 'Идентификатор договорных отношений (linked to relation)'; -COMMENT ON COLUMN ACCOUNT_HISTORY.STATUS IS 'Идентификатор статуса (linked to accountStatus)'; +COMMENT ON COLUMN ACCOUNT_HISTORY.ACCOUNT_STATUS IS 'Идентификатор статуса (linked to accountStatus)'; COMMENT ON COLUMN ACCOUNT_HISTORY.PROCESSING_SIGN IS 'Признак обработки счета (linked to allowed)'; @@ -920,7 +1030,7 @@ COMMENT ON COLUMN RELATION_HISTORY.SERVICE_PRODUCT IS 'Идентификато COMMENT ON COLUMN RELATION_HISTORY.COMMENT IS 'Текст причины'; -- bankAccount - Банковские реквизиты для перечисления денежных средств -CREATE TABLE IF NOT EXISTS BANK_ACCOUNT(ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), ACCOUNT varchar(12)); +CREATE TABLE IF NOT EXISTS BANK_ACCOUNT(ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), ACCOUNT varchar(50)); COMMENT ON TABLE BANK_ACCOUNT IS 'Банковские реквизиты для перечисления денежных средств'; COMMENT ON COLUMN BANK_ACCOUNT.ID IS 'Идентификатор записи'; @@ -949,11 +1059,11 @@ COMMENT ON COLUMN BANK_ACCOUNT.TAXPAYER_IDENTIFICATION_NUMBER IS 'Идентиф COMMENT ON COLUMN BANK_ACCOUNT.TAX_REGISTRATION_REASON_CODE IS 'Код причины постановки (КПП)'; -COMMENT ON COLUMN BANK_ACCOUNT.ACCOUNT IS 'Номер счета (linked to account)'; +COMMENT ON COLUMN BANK_ACCOUNT.ACCOUNT IS 'Номер счета'; -- History log of bankAccount - Банковские реквизиты для перечисления денежных средств -CREATE TABLE IF NOT EXISTS BANK_ACCOUNT_HISTORY(BANK_ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), ACCOUNT varchar(12)); +CREATE TABLE IF NOT EXISTS BANK_ACCOUNT_HISTORY(BANK_ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), ACCOUNT varchar(50)); COMMENT ON TABLE BANK_ACCOUNT_HISTORY IS 'История изменений таблицы bankAccount'; COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.BANK_ACCOUNT_ID IS 'Идентификатор записи в таблице BANK_ACCOUNT'; COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.EVENT_TIME IS 'Дата и время изменения'; @@ -985,7 +1095,7 @@ COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.TAXPAYER_IDENTIFICATION_NUMBER IS 'Иде COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.TAX_REGISTRATION_REASON_CODE IS 'Код причины постановки (КПП)'; -COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.ACCOUNT IS 'Номер счета (linked to account)'; +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.ACCOUNT IS 'Номер счета'; -- informationAccount - Информационные счета CREATE TABLE IF NOT EXISTS INFORMATION_ACCOUNT(ID bigint PRIMARY KEY, ACCOUNT_ID bigint, CLEARING_ACCOUNT_ID bigint); @@ -1275,7 +1385,7 @@ COMMENT ON COLUMN MARKET_HISTORY.SETTLEMENT_CURRENCY IS 'Валютный код COMMENT ON COLUMN MARKET_HISTORY.SECTOR IS 'Идентификатор секции (linked to sector)'; -- accountBalance - Информация об остатках ден. средств -CREATE TABLE IF NOT EXISTS ACCOUNT_BALANCE(ID bigint PRIMARY KEY, COMPANY_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp, ACCOUNT_ID bigint, ACCOUNT_TYPE bigint, ACCOUNT bigint, OPEN_BALANCE_AMOUNT numeric(72,18), START_BALANCE_AMOUNT numeric(72,18), CLOSE_BALANCE_AMOUNT numeric(72,18), TRADE_BALANCE_AMOUNT numeric(72,18), FREE_BALANCE_AMOUNT numeric(72,18), CHANGE_BALANCE_AMOUNT numeric(72,18), CREDIT_AMOUNT numeric(72,18), DEBIT_AMOUNT numeric(72,18), BALANCE_AMOUNT numeric(72,18), BALANCE_ACCOUNT_TYPE char(4), CLEARING_DATE date, CURRENCY_CODE char(4), TRADING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255)); +CREATE TABLE IF NOT EXISTS ACCOUNT_BALANCE(ID bigint PRIMARY KEY, COMPANY_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp, ACCOUNT_ID bigint, ACCOUNT_TYPE char(4), ACCOUNT varchar(50), OPEN_BALANCE_AMOUNT numeric(72,18), START_BALANCE_AMOUNT numeric(72,18), CLOSE_BALANCE_AMOUNT numeric(72,18), TRADE_BALANCE_AMOUNT numeric(72,18), FREE_BALANCE_AMOUNT numeric(72,18), CHANGE_BALANCE_AMOUNT numeric(72,18), CREDIT_AMOUNT numeric(72,18), DEBIT_AMOUNT numeric(72,18), BALANCE_AMOUNT numeric(72,18), BALANCE_ACCOUNT_TYPE char(4), CLEARING_DATE date, CURRENCY_CODE char(4), TRADING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255)); COMMENT ON TABLE ACCOUNT_BALANCE IS 'Информация об остатках ден. средств'; COMMENT ON COLUMN ACCOUNT_BALANCE.ID IS 'Идентификатор записи'; @@ -1290,7 +1400,7 @@ COMMENT ON COLUMN ACCOUNT_BALANCE.ACCOUNT_ID IS 'Идентификатор сч COMMENT ON COLUMN ACCOUNT_BALANCE.ACCOUNT_TYPE IS 'Тип счета (linked to account)'; -COMMENT ON COLUMN ACCOUNT_BALANCE.ACCOUNT IS 'Счет (linked to account)'; +COMMENT ON COLUMN ACCOUNT_BALANCE.ACCOUNT IS 'Счет'; COMMENT ON COLUMN ACCOUNT_BALANCE.OPEN_BALANCE_AMOUNT IS 'Начальная сумма после расчетной организации'; @@ -1324,7 +1434,7 @@ COMMENT ON COLUMN ACCOUNT_BALANCE.FULL_NAME IS 'Полное наименова -- History log of accountBalance - Информация об остатках ден. средств -CREATE TABLE IF NOT EXISTS ACCOUNT_BALANCE_HISTORY(ACCOUNT_BALANCE_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, COMPANY_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp, ACCOUNT_ID bigint, ACCOUNT_TYPE bigint, ACCOUNT bigint, OPEN_BALANCE_AMOUNT numeric(72,18), START_BALANCE_AMOUNT numeric(72,18), CLOSE_BALANCE_AMOUNT numeric(72,18), TRADE_BALANCE_AMOUNT numeric(72,18), FREE_BALANCE_AMOUNT numeric(72,18), CHANGE_BALANCE_AMOUNT numeric(72,18), CREDIT_AMOUNT numeric(72,18), DEBIT_AMOUNT numeric(72,18), BALANCE_AMOUNT numeric(72,18), BALANCE_ACCOUNT_TYPE char(4), CLEARING_DATE date, CURRENCY_CODE char(4), TRADING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255)); +CREATE TABLE IF NOT EXISTS ACCOUNT_BALANCE_HISTORY(ACCOUNT_BALANCE_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, COMPANY_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp, ACCOUNT_ID bigint, ACCOUNT_TYPE char(4), ACCOUNT varchar(50), OPEN_BALANCE_AMOUNT numeric(72,18), START_BALANCE_AMOUNT numeric(72,18), CLOSE_BALANCE_AMOUNT numeric(72,18), TRADE_BALANCE_AMOUNT numeric(72,18), FREE_BALANCE_AMOUNT numeric(72,18), CHANGE_BALANCE_AMOUNT numeric(72,18), CREDIT_AMOUNT numeric(72,18), DEBIT_AMOUNT numeric(72,18), BALANCE_AMOUNT numeric(72,18), BALANCE_ACCOUNT_TYPE char(4), CLEARING_DATE date, CURRENCY_CODE char(4), TRADING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255)); COMMENT ON TABLE ACCOUNT_BALANCE_HISTORY IS 'История изменений таблицы accountBalance'; COMMENT ON COLUMN ACCOUNT_BALANCE_HISTORY.ACCOUNT_BALANCE_ID IS 'Идентификатор записи в таблице ACCOUNT_BALANCE'; COMMENT ON COLUMN ACCOUNT_BALANCE_HISTORY.EVENT_TIME IS 'Дата и время изменения'; @@ -1342,7 +1452,7 @@ COMMENT ON COLUMN ACCOUNT_BALANCE_HISTORY.ACCOUNT_ID IS 'Идентификат COMMENT ON COLUMN ACCOUNT_BALANCE_HISTORY.ACCOUNT_TYPE IS 'Тип счета (linked to account)'; -COMMENT ON COLUMN ACCOUNT_BALANCE_HISTORY.ACCOUNT IS 'Счет (linked to account)'; +COMMENT ON COLUMN ACCOUNT_BALANCE_HISTORY.ACCOUNT IS 'Счет'; COMMENT ON COLUMN ACCOUNT_BALANCE_HISTORY.OPEN_BALANCE_AMOUNT IS 'Начальная сумма после расчетной организации'; @@ -1374,21 +1484,59 @@ COMMENT ON COLUMN ACCOUNT_BALANCE_HISTORY.SHORT_NAME IS 'Короткое наи COMMENT ON COLUMN ACCOUNT_BALANCE_HISTORY.FULL_NAME IS 'Полное наименование Участника (linked to company)'; +-- balanceRegistry - Реестр остатков денежных средств +CREATE TABLE IF NOT EXISTS BALANCE_REGISTRY(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, S_DF01_DATE timestamp, CURRENCY_CODE char(4), SET_HOUSE_NAME varchar(255), ACCOUNT varchar(50), INFO_ACCOUNT varchar(50), REMAINDER_SUM numeric(72,18), BLOCKED_SUM numeric(72,18), UNBLOCKED_SUM numeric(72,18), INN varchar(255), MARKET bigint, MARKET_NAME varchar(255), FULL_NAME varchar(255), TYPE_REMAINS char(4), DOC_NUMBER varchar(255)); +COMMENT ON TABLE BALANCE_REGISTRY IS 'Реестр остатков денежных средств'; + +COMMENT ON COLUMN BALANCE_REGISTRY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN BALANCE_REGISTRY.CREATED_AT IS 'Дата и время создания записи'; + +COMMENT ON COLUMN BALANCE_REGISTRY.UPDATED_AT IS 'Дата и время изменения записи'; + +COMMENT ON COLUMN BALANCE_REGISTRY.S_DF01_DATE IS 'Дата создания записи в S_DF01'; + +COMMENT ON COLUMN BALANCE_REGISTRY.CURRENCY_CODE IS 'Код валюты (linked to currencyCode)'; + +COMMENT ON COLUMN BALANCE_REGISTRY.SET_HOUSE_NAME IS 'Наименование РО'; + +COMMENT ON COLUMN BALANCE_REGISTRY.ACCOUNT IS 'Номер торгового/клирингового счета'; + +COMMENT ON COLUMN BALANCE_REGISTRY.INFO_ACCOUNT IS 'Номер счета внутреннего учета СПВБ'; + +COMMENT ON COLUMN BALANCE_REGISTRY.REMAINDER_SUM IS 'Остаток денежных средст'; + +COMMENT ON COLUMN BALANCE_REGISTRY.BLOCKED_SUM IS 'Сумма блокированных денежных средств'; + +COMMENT ON COLUMN BALANCE_REGISTRY.UNBLOCKED_SUM IS 'Сумма свободных денежных средств'; + +COMMENT ON COLUMN BALANCE_REGISTRY.INN IS 'Идентификационный номер налогоплательщика (ИНН)'; + +COMMENT ON COLUMN BALANCE_REGISTRY.MARKET IS 'Сегмент рынка (linked to market)'; + +COMMENT ON COLUMN BALANCE_REGISTRY.MARKET_NAME IS 'Наименование сегмента рынка'; + +COMMENT ON COLUMN BALANCE_REGISTRY.FULL_NAME IS 'Наименование Участника Клиринга'; + +COMMENT ON COLUMN BALANCE_REGISTRY.TYPE_REMAINS IS 'Тип остатка'; + +COMMENT ON COLUMN BALANCE_REGISTRY.DOC_NUMBER IS 'Номер документа'; + -- managementJournal - Журнал монитора и контроля -CREATE TABLE IF NOT EXISTS MANAGEMENT_JOURNAL(ID bigint PRIMARY KEY, COMPANY_ID bigint, USER_ID bigint, MANAGEMENT_JOURNAL_TYPE_ID bigint, MANAGEMENT_JOURNAL_PURPOSE_ID bigint, STATUS char(4), TEXT varchar(4096), CHANGE_ACCESS_SIGN char(4), CHANGE_DATA_SIGN char(4), EVENT_DATE timestamp, UPDATED_AT timestamp, CREATED_AT timestamp); +CREATE TABLE IF NOT EXISTS MANAGEMENT_JOURNAL(ID bigint PRIMARY KEY, COMPANY_ID bigint, USER_ID bigint, MANAGEMENT_JOURNAL_TYPE char(4), MANAGEMENT_JOURNAL_PURPOSE char(4), MANAGEMENT_JOURNAL_STATUS char(4), TEXT varchar(4096), CHANGE_ACCESS_SIGN char(4), CHANGE_DATA_SIGN char(4), EVENT_DATE timestamp, UPDATED_AT timestamp, CREATED_AT timestamp); COMMENT ON TABLE MANAGEMENT_JOURNAL IS 'Журнал монитора и контроля'; COMMENT ON COLUMN MANAGEMENT_JOURNAL.ID IS 'Идентификатор'; COMMENT ON COLUMN MANAGEMENT_JOURNAL.COMPANY_ID IS 'Участник (linked to company)'; -COMMENT ON COLUMN MANAGEMENT_JOURNAL.USER_ID IS 'Автор сообщения (linked to user)'; +COMMENT ON COLUMN MANAGEMENT_JOURNAL.USER_ID IS 'Автор сообщения (linked to userCls)'; -COMMENT ON COLUMN MANAGEMENT_JOURNAL.MANAGEMENT_JOURNAL_TYPE_ID IS 'Тип мониторинга (linked to managementJournalType)'; +COMMENT ON COLUMN MANAGEMENT_JOURNAL.MANAGEMENT_JOURNAL_TYPE IS 'Тип мониторинга (linked to managementJournalType)'; -COMMENT ON COLUMN MANAGEMENT_JOURNAL.MANAGEMENT_JOURNAL_PURPOSE_ID IS 'Цель мониторинга (linked to managementJournalPurpose)'; +COMMENT ON COLUMN MANAGEMENT_JOURNAL.MANAGEMENT_JOURNAL_PURPOSE IS 'Цель мониторинга (linked to managementJournalPurpose)'; -COMMENT ON COLUMN MANAGEMENT_JOURNAL.STATUS IS 'Статус (linked to managementJournalStatus)'; +COMMENT ON COLUMN MANAGEMENT_JOURNAL.MANAGEMENT_JOURNAL_STATUS IS 'Статус (linked to managementJournalStatus)'; COMMENT ON COLUMN MANAGEMENT_JOURNAL.TEXT IS 'Сообщение'; @@ -1403,7 +1551,7 @@ COMMENT ON COLUMN MANAGEMENT_JOURNAL.UPDATED_AT IS 'Изменено'; COMMENT ON COLUMN MANAGEMENT_JOURNAL.CREATED_AT IS 'Создано'; -- inDocumentJournal - Журнал входящих документов -CREATE TABLE IF NOT EXISTS IN_DOCUMENT_JOURNAL(ID bigint PRIMARY KEY, REGISTRATION_DATE date, REGISTRATION_TIME time, REGISTRATION_NUMBER bigint, DOCUMENT_NAME varchar(255), SENDER_ID bigint, QUANTITY bigint, CLEARING_CODE varchar(255), COURIER_TYPE char(4), EMAIL_DATE date, AMOUNT numeric(72,2), DOSSIER_NUMBER bigint, COMMENT varchar(255), RECEIPT_DATE date); +CREATE TABLE IF NOT EXISTS IN_DOCUMENT_JOURNAL(ID bigint PRIMARY KEY, REGISTRATION_DATE date, REGISTRATION_TIME time, REGISTRATION_NUMBER bigint, DOCUMENT_NAME varchar(255), SENDER varchar(255), QUANTITY bigint, CLEARING_CODE varchar(255), COURIER_TYPE char(4), EMAIL_DATE date, AMOUNT numeric(72,2), DOSSIER_NUMBER varchar(50), COMMENT varchar(255), RECEIPT_DATE date, RESULT_STATUS char(4)); COMMENT ON TABLE IN_DOCUMENT_JOURNAL IS 'Журнал входящих документов'; COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.ID IS 'Идентификатор'; @@ -1416,7 +1564,7 @@ COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.REGISTRATION_NUMBER IS 'Регистаци COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.DOCUMENT_NAME IS 'Наименование документа'; -COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.SENDER_ID IS 'Полное наименование отправителя (linked to company)'; +COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.SENDER IS 'Полное наименование отправителя'; COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.QUANTITY IS 'Количествово экземпляров'; @@ -1434,8 +1582,10 @@ COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.COMMENT IS 'Комментарий'; COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.RECEIPT_DATE IS 'Дата получения оригинала'; +COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.RESULT_STATUS IS 'Статус загрузки документа (linked to resultStatus)'; + -- outDocumentJournal - Журнал исходящих документов -CREATE TABLE IF NOT EXISTS OUT_DOCUMENT_JOURNAL(ID bigint PRIMARY KEY, REGISTRATION_DATE date, REGISTRATION_TIME time, REGISTRATION_NUMBER bigint, DOCUMENT_NAME varchar(255), ADDRESSEE_ID bigint, QUANTITY bigint, CLEARING_CODE varchar(255), COURIER_TYPE char(4), EMAIL_DATE date, AMOUNT numeric(72,2), DOSSIER_NUMBER bigint, POST_DATE date); +CREATE TABLE IF NOT EXISTS OUT_DOCUMENT_JOURNAL(ID bigint PRIMARY KEY, REGISTRATION_DATE date, REGISTRATION_TIME time, REGISTRATION_NUMBER bigint, DOCUMENT_NAME varchar(255), ADDRESSEE varchar(255), QUANTITY bigint, CLEARING_CODE varchar(255), COURIER_TYPE char(4), EMAIL_DATE date, AMOUNT numeric(72,2), DOSSIER_NUMBER varchar(50), POST_DATE date, RESULT_STATUS char(4)); COMMENT ON TABLE OUT_DOCUMENT_JOURNAL IS 'Журнал исходящих документов'; COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.ID IS 'Идентификатор'; @@ -1448,7 +1598,7 @@ COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.REGISTRATION_NUMBER IS 'Регистац COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.DOCUMENT_NAME IS 'Наименование документа'; -COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.ADDRESSEE_ID IS 'Полное наименование получателя (linked to company)'; +COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.ADDRESSEE IS 'Полное наименование получателя'; COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.QUANTITY IS 'Количествово экземпляров'; @@ -1464,6 +1614,8 @@ COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.DOSSIER_NUMBER IS 'Номер дела'; COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.POST_DATE IS 'Дата почтового отправления'; +COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.RESULT_STATUS IS 'Статус выгрузки документа (linked to resultStatus)'; + -- executionDeposit - Сделки CREATE TABLE IF NOT EXISTS EXECUTION_DEPOSIT(ID bigint PRIMARY KEY, EXCHANGE_EXECUTION_ID bigint, EXCHANGE_EXECUTION_TIME date, CREATED_AT time, UPDATED_AT time, TRADING_DATE date, ACCOUNT_ID bigint, MARKET char(4), PRICE numeric(72,18), AMOUNT bigint, SIDE_ID bigint, SETTLEMENT_CURRENCY_ID bigint, COMPANY_ID bigint, DURATION bigint, FIRST_LEG_SETTLEMENT_DATE date, SECOND_LEG_SETTLEMENT_DATE date, SECOND_LEG_AMOUNT date, INTEREST_AMOUNT date, SYMBOL_NAME varchar(50), SYMBOL_CODE varchar(20), SECURITIES_DEPOSIT_ID bigint, COUNTER_PARTY_ID bigint, SESSION_ID bigint, COVERAGE_STATUS_ID bigint); COMMENT ON TABLE EXECUTION_DEPOSIT IS 'Сделки'; @@ -1564,6 +1716,98 @@ COMMENT ON COLUMN EXECUTION_DEPOSIT_REGISTER.COVERAGE_STATUS_ID IS 'Cтатус COMMENT ON COLUMN EXECUTION_DEPOSIT_REGISTER.SESSION_ID IS 'Сессия (linked to moneyMarketSession)'; +-- admittedDeal - Реестр сделок, допущенных к клирингу +CREATE TABLE IF NOT EXISTS ADMITTED_DEAL(COMPANY_FULL_NAME varchar(255), EXECUTION_DEPOSIT_REGISTER_TRADING_DATE timestamp, EXCHANGE_EXECUTION_ID varchar(255), EXCHANGE_EXECUTION_TIME time, SECURITY_ID bigint, SECURITY_NAME varchar(255), SELLER_FULL_NAME varchar(255), SELLER_CLEARING_CODE varchar(255), SELLER_ACCOUNT varchar, BUYER_FULL_NAME varchar(255), BUYER_CLEARING_CODE varchar(255), BUYER_ACCOUNT varchar, EXECUTION_DEPOSIT_REGISTER_AMOUNT numeric(72,18)); +COMMENT ON TABLE ADMITTED_DEAL IS 'Реестр сделок, допущенных к клирингу'; + +COMMENT ON COLUMN ADMITTED_DEAL.COMPANY_FULL_NAME IS 'Наименование биржи'; + +COMMENT ON COLUMN ADMITTED_DEAL.EXECUTION_DEPOSIT_REGISTER_TRADING_DATE IS 'Дата заключения сделки'; + +COMMENT ON COLUMN ADMITTED_DEAL.EXCHANGE_EXECUTION_ID IS 'Номер сделки'; + +COMMENT ON COLUMN ADMITTED_DEAL.EXCHANGE_EXECUTION_TIME IS 'Время заключения сделки'; + +COMMENT ON COLUMN ADMITTED_DEAL.SECURITY_ID IS 'Биржевой код инструмента (linked to security)'; + +COMMENT ON COLUMN ADMITTED_DEAL.SECURITY_NAME IS 'Наименование инструмента'; + +COMMENT ON COLUMN ADMITTED_DEAL.SELLER_FULL_NAME IS 'Наименование продавца'; + +COMMENT ON COLUMN ADMITTED_DEAL.SELLER_CLEARING_CODE IS 'Код продавца'; + +COMMENT ON COLUMN ADMITTED_DEAL.SELLER_ACCOUNT IS 'Счет продавца'; + +COMMENT ON COLUMN ADMITTED_DEAL.BUYER_FULL_NAME IS 'Наименование продавца'; + +COMMENT ON COLUMN ADMITTED_DEAL.BUYER_CLEARING_CODE IS 'Код продавца'; + +COMMENT ON COLUMN ADMITTED_DEAL.BUYER_ACCOUNT IS 'Счет продавца'; + +COMMENT ON COLUMN ADMITTED_DEAL.EXECUTION_DEPOSIT_REGISTER_AMOUNT IS 'Сумма сделки'; + +-- dealPassedControl - Реестр сделок, прошедших процедуру контроля обеспечения +CREATE TABLE IF NOT EXISTS DEAL_PASSED_CONTROL(COMPANY_FULL_NAME varchar(255), EXECUTION_DEPOSIT_REGISTER_TRADING_DATE timestamp, EXCHANGE_EXECUTION_ID varchar(255), EXCHANGE_EXECUTION_TIME time, SECURITY_ID bigint, SECURITY_NAME varchar(255), SELLER_FULL_NAME varchar(255), SELLER_CLEARING_CODE varchar(255), SELLER_ACCOUNT varchar, BUYER_FULL_NAME varchar(255), BUYER_CLEARING_CODE varchar(255), BUYER_ACCOUNT varchar, EXECUTION_DEPOSIT_REGISTER_AMOUNT numeric(72,18)); +COMMENT ON TABLE DEAL_PASSED_CONTROL IS 'Реестр сделок, прошедших процедуру контроля обеспечения'; + +COMMENT ON COLUMN DEAL_PASSED_CONTROL.COMPANY_FULL_NAME IS 'Наименование биржи'; + +COMMENT ON COLUMN DEAL_PASSED_CONTROL.EXECUTION_DEPOSIT_REGISTER_TRADING_DATE IS 'Дата заключения сделки'; + +COMMENT ON COLUMN DEAL_PASSED_CONTROL.EXCHANGE_EXECUTION_ID IS 'Номер сделки'; + +COMMENT ON COLUMN DEAL_PASSED_CONTROL.EXCHANGE_EXECUTION_TIME IS 'Время заключения сделки'; + +COMMENT ON COLUMN DEAL_PASSED_CONTROL.SECURITY_ID IS 'Биржевой код инструмента (linked to security)'; + +COMMENT ON COLUMN DEAL_PASSED_CONTROL.SECURITY_NAME IS 'Наименование инструмента'; + +COMMENT ON COLUMN DEAL_PASSED_CONTROL.SELLER_FULL_NAME IS 'Наименование продавца'; + +COMMENT ON COLUMN DEAL_PASSED_CONTROL.SELLER_CLEARING_CODE IS 'Код продавца'; + +COMMENT ON COLUMN DEAL_PASSED_CONTROL.SELLER_ACCOUNT IS 'Счет продавца'; + +COMMENT ON COLUMN DEAL_PASSED_CONTROL.BUYER_FULL_NAME IS 'Наименование продавца'; + +COMMENT ON COLUMN DEAL_PASSED_CONTROL.BUYER_CLEARING_CODE IS 'Код продавца'; + +COMMENT ON COLUMN DEAL_PASSED_CONTROL.BUYER_ACCOUNT IS 'Счет продавца'; + +COMMENT ON COLUMN DEAL_PASSED_CONTROL.EXECUTION_DEPOSIT_REGISTER_AMOUNT IS 'Сумма сделки'; + +-- dealUnPassedControl - Реестр сделок, не прошедших процедуру контроля обеспечения +CREATE TABLE IF NOT EXISTS DEAL_UN_PASSED_CONTROL(COMPANY_FULL_NAME varchar(255), EXECUTION_DEPOSIT_REGISTER_TRADING_DATE timestamp, EXCHANGE_EXECUTION_ID varchar(255), EXCHANGE_EXECUTION_TIME time, SECURITY_ID bigint, SECURITY_NAME varchar(255), SELLER_FULL_NAME varchar(255), SELLER_CLEARING_CODE varchar(255), SELLER_ACCOUNT varchar, BUYER_FULL_NAME varchar(255), BUYER_CLEARING_CODE varchar(255), BUYER_ACCOUNT varchar, EXECUTION_DEPOSIT_REGISTER_AMOUNT numeric(72,18), RESULT varchar(3)); +COMMENT ON TABLE DEAL_UN_PASSED_CONTROL IS 'Реестр сделок, не прошедших процедуру контроля обеспечения'; + +COMMENT ON COLUMN DEAL_UN_PASSED_CONTROL.COMPANY_FULL_NAME IS 'Наименование биржи'; + +COMMENT ON COLUMN DEAL_UN_PASSED_CONTROL.EXECUTION_DEPOSIT_REGISTER_TRADING_DATE IS 'Дата заключения сделки'; + +COMMENT ON COLUMN DEAL_UN_PASSED_CONTROL.EXCHANGE_EXECUTION_ID IS 'Номер сделки'; + +COMMENT ON COLUMN DEAL_UN_PASSED_CONTROL.EXCHANGE_EXECUTION_TIME IS 'Время заключения сделки'; + +COMMENT ON COLUMN DEAL_UN_PASSED_CONTROL.SECURITY_ID IS 'Биржевой код инструмента (linked to security)'; + +COMMENT ON COLUMN DEAL_UN_PASSED_CONTROL.SECURITY_NAME IS 'Наименование инструмента'; + +COMMENT ON COLUMN DEAL_UN_PASSED_CONTROL.SELLER_FULL_NAME IS 'Наименование продавца'; + +COMMENT ON COLUMN DEAL_UN_PASSED_CONTROL.SELLER_CLEARING_CODE IS 'Код продавца'; + +COMMENT ON COLUMN DEAL_UN_PASSED_CONTROL.SELLER_ACCOUNT IS 'Счет продавца'; + +COMMENT ON COLUMN DEAL_UN_PASSED_CONTROL.BUYER_FULL_NAME IS 'Наименование продавца'; + +COMMENT ON COLUMN DEAL_UN_PASSED_CONTROL.BUYER_CLEARING_CODE IS 'Код продавца'; + +COMMENT ON COLUMN DEAL_UN_PASSED_CONTROL.BUYER_ACCOUNT IS 'Счет продавца'; + +COMMENT ON COLUMN DEAL_UN_PASSED_CONTROL.EXECUTION_DEPOSIT_REGISTER_AMOUNT IS 'Сумма сделки'; + +COMMENT ON COLUMN DEAL_UN_PASSED_CONTROL.RESULT IS 'Результат клиринга'; + -- reportRegister - Реестр отчетов CREATE TABLE IF NOT EXISTS REPORT_REGISTER(ID bigint PRIMARY KEY, CREATED_AT time, UPDATED_AT time, CLEARING_DATE date, COMPANY_FULL_NAME varchar(255), CLEARING_CODE varchar(255), SESSION_ID bigint, COMMENT varchar(255), NAME varchar(255), QUANTITY bigint); COMMENT ON TABLE REPORT_REGISTER IS 'Реестр отчетов'; @@ -1576,7 +1820,7 @@ COMMENT ON COLUMN REPORT_REGISTER.UPDATED_AT IS 'Время изменения'; COMMENT ON COLUMN REPORT_REGISTER.CLEARING_DATE IS 'Дата клиринга'; -COMMENT ON COLUMN REPORT_REGISTER.COMPANY_FULL_NAME IS 'Идентификатор участника'; +COMMENT ON COLUMN REPORT_REGISTER.COMPANY_FULL_NAME IS 'Наименование участника'; COMMENT ON COLUMN REPORT_REGISTER.CLEARING_CODE IS 'Код клиринга'; @@ -1626,36 +1870,36 @@ COMMENT ON COLUMN CONTRACT_REGISTER.CLOSE_DATE IS 'Дата расторжени COMMENT ON COLUMN CONTRACT_REGISTER.COMMENT IS 'Место'; --- paymentRegister - Реестра распоряжений -CREATE TABLE IF NOT EXISTS PAYMENT_REGISTER(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, CREDIT_LEG_ACCOUNT_ID bigint, CREDIT_LEG_AMOUNT bigint, CREDIT_LEG_CURRENCY_CODE char(4), CREDIT_LEG_DIRECTION bigint, DEBIT_LEG_ACCOUNT bigint, SENDER_ID bigint, ADDRESSEE_ID bigint, DOCUMENT_NUMBER varchar(255)); -COMMENT ON TABLE PAYMENT_REGISTER IS 'Реестра распоряжений'; +-- orderRegistry - Реестра распоряжений +CREATE TABLE IF NOT EXISTS ORDER_REGISTRY(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, CREDIT_LEG_ACCOUNT varchar, CREDIT_LEG_AMOUNT numeric(72,18), CREDIT_LEG_CURRENCY_CODE char(4), CREDIT_LEG_DIRECTION bigint, DEBIT_LEG_ACCOUNT varchar, SENDER varchar(255), ADDRESSEE varchar(255), DOCUMENT_NUMBER varchar(255)); +COMMENT ON TABLE ORDER_REGISTRY IS 'Реестра распоряжений'; -COMMENT ON COLUMN PAYMENT_REGISTER.ID IS 'Идентификатор записи'; +COMMENT ON COLUMN ORDER_REGISTRY.ID IS 'Идентификатор записи'; -COMMENT ON COLUMN PAYMENT_REGISTER.CREATED_AT IS 'Дата и время создания записи'; +COMMENT ON COLUMN ORDER_REGISTRY.CREATED_AT IS 'Дата и время создания записи'; -COMMENT ON COLUMN PAYMENT_REGISTER.UPDATED_AT IS 'Дата и время изменения записи'; +COMMENT ON COLUMN ORDER_REGISTRY.UPDATED_AT IS 'Дата и время изменения записи'; -COMMENT ON COLUMN PAYMENT_REGISTER.CLEARING_DATE IS 'Дата расчета'; +COMMENT ON COLUMN ORDER_REGISTRY.CLEARING_DATE IS 'Дата расчета'; -COMMENT ON COLUMN PAYMENT_REGISTER.CREDIT_LEG_ACCOUNT_ID IS 'Идентификатор счета отправителя (linked to account)'; +COMMENT ON COLUMN ORDER_REGISTRY.CREDIT_LEG_ACCOUNT IS 'Счет отправителя'; -COMMENT ON COLUMN PAYMENT_REGISTER.CREDIT_LEG_AMOUNT IS 'Сумма отправителя'; +COMMENT ON COLUMN ORDER_REGISTRY.CREDIT_LEG_AMOUNT IS 'Сумма отправителя'; -COMMENT ON COLUMN PAYMENT_REGISTER.CREDIT_LEG_CURRENCY_CODE IS 'Код валюты отправителя (linked to currency)'; +COMMENT ON COLUMN ORDER_REGISTRY.CREDIT_LEG_CURRENCY_CODE IS 'Код валюты отправителя (linked to currency)'; -COMMENT ON COLUMN PAYMENT_REGISTER.CREDIT_LEG_DIRECTION IS 'Направление отправителя (linked to inOutDirection)'; +COMMENT ON COLUMN ORDER_REGISTRY.CREDIT_LEG_DIRECTION IS 'Направление отправителя (linked to inOutDirection)'; -COMMENT ON COLUMN PAYMENT_REGISTER.DEBIT_LEG_ACCOUNT IS 'Счет получателя (linked to Account)'; +COMMENT ON COLUMN ORDER_REGISTRY.DEBIT_LEG_ACCOUNT IS 'Счет получателя'; -COMMENT ON COLUMN PAYMENT_REGISTER.SENDER_ID IS 'Идентификатор участника отправителя (linked to company)'; +COMMENT ON COLUMN ORDER_REGISTRY.SENDER IS 'Отправитель'; -COMMENT ON COLUMN PAYMENT_REGISTER.ADDRESSEE_ID IS 'Идентификатор участника получателя (linked to company)'; +COMMENT ON COLUMN ORDER_REGISTRY.ADDRESSEE IS 'Получатель'; -COMMENT ON COLUMN PAYMENT_REGISTER.DOCUMENT_NUMBER IS 'Номер документа в сторонней системе'; +COMMENT ON COLUMN ORDER_REGISTRY.DOCUMENT_NUMBER 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), 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)); +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 varchar(50), 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 'Идентификатор записи'; @@ -1670,7 +1914,7 @@ COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.ACCOUNT_ID IS 'Идентификат COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.ACCOUNT_TYPE IS 'Тип счета (linked to account)'; -COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.ACCOUNT IS 'Счет (linked to account)'; +COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.ACCOUNT IS 'Счет'; COMMENT ON COLUMN LIABILITIES_CLAIMS_MONEY.LIABILITIES_AMOUNT IS 'Регистр «Обязательства по денежным средствам, сформированные по результатам собственных сделок Участника клиринга», исключая проценты'; @@ -1693,7 +1937,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), CURRENCY char(4), SETTLEMENT_DATE date, TRADING_DATE date, REFUND_DATE date, PRICE numeric(72,18), SECURITY_ID bigint, TRADING_CODE varchar(255), CLEARING_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); +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 varchar(50), 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), CLEARING_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 'Идентификатор записи'; @@ -1708,7 +1952,7 @@ COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.ACCOUNT_ID IS 'Идентифика COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.ACCOUNT_TYPE IS 'Тип счета (linked to account)'; -COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.ACCOUNT IS 'Счет (linked to account)'; +COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.ACCOUNT IS 'Счет'; COMMENT ON COLUMN LIABILITIES_CLAIMS_ASSETS.LIABILITIES_QUANTITY IS 'Сумма обязательств'; @@ -1751,7 +1995,7 @@ 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_MOVEMENT_CURRENCY_CODE char(4), STATUS char(4), ERROR_CODE char(4), ERROR_TEXT char(4), IN_S_DF_ID bigint, OUT_S_DF_ID bigint, IN_OUT_S_DF_TYPE char(4)); +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 char(4), COMMENT varchar(255), ACCOUNT_ID bigint, ACCOUNT varchar(50), IN_OUT_DIRECTION char(4), SETTLEMENT_DATE date, AMOUNT numeric(72,2), CASH_MOVEMENT_CURRENCY_CODE char(4), OPERATION_STATUS char(4), ERROR_CODE char(4), ERROR_TEXT char(4), IN_S_DF_ID bigint, OUT_S_DF_ID bigint, IN_OUT_S_DF_TYPE char(4)); COMMENT ON TABLE STATEMENT IS 'Денежные средства от расчетной организации'; COMMENT ON COLUMN STATEMENT.ID IS 'Идентификатор записи'; @@ -1766,13 +2010,13 @@ COMMENT ON COLUMN STATEMENT.UPDATED_AT IS 'Дата и время изменен COMMENT ON COLUMN STATEMENT.CLEARING_DATE IS 'Дата расчета'; -COMMENT ON COLUMN STATEMENT.STATEMENT_TYPE_ID IS 'Тип поступления средств (linked to statementType)'; +COMMENT ON COLUMN STATEMENT.STATEMENT_TYPE IS 'Тип поступления средств (linked to statementType)'; COMMENT ON COLUMN STATEMENT.COMMENT IS 'Комментарий'; COMMENT ON COLUMN STATEMENT.ACCOUNT_ID IS 'Идентификатор счета (linked to account)'; -COMMENT ON COLUMN STATEMENT.ACCOUNT IS 'Счет (linked to account)'; +COMMENT ON COLUMN STATEMENT.ACCOUNT IS 'Счет'; COMMENT ON COLUMN STATEMENT.IN_OUT_DIRECTION IS 'Направление (linked to inOutDirection)'; @@ -1782,7 +2026,7 @@ COMMENT ON COLUMN STATEMENT.AMOUNT IS 'Объем'; COMMENT ON COLUMN STATEMENT.CASH_MOVEMENT_CURRENCY_CODE IS 'Код валюты (linked to currency)'; -COMMENT ON COLUMN STATEMENT.STATUS IS 'Cтатус обработки (linked to operationStatus)'; +COMMENT ON COLUMN STATEMENT.OPERATION_STATUS IS 'Cтатус обработки (linked to operationStatus)'; COMMENT ON COLUMN STATEMENT.ERROR_CODE IS 'Код ошибки (linked to errorCode)'; @@ -1795,7 +2039,7 @@ COMMENT ON COLUMN STATEMENT.OUT_S_DF_ID IS 'Идентификатор запи COMMENT ON COLUMN STATEMENT.IN_OUT_S_DF_TYPE IS 'Типы входящей и исходящей записей (linked to inOutSDfType)'; -- tradeSettlement - Проводки на базе сделок торговой системы -CREATE TABLE IF NOT EXISTS TRADE_SETTLEMENT(ID bigint PRIMARY KEY, ADDRESSEE_ID bigint, SENDER_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, AMOUNT numeric(72,2), CURRENCY_CODE char(4), IN_OUT_DIRECTION bigint, ACCOUNT_ID bigint, ACCOUNT bigint, STATUS char(4)); +CREATE TABLE IF NOT EXISTS TRADE_SETTLEMENT(ID bigint PRIMARY KEY, ADDRESSEE_ID bigint, SENDER_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, AMOUNT numeric(72,2), CURRENCY_CODE char(4), IN_OUT_DIRECTION bigint, ACCOUNT_ID bigint, ACCOUNT varchar(50), OPERATION_STATUS char(4)); COMMENT ON TABLE TRADE_SETTLEMENT IS 'Проводки на базе сделок торговой системы'; COMMENT ON COLUMN TRADE_SETTLEMENT.ID IS 'Идентификатор записи'; @@ -1818,12 +2062,12 @@ COMMENT ON COLUMN TRADE_SETTLEMENT.IN_OUT_DIRECTION IS 'Направление ( COMMENT ON COLUMN TRADE_SETTLEMENT.ACCOUNT_ID IS 'Идентификатор счета (linked to account)'; -COMMENT ON COLUMN TRADE_SETTLEMENT.ACCOUNT IS 'Счет (linked to account)'; +COMMENT ON COLUMN TRADE_SETTLEMENT.ACCOUNT IS 'Счет'; -COMMENT ON COLUMN TRADE_SETTLEMENT.STATUS IS 'Cтатус обработки (linked to operationStatus)'; +COMMENT ON COLUMN TRADE_SETTLEMENT.OPERATION_STATUS IS 'Cтатус обработки (linked to operationStatus)'; -- operation - Проводки -CREATE TABLE IF NOT EXISTS OPERATION(ID bigint PRIMARY KEY, ADDRESSEE_ID bigint, SENDER_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, OPERATION_TYPE_ID bigint, STATUS char(4)); +CREATE TABLE IF NOT EXISTS OPERATION(ID bigint PRIMARY KEY, ADDRESSEE_ID bigint, SENDER_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, OPERATION_TYPE_ID bigint, OPERATION_STATUS char(4)); COMMENT ON TABLE OPERATION IS 'Проводки'; COMMENT ON COLUMN OPERATION.ID IS 'Идентификатор записи'; @@ -1840,10 +2084,10 @@ COMMENT ON COLUMN OPERATION.CLEARING_DATE IS 'Дата расчета'; COMMENT ON COLUMN OPERATION.OPERATION_TYPE_ID IS 'Тип проводки (linked to operationType)'; -COMMENT ON COLUMN OPERATION.STATUS IS 'Cтатус обработки (linked to operationStatus)'; +COMMENT ON COLUMN OPERATION.OPERATION_STATUS IS 'Cтатус обработки (linked to operationStatus)'; -- paymentInstruction - Информация о денежных средствах -CREATE TABLE IF NOT EXISTS PAYMENT_INSTRUCTION(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SENDER_ID bigint, ADDRESSEE_ID bigint, ADRESSEE_B_I_C varchar(255), PAYEE_BANK_NAME bigint, PAYEE_B_I_C varchar(255), ADDRESSEE_BANK_NAME bigint, PAYMENT_DATE timestamp, _PAYMENT_PURPOSE varchar(255), SETTLEMENT_DATE date, CREDIT_LEG_AMOUNT bigint, DEBIT_LEG_AMOUNT bigint, CREDIT_LEG_ACCOUNT_ID bigint, CREDIT_CS_ACCOUNT varchar(255), CREDIT_LEG_ACCOUNT bigint, DEBIT_LEG_ACCOUNT_ID bigint, DEBIT_CS_ACCOUNT varchar(255), DEBIT_LEG_ACCOUNT bigint, CREDIT_LEG_DIRECTION bigint, DEBIT_LEG_DIRECTION bigint, CREDIT_LEG_CURRENCY_CODE char(4), DEBIT_LEG_CURRENCY_CODE char(4), CLEARING_DATE date, TRANSACTION_STATUS_ID bigint, DOCUMENT_NUMBER varchar(255)); +CREATE TABLE IF NOT EXISTS PAYMENT_INSTRUCTION(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SENDER_ID bigint, ADDRESSEE_ID bigint, ADRESSEE_B_I_C varchar(255), PAYEE_BANK_NAME varchar(255), PAYEE_B_I_C varchar(255), ADDRESSEE_BANK_NAME varchar(255), PAYMENT_DATE timestamp, _PAYMENT_PURPOSE varchar(255), SETTLEMENT_DATE date, CREDIT_LEG_AMOUNT bigint, DEBIT_LEG_AMOUNT bigint, CREDIT_LEG_ACCOUNT_ID bigint, CREDIT_CS_ACCOUNT varchar(255), CREDIT_LEG_ACCOUNT varchar(50), DEBIT_LEG_ACCOUNT_ID bigint, DEBIT_CS_ACCOUNT varchar(255), DEBIT_LEG_ACCOUNT varchar(50), CREDIT_LEG_DIRECTION bigint, DEBIT_LEG_DIRECTION bigint, CREDIT_LEG_CURRENCY_CODE char(4), DEBIT_LEG_CURRENCY_CODE char(4), CLEARING_DATE date, TRANSACTION_STATUS char(4), DOCUMENT_NUMBER varchar(255)); COMMENT ON TABLE PAYMENT_INSTRUCTION IS 'Информация о денежных средствах'; COMMENT ON COLUMN PAYMENT_INSTRUCTION.ID IS 'Идентификатор записи'; @@ -1858,11 +2102,11 @@ COMMENT ON COLUMN PAYMENT_INSTRUCTION.ADDRESSEE_ID IS 'Идентификато COMMENT ON COLUMN PAYMENT_INSTRUCTION.ADRESSEE_B_I_C IS 'Банковский идентификационный код (БИК) получателя'; -COMMENT ON COLUMN PAYMENT_INSTRUCTION.PAYEE_BANK_NAME IS 'Банк отправителя (linked to bankAccount)'; +COMMENT ON COLUMN PAYMENT_INSTRUCTION.PAYEE_BANK_NAME IS 'Банк отправителя'; COMMENT ON COLUMN PAYMENT_INSTRUCTION.PAYEE_B_I_C IS 'Банковский идентификационный код (БИК) отправителя'; -COMMENT ON COLUMN PAYMENT_INSTRUCTION.ADDRESSEE_BANK_NAME IS 'Банк получателя (linked to bankAccount)'; +COMMENT ON COLUMN PAYMENT_INSTRUCTION.ADDRESSEE_BANK_NAME IS 'Банк получателя'; COMMENT ON COLUMN PAYMENT_INSTRUCTION.PAYMENT_DATE IS 'Дата и время платежа'; @@ -1896,7 +2140,7 @@ COMMENT ON COLUMN PAYMENT_INSTRUCTION.DEBIT_LEG_CURRENCY_CODE IS 'Код вал COMMENT ON COLUMN PAYMENT_INSTRUCTION.CLEARING_DATE IS 'Дата расчета'; -COMMENT ON COLUMN PAYMENT_INSTRUCTION.TRANSACTION_STATUS_ID IS 'Cтатус транзакции (linked to transactionStatus)'; +COMMENT ON COLUMN PAYMENT_INSTRUCTION.TRANSACTION_STATUS IS 'Cтатус транзакции (linked to transactionStatus)'; COMMENT ON COLUMN PAYMENT_INSTRUCTION.DOCUMENT_NUMBER IS 'Номер документа в сторонней системе'; @@ -1944,7 +2188,7 @@ 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.CLEARING_MEMBER_CATEGORY IS 'Категория участника клиринга (linked to clearingMemberCategory)'; COMMENT ON COLUMN CHARGE_TARIFF.CHARGE_TYPE_ID IS 'Тип комиссии (linked to chargeType)'; @@ -1972,7 +2216,7 @@ COMMENT ON COLUMN CHARGE_TARIFF_HISTORY.ID IS 'Идентификатор'; COMMENT ON COLUMN CHARGE_TARIFF_HISTORY.MARKET IS 'Секция (linked to market)'; -COMMENT ON COLUMN CHARGE_TARIFF_HISTORY.CLEARING_MEMBER_CATEGORY IS 'Категория участника клиринга (linked to clearingCategory)'; +COMMENT ON COLUMN CHARGE_TARIFF_HISTORY.CLEARING_MEMBER_CATEGORY IS 'Категория участника клиринга (linked to clearingMemberCategory)'; COMMENT ON COLUMN CHARGE_TARIFF_HISTORY.CHARGE_TYPE_ID IS 'Тип комиссии (linked to chargeType)'; @@ -1998,7 +2242,7 @@ COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF.COMPANY_ID IS 'Участник (link 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.CLEARING_MEMBER_CATEGORY IS 'Категория участника клиринга (linked to clearingMemberCategory)'; COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF.CHARGE_TYPE_ID IS 'Тип комиссии (linked to chargeType)'; @@ -2028,7 +2272,7 @@ COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_HISTORY.COMPANY_ID IS 'Участни COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_HISTORY.MARKET IS 'Секция (linked to market)'; -COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_HISTORY.CLEARING_MEMBER_CATEGORY IS 'Категория участника клиринга (linked to clearingCategory)'; +COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_HISTORY.CLEARING_MEMBER_CATEGORY IS 'Категория участника клиринга (linked to clearingMemberCategory)'; COMMENT ON COLUMN INDIVIDUAL_CHARGE_TARIFF_HISTORY.CHARGE_TYPE_ID IS 'Тип комиссии (linked to chargeType)'; @@ -2052,7 +2296,7 @@ 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.CLEARING_MEMBER_CATEGORY IS 'Категория участника клиринга (linked to clearingMemberCategory)'; COMMENT ON COLUMN COMPANY_TARIFF.FULL_NAME IS 'Полное наименование Участника (linked to company)'; @@ -2088,7 +2332,7 @@ COMMENT ON COLUMN ERROR_TEXT.ERROR_CODE IS 'Код ошибки (linked to error COMMENT ON COLUMN ERROR_TEXT.TEXT IS 'Полный текст ошибки'; -COMMENT ON COLUMN ERROR_TEXT.USER_ID IS 'Автор сообщения (linked to user)'; +COMMENT ON COLUMN ERROR_TEXT.USER_ID IS 'Автор сообщения (linked to userCls)'; COMMENT ON COLUMN ERROR_TEXT.CLEARING_DATE IS 'Текущая дата'; @@ -2555,7 +2799,7 @@ COMMENT ON COLUMN S_DF11.GENERATION_TIME IS 'Дата и время создан COMMENT ON COLUMN S_DF11.GENERATION_ID IS 'Идентификатор взаимодействия'; -- sDf12 - ДФ-12 Из ПРЦ в КС Информация о блокировке/разблокировке/закрытии ТБС УК -CREATE TABLE IF NOT EXISTS S_DF12(ID bigint PRIMARY KEY, ACCOUNT varchar(25), DEAL varchar(4), STATUS numeric(72,18), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint); +CREATE TABLE IF NOT EXISTS S_DF12(ID bigint PRIMARY KEY, ACCOUNT varchar(25), DEAL varchar(4), STATUS bigint, FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint); COMMENT ON TABLE S_DF12 IS 'ДФ-12 Из ПРЦ в КС Информация о блокировке/разблокировке/закрытии ТБС УК'; COMMENT ON COLUMN S_DF12.ID IS 'Идентификатор записи'; @@ -2572,16 +2816,112 @@ COMMENT ON COLUMN S_DF12.GENERATION_TIME IS 'Дата и время обрабо COMMENT ON COLUMN S_DF12.GENERATION_ID IS 'Идентификатор взаимодействия'; --- sDf13 - ДФ 013 таблица находится на стадии разработки +-- sDf13 - ДФ-13 Вывод свободных средств для инициаторов категории В с клирингового счета 30414/7 - платежное поручение АО СПВБ на вывод средств из РО +CREATE TABLE IF NOT EXISTS S_DF13(ID bigint PRIMARY KEY, SEG_TYPE varchar(1), DOC_TYPE varchar, DOCNM_REF varchar(16), DOCNMPREV varchar(16), PRIORITY varchar(1), SBANKCODE varchar(12), C_ACC_DEB varchar(35), SBANKNAM1 varchar(35), SBANKNAM2 varchar(35), SBANKNAM3 varchar(35), SBANKNAM4 varchar(35), SBANKNAM5 varchar(35), RBANKCODE varchar(12), C_ACC_CRED varchar(35), RBANKNAM1 varchar(35), OP_TYPE varchar(2), OP_ORDER varchar(1), RBANKNAM4 varchar(35), RBANKNAM5 varchar(35), PAY_DATE varchar, EXT_DATE varchar, PAY_VAL varchar(12), SUM_DEB varchar, SCLIENTN1 varchar(35), INN_DEB varchar(12), KPP_DEB varchar(9), SCLIENTN4 varchar(35), SC_CODE varchar(12), ACC_DEB varchar(35), RCLIENTN1 varchar(35), INN_CRED varchar(12), KPP_CRED varchar(9), RCLIENTN4 varchar(35), ACC_KR_1 varchar(35), ACC_KR_2 varchar(35), SP_CODE varchar(2), SPECIF_1 varchar(35), SPECIF_2 varchar(35), SPECIF_3 varchar(35), SPECIF_4 varchar(35), SPECIF_5 varchar(35), SPECIF_6 varchar(35), SEND_TYPE varchar(10), SERVDATE varchar(8), DOC_RESULT varchar(2), GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF13 IS 'ДФ-13 Вывод свободных средств для инициаторов категории В с клирингового счета 30414/7 - платежное поручение АО СПВБ на вывод средств из РО'; + +COMMENT ON COLUMN S_DF13.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF13.SEG_TYPE IS 'Код инициатора в КС'; + +COMMENT ON COLUMN S_DF13.DOC_TYPE IS 'Тип документа'; + +COMMENT ON COLUMN S_DF13.DOCNM_REF IS 'Ссылочный номер документа у отправителя'; + +COMMENT ON COLUMN S_DF13.DOCNMPREV IS 'Ссылка на предшестввующий документ'; + +COMMENT ON COLUMN S_DF13.PRIORITY IS 'Приоритет скорости отправления сообщения'; + +COMMENT ON COLUMN S_DF13.SBANKCODE IS 'Код банка-плательщика'; + +COMMENT ON COLUMN S_DF13.C_ACC_DEB IS 'Кор счет банка - плательщика в системе - акт.'; + +COMMENT ON COLUMN S_DF13.SBANKNAM1 IS 'Наименование банка-плательщика'; + +COMMENT ON COLUMN S_DF13.SBANKNAM2 IS ''; + +COMMENT ON COLUMN S_DF13.SBANKNAM3 IS ''; + +COMMENT ON COLUMN S_DF13.SBANKNAM4 IS ''; + +COMMENT ON COLUMN S_DF13.SBANKNAM5 IS ''; + +COMMENT ON COLUMN S_DF13.RBANKCODE IS 'Код банка-получателя'; + +COMMENT ON COLUMN S_DF13.C_ACC_CRED IS 'Кор счет банка - получателя в системе - акт. '; + +COMMENT ON COLUMN S_DF13.RBANKNAM1 IS 'Наименование банка-получателя'; + +COMMENT ON COLUMN S_DF13.OP_TYPE IS 'Вид операции'; + +COMMENT ON COLUMN S_DF13.OP_ORDER IS 'Очередность платежа'; + +COMMENT ON COLUMN S_DF13.RBANKNAM4 IS ''; + +COMMENT ON COLUMN S_DF13.RBANKNAM5 IS ''; + +COMMENT ON COLUMN S_DF13.PAY_DATE IS 'Платеж-дата'; + +COMMENT ON COLUMN S_DF13.EXT_DATE IS 'Дата по выписке'; + +COMMENT ON COLUMN S_DF13.PAY_VAL IS 'Валюта платежа'; + +COMMENT ON COLUMN S_DF13.SUM_DEB IS 'Сумма дебет '; + +COMMENT ON COLUMN S_DF13.SCLIENTN1 IS 'Наименование клиента-плательщика'; + +COMMENT ON COLUMN S_DF13.INN_DEB IS 'ИНН клиента-плательщика'; + +COMMENT ON COLUMN S_DF13.KPP_DEB IS 'КПП клиента-плательщика'; + +COMMENT ON COLUMN S_DF13.SCLIENTN4 IS ''; + +COMMENT ON COLUMN S_DF13.SC_CODE IS 'Код клиента-плательщика'; + +COMMENT ON COLUMN S_DF13.ACC_DEB IS 'Счет клиента-плательщика(дебет)'; + +COMMENT ON COLUMN S_DF13.RCLIENTN1 IS 'Наименование клиента-получателя'; + +COMMENT ON COLUMN S_DF13.INN_CRED IS 'ИНН клиента-получателя'; + +COMMENT ON COLUMN S_DF13.KPP_CRED IS 'КПП клиента-получателя'; + +COMMENT ON COLUMN S_DF13.RCLIENTN4 IS ''; + +COMMENT ON COLUMN S_DF13.ACC_KR_1 IS 'Счет получателя'; + +COMMENT ON COLUMN S_DF13.ACC_KR_2 IS ''; + +COMMENT ON COLUMN S_DF13.SP_CODE IS 'Код назначения платежа'; + +COMMENT ON COLUMN S_DF13.SPECIF_1 IS 'Назначение платежа'; + +COMMENT ON COLUMN S_DF13.SPECIF_2 IS 'Назначение платежа'; + +COMMENT ON COLUMN S_DF13.SPECIF_3 IS 'Назначение платежа'; + +COMMENT ON COLUMN S_DF13.SPECIF_4 IS 'Назначение платежа'; + +COMMENT ON COLUMN S_DF13.SPECIF_5 IS 'Назначение платежа'; + +COMMENT ON COLUMN S_DF13.SPECIF_6 IS 'Назначение платежа'; + +COMMENT ON COLUMN S_DF13.SEND_TYPE IS 'Вид платежа'; + +COMMENT ON COLUMN S_DF13.SERVDATE IS 'Дата получения товара, оказания услуг в плат. поручении'; + +COMMENT ON COLUMN S_DF13.DOC_RESULT IS ''; + +COMMENT ON COLUMN S_DF13.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF13.GENERATION_ID IS 'Идентификатор взаимодействия'; -- sDf16 - ДФ-16 Формат запроса по возврату депозита или дозачисление/списание денежных средств -CREATE TABLE IF NOT EXISTS S_DF16(ID bigint PRIMARY KEY, DATE timestamp, ACCOUNT varchar(20), SUM numeric(72,18), MARKET varchar(1), TYPE varchar(1), _I_N_N numeric(72,18), _B_I_C numeric(72,18), _S_P_E_C varchar(255), NUMBER numeric(72,18), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint); +CREATE TABLE IF NOT EXISTS S_DF16(ID bigint PRIMARY KEY, ACCOUNT varchar(20), SUM numeric(72,18), MARKET varchar(1), TYPE varchar(1), _I_N_N numeric(72,18), _B_I_C numeric(72,18), _S_P_E_C varchar(255), NUMBER numeric(72,18), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint); COMMENT ON TABLE S_DF16 IS 'ДФ-16 Формат запроса по возврату депозита или дозачисление/списание денежных средств'; COMMENT ON COLUMN S_DF16.ID IS 'Идентификатор записи'; -COMMENT ON COLUMN S_DF16.DATE IS 'Дата обработки записи'; - COMMENT ON COLUMN S_DF16.ACCOUNT IS 'Номер счета участника торгов'; COMMENT ON COLUMN S_DF16.SUM IS 'Сумма платежного документа (операции)'; @@ -2605,7 +2945,7 @@ COMMENT ON COLUMN S_DF16.GENERATION_TIME IS 'Дата и время обрабо COMMENT ON COLUMN S_DF16.GENERATION_ID IS 'Идентификатор взаимодействия'; -- sDf17 - ДФ-17 Формат ответа на запрос по возврату депозита или дозачисление/списание денежных средств -CREATE TABLE IF NOT EXISTS S_DF17(ID bigint PRIMARY KEY, ACCOUNT varchar(20), SUM numeric(72,18), MARKET varchar(1), TYPE varchar(1), _I_N_N numeric(72,18), _B_I_C numeric(72,18), _S_P_E_C varchar(255), NUMBER numeric(72,18), RESULT varchar(3), GENERATION_TIME timestamp, GENERATION_ID bigint, IN_S_DF16_ID bigint); +CREATE TABLE IF NOT EXISTS S_DF17(ID bigint PRIMARY KEY, ACCOUNT varchar(20), SUM numeric(72,18), MARKET varchar(1), TYPE varchar(1), _I_N_N numeric(72,18), _B_I_C numeric(72,18), _S_P_E_C varchar(255), NUMBER numeric(72,18), RESULT numeric(72,18), GENERATION_TIME timestamp, GENERATION_ID bigint, IN_S_DF16_ID bigint); COMMENT ON TABLE S_DF17 IS 'ДФ-17 Формат ответа на запрос по возврату депозита или дозачисление/списание денежных средств'; COMMENT ON COLUMN S_DF17.ID IS 'Идентификатор записи'; @@ -2635,7 +2975,7 @@ COMMENT ON COLUMN S_DF17.GENERATION_ID IS 'Идентификатор взаим COMMENT ON COLUMN S_DF17.IN_S_DF16_ID IS 'Идентификатор соответствующей записи из таблицы-источника'; -- sDf18 - ДФ-18 Из КС в ПРЦ Квитанция о получении информации о состоянии счета (блокировка/разблокировка/закрытие) -CREATE TABLE IF NOT EXISTS S_DF18(ID bigint PRIMARY KEY, ACCOUNT varchar(25), DEAL varchar(4), STATUS numeric(72,18), RESULT numeric(72,18), GENERATION_TIME timestamp, GENERATION_ID bigint, IN_S_DF12_ID bigint); +CREATE TABLE IF NOT EXISTS S_DF18(ID bigint PRIMARY KEY, ACCOUNT varchar(25), DEAL varchar(4), STATUS bigint, RESULT numeric(72,18), GENERATION_TIME timestamp, GENERATION_ID bigint, IN_S_DF12_ID bigint); COMMENT ON TABLE S_DF18 IS 'ДФ-18 Из КС в ПРЦ Квитанция о получении информации о состоянии счета (блокировка/разблокировка/закрытие)'; COMMENT ON COLUMN S_DF18.ID IS 'Идентификатор записи'; @@ -2654,6 +2994,128 @@ COMMENT ON COLUMN S_DF18.GENERATION_ID IS 'Идентификатор взаим COMMENT ON COLUMN S_DF18.IN_S_DF12_ID IS 'Идентификатор соответствующей записи из таблицы-источника'; +-- trade_arqa - Выгрузка сделок из торговой системы +CREATE TABLE IF NOT EXISTS TRADE_ARQA(TRADE_NUM numeric(72,18), SEC_CODE varchar(255), TRADE_DATE_TIME timestamp, SETTLE_DATE date, PRICE numeric(72,18), VALUE numeric(72,18), QTY numeric(72,18), ACCRUEDINT numeric(72,18), FIRM_ID varchar(255), CLIENT_CODE varchar(255), EXCHANGE_COMMISSION numeric(72,18), CLASS_CODE varchar(255), OPERATION varchar(255), ISSUE_ACCOUNT varchar(255), MONEY_ACCOUNT varchar(255), TRADE_TYPE char(4), DAYS_TO_MAT_DATE numeric(72,18), COLLATERAL char(4), SETTLE_CODE varchar(255)); +COMMENT ON TABLE TRADE_ARQA IS 'Выгрузка сделок из торговой системы'; + +COMMENT ON COLUMN TRADE_ARQA.TRADE_NUM IS 'Номер сделки'; + +COMMENT ON COLUMN TRADE_ARQA.SEC_CODE IS 'Код ценной бумаги'; + +COMMENT ON COLUMN TRADE_ARQA.TRADE_DATE_TIME IS 'Дата-время сделки'; + +COMMENT ON COLUMN TRADE_ARQA.SETTLE_DATE IS 'Плановая дата исполнения сделки'; + +COMMENT ON COLUMN TRADE_ARQA.PRICE IS 'Цена сделки'; + +COMMENT ON COLUMN TRADE_ARQA.VALUE IS 'Сумма сделки'; + +COMMENT ON COLUMN TRADE_ARQA.QTY IS 'Количество лотов по сделке'; + +COMMENT ON COLUMN TRADE_ARQA.ACCRUEDINT IS 'НКД за 1 ценную бумагу'; + +COMMENT ON COLUMN TRADE_ARQA.FIRM_ID IS 'ID клиента в КС'; + +COMMENT ON COLUMN TRADE_ARQA.CLIENT_CODE IS 'Код участника торгов = Код участника клиринга = Код участника расчетов'; + +COMMENT ON COLUMN TRADE_ARQA.EXCHANGE_COMMISSION IS 'Комиссия по сделке'; + +COMMENT ON COLUMN TRADE_ARQA.CLASS_CODE IS 'Код класса сделки из новой ТС'; + +COMMENT ON COLUMN TRADE_ARQA.OPERATION IS 'Тип плеча (Купля/Продажа)'; + +COMMENT ON COLUMN TRADE_ARQA.ISSUE_ACCOUNT IS 'Счет для учета ценной бумаги'; + +COMMENT ON COLUMN TRADE_ARQA.MONEY_ACCOUNT IS 'Счет для учета денежных средств'; + +COMMENT ON COLUMN TRADE_ARQA.TRADE_TYPE IS 'Первичное размещение/торги'; + +COMMENT ON COLUMN TRADE_ARQA.DAYS_TO_MAT_DATE IS 'Количество дней до погашения'; + +COMMENT ON COLUMN TRADE_ARQA.COLLATERAL IS 'Признак залога (не используется)'; + +COMMENT ON COLUMN TRADE_ARQA.SETTLE_CODE IS 'Код периода сделки из новой ТС'; + +-- notification - Сообщения +CREATE TABLE IF NOT EXISTS NOTIFICATION(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, SENDER_ID bigint, ADDRESSEE_ID bigint, OBJECT_TYPE char(4), OBJECT_ID timestamp, NOTIFICATION_STATUS char(4)); +COMMENT ON TABLE NOTIFICATION IS 'Сообщения'; + +COMMENT ON COLUMN NOTIFICATION.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN NOTIFICATION.CREATED_AT IS 'Дата и время создания записи'; + +COMMENT ON COLUMN NOTIFICATION.UPDATED_AT IS 'Дата и время изменения записи'; + +COMMENT ON COLUMN NOTIFICATION.CLEARING_DATE IS 'Дата'; + +COMMENT ON COLUMN NOTIFICATION.SENDER_ID IS 'Идентификатор участника отправителя (linked to company)'; + +COMMENT ON COLUMN NOTIFICATION.ADDRESSEE_ID IS 'Идентификатор участника получателя (linked to company)'; + +COMMENT ON COLUMN NOTIFICATION.OBJECT_TYPE IS 'Тип объекта (linked to objectType)'; + +COMMENT ON COLUMN NOTIFICATION.OBJECT_ID IS 'Идентификатор объекта'; + +COMMENT ON COLUMN NOTIFICATION.NOTIFICATION_STATUS IS 'Статус сообщения (linked to notificationStatus)'; + + +-- History log of notification - Сообщения +CREATE TABLE IF NOT EXISTS NOTIFICATION_HISTORY(NOTIFICATION_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, SENDER_ID bigint, ADDRESSEE_ID bigint, OBJECT_TYPE char(4), OBJECT_ID timestamp, NOTIFICATION_STATUS char(4)); +COMMENT ON TABLE NOTIFICATION_HISTORY IS 'История изменений таблицы notification'; +COMMENT ON COLUMN NOTIFICATION_HISTORY.NOTIFICATION_ID IS 'Идентификатор записи в таблице NOTIFICATION'; +COMMENT ON COLUMN NOTIFICATION_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN NOTIFICATION_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; + +COMMENT ON COLUMN NOTIFICATION_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN NOTIFICATION_HISTORY.CREATED_AT IS 'Дата и время создания записи'; + +COMMENT ON COLUMN NOTIFICATION_HISTORY.UPDATED_AT IS 'Дата и время изменения записи'; + +COMMENT ON COLUMN NOTIFICATION_HISTORY.CLEARING_DATE IS 'Дата'; + +COMMENT ON COLUMN NOTIFICATION_HISTORY.SENDER_ID IS 'Идентификатор участника отправителя (linked to company)'; + +COMMENT ON COLUMN NOTIFICATION_HISTORY.ADDRESSEE_ID IS 'Идентификатор участника получателя (linked to company)'; + +COMMENT ON COLUMN NOTIFICATION_HISTORY.OBJECT_TYPE IS 'Тип объекта (linked to objectType)'; + +COMMENT ON COLUMN NOTIFICATION_HISTORY.OBJECT_ID IS 'Идентификатор объекта'; + +COMMENT ON COLUMN NOTIFICATION_HISTORY.NOTIFICATION_STATUS IS 'Статус сообщения (linked to notificationStatus)'; + +-- session - Клиринговая сессия +CREATE TABLE IF NOT EXISTS SESSION(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, SESSION_STATUS char(4)); +COMMENT ON TABLE SESSION IS 'Клиринговая сессия'; + +COMMENT ON COLUMN SESSION.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN SESSION.CREATED_AT IS 'Дата и время создания записи'; + +COMMENT ON COLUMN SESSION.UPDATED_AT IS 'Дата и время изменения записи'; + +COMMENT ON COLUMN SESSION.CLEARING_DATE IS 'Дата'; + +COMMENT ON COLUMN SESSION.SESSION_STATUS IS 'Статус клиринговой сессии (linked to sessionStatus)'; + + +-- History log of session - Клиринговая сессия +CREATE TABLE IF NOT EXISTS SESSION_HISTORY(SESSION_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, SESSION_STATUS char(4)); +COMMENT ON TABLE SESSION_HISTORY IS 'История изменений таблицы session'; +COMMENT ON COLUMN SESSION_HISTORY.SESSION_ID IS 'Идентификатор записи в таблице SESSION'; +COMMENT ON COLUMN SESSION_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN SESSION_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; + +COMMENT ON COLUMN SESSION_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN SESSION_HISTORY.CREATED_AT IS 'Дата и время создания записи'; + +COMMENT ON COLUMN SESSION_HISTORY.UPDATED_AT IS 'Дата и время изменения записи'; + +COMMENT ON COLUMN SESSION_HISTORY.CLEARING_DATE IS 'Дата'; + +COMMENT ON COLUMN SESSION_HISTORY.SESSION_STATUS IS 'Статус клиринговой сессии (linked to sessionStatus)'; + /* views */ -- Data types diff --git a/clearing-parent/dbf-exporter/pom.xml b/clearing-parent/dbf-exporter/pom.xml index 5fd93f86d..fc2108169 100644 --- a/clearing-parent/dbf-exporter/pom.xml +++ b/clearing-parent/dbf-exporter/pom.xml @@ -41,6 +41,10 @@ ru.spcex.platform platform-imdg-api-hazelcast-impl + + ru.spcex.platform + platform-messaging + ru.spcex.clearing classes diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java index ba9acb1ef..10261ad81 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/DBFExporterConfig.java @@ -7,10 +7,10 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings; import ru.spcex.clearing.dbf.exporter.logic.stages.ExportFromHazelcast; import ru.spcex.clearing.dbf.exporter.logic.stages.PrepareDBFFile; import ru.spcex.clearing.dbf.exporter.logic.stages.Stage; -import ru.spcex.clearing.dbf.exporter.properties.AProperties; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; @@ -22,13 +22,6 @@ import java.util.List; @EnableConfigurationProperties @ComponentScan(basePackages = {"ru.spcex.clearing.dbf.exporter"}) public class DBFExporterConfig { - private final AProperties properties; - private final ApplicationContext context; - - public DBFExporterConfig(@Qualifier("dbfExporterProperties") AProperties properties, ApplicationContext context) { - this.properties = properties; - this.context = context; - } @Bean("taskExecutorHazelcastClientInitializer") public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() { @@ -43,17 +36,16 @@ public class DBFExporterConfig { @Bean("imdgProvider") public ImdgProvider imdgProvider(@Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, - AProperties properties) { + ExportDBFServiceSettings settings) { HazelcastClientParams params = new HazelcastClientParams(); - params.setClusterMembers(properties.getHazelcastClusterMembers()); - params.setLogin(properties.getHazelcastLogin()); - params.setPassword(properties.getHazelcastPassword()); -// params.setInstanceName("dbf-exporter"); + params.setClusterMembers(settings.getHazelcast().getClusterMembers()); + params.setLogin(settings.getHazelcast().getLogin()); + params.setPassword(settings.getHazelcast().getPassword()); return new HazelcastService(taskExecutorHazelcastClientInitializer, taskExecutorIdGeneratorAwaiter, params); } @Bean("pipeline") - public List pipeline() { + public List pipeline(ApplicationContext context) { List pipeline = new LinkedList<>(); pipeline.add(context.getBean(PrepareDBFFile.class)); @@ -63,11 +55,11 @@ public class DBFExporterConfig { } @Bean("executor") - public ThreadPoolTaskExecutor executor() { + public ThreadPoolTaskExecutor executor(ExportDBFServiceSettings settings) { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setMaxPoolSize(properties.getThreadsCount()); - executor.setCorePoolSize(properties.getThreadsCount()); - executor.setThreadNamePrefix("dbf-exporter-thread-"); + executor.setMaxPoolSize(settings.getCommon().getThreadsCount()); + executor.setCorePoolSize(settings.getCommon().getThreadsCount()); + executor.setThreadNamePrefix("dbf-exporter"); executor.setWaitForTasksToCompleteOnShutdown(true); executor.setAwaitTerminationSeconds(300); executor.initialize(); diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaConfig.java new file mode 100644 index 000000000..73840d3e5 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/KafkaConfig.java @@ -0,0 +1,21 @@ +package ru.spcex.clearing.dbf.exporter.config; + +import org.apache.kafka.clients.consumer.Consumer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings; +import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory; + +@Configuration +public class KafkaConfig { + + @Autowired + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + @Bean + public Consumer createConsumer(ExportDBFServiceSettings settings) { + return KafkaConsumerFactory.consumer(settings.getKafkaConsumer()); + } +} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Common.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Common.java new file mode 100644 index 000000000..1d2fbf854 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Common.java @@ -0,0 +1,32 @@ +package ru.spcex.clearing.dbf.exporter.config.settings; + +public class Common { + + private String encoding; + private int insertBatchSize; + private int threadsCount; + + public String getEncoding() { + return encoding; + } + + public void setEncoding(String encoding) { + this.encoding = encoding; + } + + public int getInsertBatchSize() { + return insertBatchSize; + } + + public void setInsertBatchSize(int insertBatchSize) { + this.insertBatchSize = insertBatchSize; + } + + public int getThreadsCount() { + return threadsCount; + } + + public void setThreadsCount(int threadsCount) { + this.threadsCount = threadsCount; + } +} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Cron.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Cron.java new file mode 100644 index 000000000..ff7f8bda8 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Cron.java @@ -0,0 +1,14 @@ +package ru.spcex.clearing.dbf.exporter.config.settings; + +public class Cron { + + private String checkSrcDirCron; + + public String getCheckSrcDirCron() { + return checkSrcDirCron; + } + + public void setCheckSrcDirCron(String checkSrcDirCron) { + this.checkSrcDirCron = checkSrcDirCron; + } +} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/ExportDBFServiceSettings.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/ExportDBFServiceSettings.java new file mode 100644 index 000000000..8166f7931 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/ExportDBFServiceSettings.java @@ -0,0 +1,58 @@ +package ru.spcex.clearing.dbf.exporter.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("export-dbf-service") +public class ExportDBFServiceSettings { + private HazelcastClientParams hazelcast; + private KafkaConsumerSettings kafkaConsumer; + private Common common; + private Store store; + private Cron cron; + + public HazelcastClientParams getHazelcast() { + return hazelcast; + } + + public void setHazelcast(HazelcastClientParams hazelcast) { + this.hazelcast = hazelcast; + } + + public KafkaConsumerSettings getKafkaConsumer() { + return kafkaConsumer; + } + + public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) { + this.kafkaConsumer = kafkaConsumer; + } + + public Common getCommon() { + return common; + } + + public void setCommon(Common common) { + this.common = common; + } + + public Store getStore() { + return store; + } + + public void setStore(Store store) { + this.store = store; + } + + public Cron getCron() { + return cron; + } + + public void setCron(Cron cron) { + this.cron = cron; + } +} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Store.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Store.java new file mode 100644 index 000000000..e1430418a --- /dev/null +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/settings/Store.java @@ -0,0 +1,14 @@ +package ru.spcex.clearing.dbf.exporter.config.settings; + +public class Store { + + private String outDir; + + public String getOutDir() { + return outDir; + } + + public void setOutDir(String outDir) { + this.outDir = outDir; + } +} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/controller/DefaultController.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/controller/ExporterController.java similarity index 57% rename from clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/controller/DefaultController.java rename to clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/controller/ExporterController.java index 0cd525aa0..a82bd0f32 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/controller/DefaultController.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/controller/ExporterController.java @@ -10,37 +10,23 @@ 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; -import ru.spcex.clearing.dbf.exporter.logic.data.IFilter; -import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; import ru.spcex.clearing.dbf.exporter.services.DBFExportService; -import java.util.EnumMap; -import java.util.Map; - @Controller("/") -public class DefaultController implements InitializingBean { +public class ExporterController implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final DBFExportService dbfExportService; - public DefaultController(@Qualifier("dbfExportService") DBFExportService dbfExportService) { + public ExporterController(@Qualifier("dbfExportService") DBFExportService dbfExportService) { this.dbfExportService = dbfExportService; } - @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"; - } - @RequestMapping(method = RequestMethod.GET, path = "/export", produces = MediaType.TEXT_PLAIN_VALUE) @ResponseBody public String exportTables() { log.info("Call export method for exporter controller"); - Map tablesForExport = new EnumMap<>(Table.class); - for (Table table : Table.values()) tablesForExport.put(table, null); - dbfExportService.run(tablesForExport); - return "export done, see log"; + dbfExportService.run(); + return "export done"; } @Override diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/IFilter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/IFilter.java deleted file mode 100644 index 56c45b249..000000000 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/IFilter.java +++ /dev/null @@ -1,8 +0,0 @@ -package ru.spcex.clearing.dbf.exporter.logic.data; - -/** - * Фильтр записей для экспорта - */ -public interface IFilter { - -} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/ResultContainer.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/ResultContainer.java index 9513b0c4f..0ad0d79fd 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/ResultContainer.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/data/ResultContainer.java @@ -11,15 +11,14 @@ import java.util.UUID; public class ResultContainer { private UUID uuid; private Table tableForExport; - private IFilter filter; private File fileForExport; + private Long groupId; protected ResultContainer() {} - public static ResultContainer createNewTask(Table tableForExport, IFilter filter) { + public static ResultContainer createNewTask(Table tableForExport) { ResultContainer container = new ResultContainer(); container.tableForExport = tableForExport; - container.filter = filter; container.uuid = UUID.randomUUID(); return container; } @@ -32,14 +31,6 @@ public class ResultContainer { this.tableForExport = tableForExport; } - public IFilter getFilter() { - return filter; - } - - public void setFilter(IFilter filter) { - this.filter = filter; - } - public File getFileForExport() { return fileForExport; } @@ -55,4 +46,12 @@ public class ResultContainer { public void setUuid(UUID uuid) { this.uuid = uuid; } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java index 5ee1f3e07..57899ab4a 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/ExportFromHazelcast.java @@ -6,12 +6,11 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.sdf.*; +import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings; import ru.spcex.clearing.dbf.exporter.exceptions.ConfigException; -import ru.spcex.clearing.dbf.exporter.logic.data.IFilter; import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer; import ru.spcex.clearing.dbf.exporter.logic.data.enums.StageResult; import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; -import ru.spcex.clearing.dbf.exporter.properties.AProperties; import ru.spcex.clearing.dbf.exporter.services.converters.*; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.imdg.api.Imdg; @@ -29,7 +28,7 @@ import java.util.Objects; */ @Component public class ExportFromHazelcast extends Stage implements InitializingBean { - private final AProperties properties; + private final ExportDBFServiceSettings settings; private final ImdgProvider imdgProvider; private final S_DF02_Converter s_df02_converter; @@ -41,14 +40,14 @@ public class ExportFromHazelcast extends Stage implements InitializingBean { private final Map dbfFieldsForTable = new HashMap<>(); private Charset dbfCharset; - public ExportFromHazelcast(@Qualifier("dbfExporterProperties") AProperties properties, + public ExportFromHazelcast(ExportDBFServiceSettings settings, @Qualifier("imdgProvider") ImdgProvider imdgProvider, S_DF02_Converter s_df02_converter, S_DF08_Converter s_df08_converter, S_DF18_Converter s_df18_converter, S_DF10_Converter s_df10_converter, S_DF17_Converter s_df17_converter) { - this.properties = properties; + this.settings = settings; this.imdgProvider = imdgProvider; this.s_df02_converter = s_df02_converter; this.s_df08_converter = s_df08_converter; @@ -63,20 +62,24 @@ public class ExportFromHazelcast extends Stage implements InitializingBean { Objects.requireNonNull(resultContainer.getFileForExport()); Table table = resultContainer.getTableForExport(); - IFilter filter = resultContainer.getFilter(); - Imdg map = imdgProvider.getImdg(table.getHazelcastMapName(), table.getEntityClass()); File dbfFile = resultContainer.getFileForExport(); boolean writeOk = false; boolean emptyMap = true; try (DBFWriter dbfWriter = new DBFWriter(dbfFile, dbfCharset)) { dbfWriter.setFields(dbfFieldsForTable.get(table)); - Collection allValues = map.getAllValues(); - if (allValues.isEmpty()) { + Collection tableRows; + if (resultContainer.getGroupId() != null) { + Map queryParams = Map.of("generationId", resultContainer.getGroupId()); + tableRows = map.getCollectionObjectsByFieldValues(queryParams); + } else { + tableRows = map.getAllValues(); + } + if (tableRows.isEmpty()) { log.info("uuid {}. Map {} is empty.", resultContainer.getUuid(), resultContainer.getTableForExport().getHazelcastMapName()); return StageResult.COMPLETE; } - for (SpcexObjectBase value : allValues) { + for (SpcexObjectBase value : tableRows) { Object[] values; if (value instanceof SDf02 sDf02Value) values = s_df02_converter.toObjectArray(sDf02Value); else if (value instanceof SDf08 sDf08Value) values = s_df08_converter.toObjectArray(sDf08Value); @@ -87,7 +90,7 @@ public class ExportFromHazelcast extends Stage implements InitializingBean { dbfWriter.addRecord(values); } writeOk = true; - emptyMap = allValues.isEmpty(); + emptyMap = tableRows.isEmpty(); } catch (Exception e) { log.error(String.format("uuid %s. Can't export table %s to file %s. Table was skipped.", resultContainer.getUuid(), table, dbfFile), e); return StageResult.ERROR; @@ -126,9 +129,9 @@ public class ExportFromHazelcast extends Stage implements InitializingBean { private void initDBFCharset() { try { - dbfCharset = Charset.forName(properties.getDbfEncoding()); + dbfCharset = Charset.forName(settings.getCommon().getEncoding()); } catch (Exception e) { - throw new ConfigException("В properties файле содержится неизвестная кодировка: " + properties.getDbfEncoding(), e); + throw new ConfigException("В properties файле содержится неизвестная кодировка: " + settings.getCommon().getEncoding(), e); } } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java index b4dcea1f2..a0743322c 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/logic/stages/PrepareDBFFile.java @@ -1,12 +1,11 @@ package ru.spcex.clearing.dbf.exporter.logic.stages; import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; +import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings; import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer; import ru.spcex.clearing.dbf.exporter.logic.data.enums.StageResult; import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; -import ru.spcex.clearing.dbf.exporter.properties.AProperties; import java.io.File; import java.io.IOException; @@ -24,13 +23,13 @@ import java.util.Objects; public class PrepareDBFFile extends Stage implements InitializingBean { private static final String SECTION = "U"; private static final String CODE_OF_MEMBER = null; - private static DateTimeFormatter tsFormatter = DateTimeFormatter.ofPattern("yyMMddHHmm"); - private static DateTimeFormatter utilFormatter = DateTimeFormatter.ofPattern("yyMMdd"); - private final AProperties properties; + private static final DateTimeFormatter tsFormatter = DateTimeFormatter.ofPattern("yyMMddHHmm"); + private static final DateTimeFormatter utilFormatter = DateTimeFormatter.ofPattern("yyMMdd"); + private final ExportDBFServiceSettings settings; private String outDir; - public PrepareDBFFile(@Qualifier("dbfExporterProperties") AProperties properties) { - this.properties = properties; + public PrepareDBFFile(ExportDBFServiceSettings settings) { + this.settings = settings; } @Override @@ -54,7 +53,7 @@ public class PrepareDBFFile extends Stage implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { - String outDirPath = properties.getOutDir(); + String outDirPath = settings.getStore().getOutDir(); File outDirFile = new File(outDirPath); if (outDirFile.exists() && !outDirFile.isDirectory()) throw new IOException("Output directory " + outDirPath + " is file."); diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/properties/AProperties.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/properties/AProperties.java deleted file mode 100644 index 46ee82324..000000000 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/properties/AProperties.java +++ /dev/null @@ -1,74 +0,0 @@ -package ru.spcex.clearing.dbf.exporter.properties; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -@Component("dbfExporterProperties") -public class AProperties { - - @Value("${hazelcast.cluster-members}") - private String hazelcastClusterMembers; - - @Value("${hazelcast.login}") - private String hazelcastLogin; - - @Value("${hazelcast.password}") - private String hazelcastPassword; - - @Value("${dbf.out-dir}") - private String outDir; - - @Value("${dbf.encoding}") - private String dbfEncoding; - - @Value("${dbf.threads-count}") - private int threadsCount; - - public String getHazelcastClusterMembers() { - return hazelcastClusterMembers; - } - - public void setHazelcastClusterMembers(String hazelcastClusterMembers) { - this.hazelcastClusterMembers = hazelcastClusterMembers; - } - - public String getHazelcastLogin() { - return hazelcastLogin; - } - - public void setHazelcastLogin(String hazelcastLogin) { - this.hazelcastLogin = hazelcastLogin; - } - - public String getHazelcastPassword() { - return hazelcastPassword; - } - - public void setHazelcastPassword(String hazelcastPassword) { - this.hazelcastPassword = hazelcastPassword; - } - - public String getOutDir() { - return outDir; - } - - public void setOutDir(String outDir) { - this.outDir = outDir; - } - - public String getDbfEncoding() { - return dbfEncoding; - } - - public void setDbfEncoding(String dbfEncoding) { - this.dbfEncoding = dbfEncoding; - } - - public int getThreadsCount() { - return threadsCount; - } - - public void setThreadsCount(int threadsCount) { - this.threadsCount = threadsCount; - } -} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/CommandService.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/CommandService.java new file mode 100644 index 000000000..5dd0ac22d --- /dev/null +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/CommandService.java @@ -0,0 +1,51 @@ +package ru.spcex.clearing.dbf.exporter.services; + +import org.apache.kafka.clients.consumer.Consumer; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Service; +import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer; +import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; +import ru.spcex.clearing.dbf.exporter.logic.stages.Processor; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileRequest; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.util.Arrays; +import java.util.Optional; + +@Service +public class CommandService extends QueueConsumer implements InitializingBean { + + private final ImdgProvider imdgProvider; + private final Processor processor; + + public CommandService(Consumer kafkaQueue, + ImdgProvider imdgProvider, + Processor processor) { + super(kafkaQueue); + this.imdgProvider = imdgProvider; + this.processor = processor; + } + + @Override + public void afterPropertiesSet() throws Exception { + callback(ExportToFileRequest.class) + .setConsumer(this::process) + .forDestination(Consts.EXPORT_PROCESS, callbacks::put); + init(); + } + + private void process(BaseRequest systemRequest) { + ExportToFileRequest request = systemRequest.getRequestPayload(); + Optional tableForExport = Arrays.stream(Table.values()). + filter(table -> table.getFilePrefix().equalsIgnoreCase(request.getNameOfTable())).findFirst(); + if (tableForExport.isEmpty()) { + throw new IllegalStateException("Unsupported table prefix"); + } + ResultContainer resultContainer = ResultContainer.createNewTask(tableForExport.get()); + resultContainer.setGroupId(request.getSdfGroupId()); + processor.process(resultContainer); + } +} diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/DBFExportService.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/DBFExportService.java index fd1bc1a8f..51c0eb6d7 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/DBFExportService.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/DBFExportService.java @@ -3,13 +3,10 @@ package ru.spcex.clearing.dbf.exporter.services; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; -import ru.spcex.clearing.dbf.exporter.logic.data.IFilter; import ru.spcex.clearing.dbf.exporter.logic.data.ResultContainer; import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; import ru.spcex.clearing.dbf.exporter.logic.stages.Processor; -import java.util.Map; - @Service("dbfExportService") public class DBFExportService { private final ThreadPoolTaskExecutor executor; @@ -21,11 +18,9 @@ public class DBFExportService { this.processor = processor; } - public void run(Map tablesForExport) { - for (Map.Entry tableForExport : tablesForExport.entrySet()) { - Table table = tableForExport.getKey(); - IFilter filter = tableForExport.getValue(); - executor.submit(() -> processor.process(ResultContainer.createNewTask(table, filter))); + public void run() { + for (Table tableForExport : Table.values()) { + executor.submit(() -> processor.process(ResultContainer.createNewTask(tableForExport))); } } diff --git a/clearing-parent/dbf-exporter/src/main/resources/application.properties b/clearing-parent/dbf-exporter/src/main/resources/application.properties index 5fc2e1ad8..e0f15cb7a 100644 --- a/clearing-parent/dbf-exporter/src/main/resources/application.properties +++ b/clearing-parent/dbf-exporter/src/main/resources/application.properties @@ -2,11 +2,19 @@ server.port=8080 server.servlet.context-path=/exporter spring.main.web-application-type=servlet -hazelcast.cluster-members=127.0.0.1:5701 -hazelcast.login=dev -hazelcast.password=dev-pass +export-dbf-service.hazelcast.cluster-members=10.200.200.181:5701 +export-dbf-service.hazelcast.login=dev +export-dbf-service.hazelcast.password=dev-pass -dbf.encoding=cp866 -dbf.threads-count=10 +export-dbf-service.common.encoding=cp866 +export-dbf-service.common.threads-count=10 -dbf.out-dir=D:\\dbf\\out +export-dbf-service.store.out-dir=/opt/clearing/file/exporter/ + +export-dbf-service.kafka-consumer.bootstrap-servers=localhost:9092 +export-dbf-service.kafka-consumer.group-id=dev-group-balance-service +export-dbf-service.kafka-consumer.enable-auto-commit=false +export-dbf-service.kafka-consumer.session-timeout-ms=30000 +export-dbf-service.kafka-consumer.auto-offset-reset=latest +export-dbf-service.kafka-consumer.linger-ms=1 +export-dbf-service.kafka-consumer.buffer-memory=33554432 diff --git a/clearing-parent/dbf-importer/pom.xml b/clearing-parent/dbf-importer/pom.xml index 9f8772d3e..d3d50fe59 100644 --- a/clearing-parent/dbf-importer/pom.xml +++ b/clearing-parent/dbf-importer/pom.xml @@ -62,6 +62,10 @@ ru.spcex.clearing classes + + ru.spcex.platform + platform-messaging + diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/DBFLoaderApplication.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/DBFImporterApplication.java similarity index 66% rename from clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/DBFLoaderApplication.java rename to clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/DBFImporterApplication.java index c90405d5f..0036c8ffb 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/DBFLoaderApplication.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/DBFImporterApplication.java @@ -5,13 +5,13 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; @SpringBootApplication -public class DBFLoaderApplication { +public class DBFImporterApplication { public static void main(String[] args) { try { - SpringApplicationBuilder builder = new SpringApplicationBuilder(DBFLoaderApplication.class); + SpringApplicationBuilder builder = new SpringApplicationBuilder(DBFImporterApplication.class); builder.run(args); } catch (Exception e) { - LoggerFactory.getLogger(DBFLoaderApplication.class).error("DBF-Loader start failed: {} -> {}", e.getClass().getSimpleName(), e.getMessage()); + LoggerFactory.getLogger(DBFImporterApplication.class).error("DBF-Loader start failed: {} -> {}", e.getClass().getSimpleName(), e.getMessage()); System.exit(-1); } } diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/DBFImporterConfig.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/DBFImporterConfig.java index 5bdb8c60e..cfb331986 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/DBFImporterConfig.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/DBFImporterConfig.java @@ -1,16 +1,15 @@ package ru.spcex.clearing.dbf.importer.config; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import ru.spcex.clearing.dbf.importer.config.settings.ImportDBFServiceSettings; import ru.spcex.clearing.dbf.importer.logic.data.enums.ETable; import ru.spcex.clearing.dbf.importer.logic.data.tables.*; import ru.spcex.clearing.dbf.importer.logic.stages.*; -import ru.spcex.clearing.dbf.importer.properties.AProperties; import java.util.HashMap; import java.util.LinkedList; @@ -21,12 +20,12 @@ import java.util.Map; @EnableConfigurationProperties @ComponentScan(basePackages = {"ru.spcex.clearing.dbf.importer"}) public class DBFImporterConfig { - private final AProperties properties; + private final ImportDBFServiceSettings settings; private final ApplicationContext context; - public DBFImporterConfig(@Qualifier("dbfImporterProperties") AProperties properties, ApplicationContext context) { - this.properties = properties; + public DBFImporterConfig(ImportDBFServiceSettings settings, ApplicationContext context) { + this.settings = settings; this.context = context; } @@ -45,8 +44,8 @@ public class DBFImporterConfig { @Bean("executor") public ThreadPoolTaskExecutor executor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - executor.setMaxPoolSize(properties.getThreadsCount()); - executor.setCorePoolSize(properties.getThreadsCount()); + executor.setMaxPoolSize(settings.getCommon().getThreadsCount()); + executor.setCorePoolSize(settings.getCommon().getThreadsCount()); executor.setThreadNamePrefix("dbf-importer-thread-"); executor.setWaitForTasksToCompleteOnShutdown(true); executor.setAwaitTerminationSeconds(300); diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/KafkaConfig.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/KafkaConfig.java new file mode 100644 index 000000000..86358d7c1 --- /dev/null +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/KafkaConfig.java @@ -0,0 +1,37 @@ +package ru.spcex.clearing.dbf.importer.config; + +import org.apache.kafka.clients.producer.Producer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.spcex.clearing.dbf.importer.config.settings.ImportDBFServiceSettings; +import ru.spcex.clearing.platform.messaging.config.KafkaProducerFactory; +import ru.spcex.clearing.platform.messaging.service.RequestInfo; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgId; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.util.function.Supplier; + +@Configuration +public class KafkaConfig { + + @Autowired + @Bean + public Supplier kafkaSender(ImportDBFServiceSettings settings, ImdgProvider imdgProvider) { + return () -> { + Producer kafkaProducer = KafkaProducerFactory.producer(settings.getKafkaProducer()); + ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator(); + return KafkaSender + .setup() + .producer(kafkaProducer) + .idGenerator(imdgIdGenerator::nextId) + .imdgProvider(s -> { + Imdg imdg = imdgProvider.getImdg(s, RequestInfo.class); + return imdg::insert; + }) + .build(); + }; + } +} diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/settings/Common.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/settings/Common.java new file mode 100644 index 000000000..842262fe9 --- /dev/null +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/settings/Common.java @@ -0,0 +1,32 @@ +package ru.spcex.clearing.dbf.importer.config.settings; + +public class Common { + + private String encodingSource; + private int insertBatchSize; + private int threadsCount; + + public String getEncodingSource() { + return encodingSource; + } + + public void setEncodingSource(String encodingSource) { + this.encodingSource = encodingSource; + } + + public int getInsertBatchSize() { + return insertBatchSize; + } + + public void setInsertBatchSize(int insertBatchSize) { + this.insertBatchSize = insertBatchSize; + } + + public int getThreadsCount() { + return threadsCount; + } + + public void setThreadsCount(int threadsCount) { + this.threadsCount = threadsCount; + } +} diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/settings/Cron.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/settings/Cron.java new file mode 100644 index 000000000..ca25f1dd6 --- /dev/null +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/settings/Cron.java @@ -0,0 +1,14 @@ +package ru.spcex.clearing.dbf.importer.config.settings; + +public class Cron { + + private String checkSrcDirCron; + + public String getCheckSrcDirCron() { + return checkSrcDirCron; + } + + public void setCheckSrcDirCron(String checkSrcDirCron) { + this.checkSrcDirCron = checkSrcDirCron; + } +} diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/settings/ImportDBFServiceSettings.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/settings/ImportDBFServiceSettings.java index 788715794..8c4bd1fe2 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/settings/ImportDBFServiceSettings.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/settings/ImportDBFServiceSettings.java @@ -3,6 +3,7 @@ package ru.spcex.clearing.dbf.importer.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.KafkaProducerSettings; import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; @Component @@ -10,6 +11,10 @@ import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; @ConfigurationProperties("import-dbf-service") public class ImportDBFServiceSettings { private HazelcastClientParams hazelcast; + private KafkaProducerSettings kafkaProducer; + private Common common; + private Store store; + private Cron cron; public HazelcastClientParams getHazelcast() { return hazelcast; @@ -18,4 +23,36 @@ public class ImportDBFServiceSettings { public void setHazelcast(HazelcastClientParams hazelcast) { this.hazelcast = hazelcast; } + + public KafkaProducerSettings getKafkaProducer() { + return kafkaProducer; + } + + public void setKafkaProducer(KafkaProducerSettings kafkaProducer) { + this.kafkaProducer = kafkaProducer; + } + + public Common getCommon() { + return common; + } + + public void setCommon(Common common) { + this.common = common; + } + + public Store getStore() { + return store; + } + + public void setStore(Store store) { + this.store = store; + } + + public Cron getCron() { + return cron; + } + + public void setCron(Cron cron) { + this.cron = cron; + } } diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/settings/Store.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/settings/Store.java new file mode 100644 index 000000000..c4d563268 --- /dev/null +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/settings/Store.java @@ -0,0 +1,32 @@ +package ru.spcex.clearing.dbf.importer.config.settings; + +public class Store { + + private String srcDir; + private String outDir; + private boolean deleteSrcFiles = true; + + public String getSrcDir() { + return srcDir; + } + + public void setSrcDir(String srcDir) { + this.srcDir = srcDir; + } + + public String getOutDir() { + return outDir; + } + + public void setOutDir(String outDir) { + this.outDir = outDir; + } + + public boolean isDeleteSrcFiles() { + return deleteSrcFiles; + } + + public void setDeleteSrcFiles(boolean deleteSrcFiles) { + this.deleteSrcFiles = deleteSrcFiles; + } +} diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/controller/ImporterController.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/controller/ImporterController.java index 5dcfe1a97..faccf5252 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/controller/ImporterController.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/controller/ImporterController.java @@ -21,13 +21,6 @@ public class ImporterController implements InitializingBean { this.importerService = importerService; } - @RequestMapping(method = RequestMethod.GET, path = "/test", produces = MediaType.TEXT_PLAIN_VALUE) - @ResponseBody - public String processGet() { - log.info("Call test method for importer controller"); - return "importer controller test method"; - } - @RequestMapping(method = RequestMethod.GET, path = "/import", produces = MediaType.TEXT_PLAIN_VALUE) @ResponseBody public String checkFolder() { diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf12Table.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf12Table.java index 0fec7223c..f14dcbb46 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf12Table.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf12Table.java @@ -22,7 +22,7 @@ public class SDf12Table extends AbstractTable { SDf12 result = new SDf12(); result.setAccount((String) entity[0]); result.setDeal((String) entity[1]); - result.setStatus((BigDecimal) entity[2]); + result.setStatus((Long) entity[2]); result.setFileName(filename); result.setGenerationTime(Instant.now()); result.setGenerationId(fileId); diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf16Table.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf16Table.java index 06a263f40..9be1b54e6 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf16Table.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf16Table.java @@ -21,7 +21,7 @@ public class SDf16Table extends AbstractTable { @Override public SDf16 getEntity(Object[] entity) { SDf16 result = new SDf16(); - result.setDate(TimeUtil.strToInstant((String) entity[0])); +// result.setDate(TimeUtil.strToInstant((String) entity[0])); result.setAccount((String) entity[1]); result.setSum((BigDecimal) entity[2]); result.setMarket((String) entity[3]); diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/ChangeDirOfFileStage.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/ChangeDirOfFileStage.java index 96bc33fbb..6c30f8b30 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/ChangeDirOfFileStage.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/ChangeDirOfFileStage.java @@ -2,9 +2,9 @@ package ru.spcex.clearing.dbf.importer.logic.stages; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import ru.spcex.clearing.dbf.importer.config.settings.ImportDBFServiceSettings; import ru.spcex.clearing.dbf.importer.logic.data.ResultContainer; import ru.spcex.clearing.dbf.importer.logic.data.enums.StageResult; -import ru.spcex.clearing.dbf.importer.properties.AProperties; import ru.spcex.platform.utils.time.TimeUtil; import java.io.File; @@ -20,18 +20,18 @@ import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; public class ChangeDirOfFileStage extends Stage { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy.MM.dd HH.mm.ss"); - private final AProperties properties; + private final ImportDBFServiceSettings settings; @Autowired - public ChangeDirOfFileStage(AProperties properties) { - this.properties = properties; + public ChangeDirOfFileStage(ImportDBFServiceSettings settings) { + this.settings = settings; } @Override public StageResult process(ResultContainer resultContainer) { - File srcDir = new File(properties.getSrcDir()); - File outDir = new File(properties.getOutDir()); + File srcDir = new File(settings.getStore().getSrcDir()); + File outDir = new File(settings.getStore().getOutDir()); File dbfFile = resultContainer.getDbfFile(); if (!srcDir.exists()) { diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/ImportToDB.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/ImportToDB.java index fce0faa4b..b3a3202ff 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/ImportToDB.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/ImportToDB.java @@ -3,11 +3,14 @@ package ru.spcex.clearing.dbf.importer.logic.stages; import com.linuxense.javadbf.DBFReader; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; +import ru.spcex.clearing.dbf.importer.config.settings.ImportDBFServiceSettings; import ru.spcex.clearing.dbf.importer.logic.data.ResultContainer; import ru.spcex.clearing.dbf.importer.logic.data.enums.ETable; import ru.spcex.clearing.dbf.importer.logic.data.enums.StageResult; import ru.spcex.clearing.dbf.importer.logic.data.tables.AbstractTable; -import ru.spcex.clearing.dbf.importer.properties.AProperties; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; import java.io.ByteArrayInputStream; @@ -15,39 +18,48 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import java.util.Map; +import java.util.function.Supplier; /** * Заливка проверенных данных в базу */ @Component public class ImportToDB extends Stage { - private final AProperties properties; + private final ImportDBFServiceSettings settings; private final HazelcastService hazelcastService; private final Map mappingEnumTableObjectTable; + private final Supplier kafka; - public ImportToDB(@Qualifier("dbfImporterProperties") AProperties properties, - HazelcastService hazelcastService, @Qualifier("mapOfTable") Map mappingEnumTableObjectTable) { - this.properties = properties; + public ImportToDB(ImportDBFServiceSettings settings, + HazelcastService hazelcastService, + @Qualifier("mapOfTable") Map mappingEnumTableObjectTable, + Supplier kafka) { + this.settings = settings; this.hazelcastService = hazelcastService; this.mappingEnumTableObjectTable = mappingEnumTableObjectTable; + this.kafka = kafka; } @Override public StageResult process(ResultContainer resultContainer) { ETable currTable = resultContainer.getDbfTable(); byte[] source = resultContainer.getDbfSource(); - Charset sourceCharset = Charset.forName(properties.getDbfEncoding()); + Charset sourceCharset = Charset.forName(settings.getCommon().getEncodingSource()); try (InputStream is = new ByteArrayInputStream(source); DBFReader dbfReader = new DBFReader(is, sourceCharset)) { AbstractTable table = mappingEnumTableObjectTable.get(currTable); table.setHazelcastService(hazelcastService); table.setFilename(resultContainer.getDbfFile().getName()); - table.setFileId(hazelcastService.getImdgIdGenerator().nextId()); + Long fileId = hazelcastService.getImdgIdGenerator().nextId(); + table.setFileId(fileId); for (int i = 0; i < dbfReader.getRecordCount(); i++) { Object[] entity = dbfReader.nextRecord(); table.injectEntity(table.getEntity(entity)); } + if (ETable.DF_01.equals(currTable)) { + sendStatementRequest(fileId); + } } catch (IOException exception) { log.warn(exception.getMessage()); return StageResult.ERROR; @@ -56,4 +68,10 @@ public class ImportToDB extends Stage { return StageResult.OK; } + + private void sendStatementRequest(Long fileId) { + StatementRequest statementRequest = new StatementRequest(); + statementRequest.setSdf01GroupId(fileId); + kafka.get().sendRequestToQueue(Consts.STATEMENT_PROCESS, statementRequest); + } } diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/LoadFileFromDisk.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/LoadFileFromDisk.java index 6453196e8..e97840025 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/LoadFileFromDisk.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/LoadFileFromDisk.java @@ -1,10 +1,9 @@ package ru.spcex.clearing.dbf.importer.logic.stages; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; +import ru.spcex.clearing.dbf.importer.config.settings.ImportDBFServiceSettings; import ru.spcex.clearing.dbf.importer.logic.data.ResultContainer; import ru.spcex.clearing.dbf.importer.logic.data.enums.StageResult; -import ru.spcex.clearing.dbf.importer.properties.AProperties; import java.io.File; import java.io.IOException; @@ -15,10 +14,10 @@ import java.util.UUID; @Component public class LoadFileFromDisk extends Stage { - private final AProperties properties; + private final ImportDBFServiceSettings settings; - public LoadFileFromDisk(@Qualifier("dbfImporterProperties") AProperties properties) { - this.properties = properties; + public LoadFileFromDisk(ImportDBFServiceSettings settings) { + this.settings = settings; } @Override @@ -32,7 +31,7 @@ public class LoadFileFromDisk extends Stage { log.debug("uuid {}. Read all bytes from source file {}", taskUuid, resultContainer.getDbfFile().getName()); fileBytes = Files.readAllBytes(Paths.get(dbfFile.getAbsolutePath())); if (fileBytes.length == 0) throw new IOException("Empty file"); - if (properties.isDeleteSrcFiles()) Files.delete(dbfFile.toPath()); + if (settings.getStore().isDeleteSrcFiles()) Files.delete(dbfFile.toPath()); } catch (IOException e) { log.error(String.format("uuid %s. Can't read file %s", taskUuid, resultContainer.getDbfFile().getName()), e); return StageResult.ERROR; diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/ValidateFields.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/ValidateFields.java index eb0aa7026..217206ccd 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/ValidateFields.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/ValidateFields.java @@ -2,10 +2,10 @@ package ru.spcex.clearing.dbf.importer.logic.stages; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component; +import ru.spcex.clearing.dbf.importer.config.settings.ImportDBFServiceSettings; import ru.spcex.clearing.dbf.importer.exceptions.ConfigException; import ru.spcex.clearing.dbf.importer.logic.data.ResultContainer; import ru.spcex.clearing.dbf.importer.logic.data.enums.StageResult; -import ru.spcex.clearing.dbf.importer.properties.AProperties; import java.nio.charset.Charset; @@ -14,11 +14,11 @@ import java.nio.charset.Charset; */ @Component public class ValidateFields extends Stage implements InitializingBean { - private final AProperties properties; + private final ImportDBFServiceSettings settings; private Charset dbfCharset; - public ValidateFields(AProperties properties) { - this.properties = properties; + public ValidateFields(ImportDBFServiceSettings settings) { + this.settings = settings; } @Override @@ -36,9 +36,9 @@ public class ValidateFields extends Stage implements InitializingBean { private void initDBFCharset() { try { - dbfCharset = Charset.forName(properties.getDbfEncoding()); + dbfCharset = Charset.forName(settings.getCommon().getEncodingSource()); } catch (Exception e) { - throw new ConfigException("Unknown encoding from properties: " + properties.getDbfEncoding(), e); + throw new ConfigException("Unknown encoding from properties: " + settings.getCommon().getEncodingSource(), e); } } } diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/properties/AProperties.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/properties/AProperties.java deleted file mode 100644 index bc7d774e7..000000000 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/properties/AProperties.java +++ /dev/null @@ -1,45 +0,0 @@ -package ru.spcex.clearing.dbf.importer.properties; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -@Component("dbfImporterProperties") -public class AProperties { - - @Value("${dbf.src-dir}") - private String srcDir; - @Value("${dbf.out-dir}") - private String outDir; - @Value("${dbf.delete-src-files}") - private boolean deleteSrcFiles = true; - @Value("${dbf.encoding-source}") - private String dbfEncoding; - @Value("${dbf.insert-batch-size}") - private int insertBatchSize; - @Value("${dbf.threads-count}") - private int threadsCount; - - public String getOutDir() { - return outDir; - } - - public String getSrcDir() { - return srcDir; - } - - public boolean isDeleteSrcFiles() { - return deleteSrcFiles; - } - - public String getDbfEncoding() { - return dbfEncoding; - } - - public int getInsertBatchSize() { - return insertBatchSize; - } - - public int getThreadsCount() { - return threadsCount; - } -} diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/DBFImporterService.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/DBFImporterService.java index 92ab1e2d9..cc6bae1a1 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/DBFImporterService.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/DBFImporterService.java @@ -28,7 +28,7 @@ public class DBFImporterService { this.processor = processor; } - @Scheduled(cron = "${dbf.check-src-dir-cron}") + @Scheduled(cron = "${import-dbf-service.scheduler.check-src-dir-cron}") public void run() { Map> newFiles = fileChecker.checkNewFiles(); for (Map.Entry> newFilesEntry : newFiles.entrySet()) { diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/FileChecker.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/FileChecker.java index a468e4d80..785523c3e 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/FileChecker.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/FileChecker.java @@ -1,24 +1,24 @@ package ru.spcex.clearing.dbf.importer.services; import org.springframework.stereotype.Service; +import ru.spcex.clearing.dbf.importer.config.settings.ImportDBFServiceSettings; import ru.spcex.clearing.dbf.importer.logic.data.enums.ETable; -import ru.spcex.clearing.dbf.importer.properties.AProperties; import java.io.File; import java.util.*; @Service("fileChecker") public class FileChecker { - private final AProperties properties; + private final ImportDBFServiceSettings settings; - public FileChecker(AProperties properties) { - this.properties = properties; + public FileChecker(ImportDBFServiceSettings settings) { + this.settings = settings; } public Map> checkNewFiles() { Map> newFiles = new EnumMap<>(ETable.class); - String srcDir = properties.getSrcDir(); + String srcDir = settings.getStore().getSrcDir(); List dbfFiles = lsDBF(srcDir); if (dbfFiles.isEmpty()) return newFiles; diff --git a/clearing-parent/dbf-importer/src/main/resources/application.properties b/clearing-parent/dbf-importer/src/main/resources/application.properties index 3316a6c6e..4c0438d76 100644 --- a/clearing-parent/dbf-importer/src/main/resources/application.properties +++ b/clearing-parent/dbf-importer/src/main/resources/application.properties @@ -1,17 +1,25 @@ server.port=8080 server.servlet.context-path=/importer spring.main.web-application-type=servlet -db.jdbc-url=jdbc:postgresql://10.200.200.133:5432/postgres -db.driver=org.postgresql.Driver -db.login=clearing -db.password=Aa111111 -dbf.check-src-dir-cron=* * * * 1 ? -dbf.encoding-source=cp866 -dbf.insert-batch-size=100 -dbf.delete-src-files=false -dbf.src-dir=D:\\dbf\\ -dbf.out-dir=D:\\dbf\\out -dbf.threads-count=10 -import-dbf-service.hazelcast.cluster-members=127.0.0.1 + +import-dbf-service.scheduler.check-src-dir-cron=* * * * 1 ? + +import-dbf-service.store.delete-src-files=false +import-dbf-service.store.src-dir=/opt/clearing/file/importer/ +import-dbf-service.store.out-dir=/opt/clearing/file/importer/loaded/ + +import-dbf-service.common.encoding-source=cp866 +import-dbf-service.common.insert-batch-size=100 +import-dbf-service.common.threads-count=10 + +import-dbf-service.hazelcast.cluster-members=10.200.200.181:5701 import-dbf-service.hazelcast.login=dev -import-dbf-service.hazelcast.password=dev-pass \ No newline at end of file +import-dbf-service.hazelcast.password=dev-pass + + +import-dbf-service.kafka-producer.bootstrap-servers=localhost:9092 +import-dbf-service.kafka-producer.acks=all +import-dbf-service.kafka-producer.retries=0 +import-dbf-service.kafka-producer.batch-size=16384 +import-dbf-service.kafka-producer.linger-ms=1 +import-dbf-service.kafka-producer.buffer-memory=33554432 \ No newline at end of file diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/IMDGApplication.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/IMDGApplication.java index c25ab8a29..702df95d2 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/IMDGApplication.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/IMDGApplication.java @@ -9,7 +9,7 @@ public class IMDGApplication { public static void main(String[] args) { SpringApplicationBuilder builder = new SpringApplicationBuilder(IMDGApplication.class); - ConfigurableApplicationContext configurableApplicationContext = builder.run(args); + builder.run(args); } } diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/CompanyMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/CompanyMapStore.java index c16c1a2d0..28fcd3a1d 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/CompanyMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/CompanyMapStore.java @@ -47,7 +47,9 @@ public class CompanyMapStore extends BusinessObjectMapStore { return namedParameterJdbcTemplate.query("select * from " + getTableName() + " where id in (:ids)", paramMap, (resultSet, i) -> { Company company = new Company(); - fillBusinessObjectFields(company, resultSet); + company.setId(resultSet.getObject("ID", Long.class)); + company.setCreated(getInstantFromTimestamp(resultSet, "CREATED_AT")); + company.setUpdated(getInstantFromTimestamp(resultSet, "UPDATED_AT")); company.setTradingCode(resultSet.getObject("TRADING_CODE", String.class)); company.setClearingCode(resultSet.getObject("CLEARING_CODE", String.class)); company.setRegistrationCode(resultSet.getObject("REGISTRATION_CODE", String.class)); diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/ConfigurationRootElement.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/ConfigurationRootElement.java deleted file mode 100644 index 68944e935..000000000 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/ConfigurationRootElement.java +++ /dev/null @@ -1,48 +0,0 @@ -package ru.spcex.clearing.imdg.config; - - -/** - * Корневой элемент конфигурации - */ - -@SuppressWarnings("DefaultAnnotationParam") -public class ConfigurationRootElement /*extends ConfigurationRootBaseElement*/ { - - /** - * Конфигурация БД - */ -// @JsonProperty(value = "Database", required = true) - private SettingsElementDatabase database = new SettingsElementDatabase(); - -// @JsonProperty(value = "Settings", required = false) - private SettingsElement settings = new SettingsElement(); - - /** - * Конфигурация Hazelcast - */ -// @JsonProperty(value = "HazelcastServer", required = true) -// private HazelcastServerElement hazelcast = new HazelcastServerElement(); - - /** - * Конфигурация сервисов Core - */ -// @JsonProperty(value = "Services") - private ServicesElement servicesElement = new ServicesElement(); - - public SettingsElementDatabase getDatabase() { - return database; - } - -// public HazelcastServerElement getHazelcast() { -// return hazelcast; -// } - - public SettingsElement getSettings() { - return settings; - } - - public ServicesElement getServicesElement() { - return servicesElement; - } - -} diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/DbConnectionConfig.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/DbConnectionConfig.java index 8730c9b72..ef8328659 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/DbConnectionConfig.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/DbConnectionConfig.java @@ -6,6 +6,8 @@ import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; +import ru.spcex.clearing.imdg.config.element.DatabaseSettings; +import ru.spcex.clearing.imdg.config.element.ImdgSettings; import ru.spcex.clearing.imdg.error.ModuleInitializeException; import javax.sql.DataSource; @@ -16,8 +18,7 @@ import java.sql.Connection; public class DbConnectionConfig { private final Logger log = LoggerFactory.getLogger(this.getClass()); - private ConfigurationRootElement configRoot = DfaConfig.get().getRoot(); - private final DatabaseConnectionElement settings; + private final DatabaseSettings settings; public DbConnectionConfig(ImdgSettings settings) { this.settings = settings.getDatabase(); @@ -30,7 +31,7 @@ public class DbConnectionConfig { String password = settings.getPassword(); String logTimeoutPart = ""; String dbPath = settings.getUrl(); - int timeoutSec = configRoot.getDatabase().getConnectionAcquireTimeoutSeconds(); + int timeoutSec = 30; ComboPooledDataSource cpds = new ComboPooledDataSource(); try { @@ -41,11 +42,12 @@ public class DbConnectionConfig { cpds.setJdbcUrl(dbPath); cpds.setUser(login); cpds.setPassword(password); - cpds.setInitialPoolSize(configRoot.getDatabase().getMinPoolSize()); - cpds.setMinPoolSize(configRoot.getDatabase().getMinPoolSize()); - cpds.setMaxPoolSize(configRoot.getDatabase().getMaxPoolSize()); - cpds.setNumHelperThreads(configRoot.getDatabase().getNumHelperThreads()); - cpds.setCheckoutTimeout(timeoutSec * 1000/*todo common 1000==ConstsCommon.SECOND*/); + cpds.setInitialPoolSize(10); + cpds.setMinPoolSize(10); + cpds.setMaxPoolSize(30); + int numHelperThreads = Runtime.getRuntime().availableProcessors() * 2; + cpds.setNumHelperThreads(numHelperThreads); + cpds.setCheckoutTimeout(timeoutSec * 1000); logTimeoutPart = String.format(" (timeout=%ds)", timeoutSec); result = cpds; diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/DfaConfig.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/DfaConfig.java deleted file mode 100644 index dba3920f4..000000000 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/DfaConfig.java +++ /dev/null @@ -1,34 +0,0 @@ -package ru.spcex.clearing.imdg.config; - - -public class DfaConfig { - protected static DfaConfig self; - - - ConfigurationRootElement root = new ConfigurationRootElement(); - - protected String defaultLogFileName() { - return "storage"; - } - - - public String appName() { - return "clearing-storage"; - } - - - protected Class parsedClazz() { - return ConfigurationRootElement.class; - } - - public static DfaConfig get() { - if (self == null) { - self = new DfaConfig(); - } - return self; - } - - public ConfigurationRootElement getRoot() { - return root; - } -} diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/HazelcastConfiguration.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/HazelcastConfiguration.java index 913613d19..362651331 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/HazelcastConfiguration.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/HazelcastConfiguration.java @@ -6,6 +6,8 @@ import com.hazelcast.core.HazelcastInstance; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import ru.spcex.clearing.imdg.config.element.HazelcastServerSettings; +import ru.spcex.clearing.imdg.config.element.ImdgSettings; import java.util.List; @@ -13,11 +15,12 @@ import java.util.List; public class HazelcastConfiguration { private final PoolMapConfigs poolMapConfigs; - private final HazelcastServerElement hzSettings; + private final HazelcastServerSettings hzSettings; private final ConfigurationRootElement configRoot = DfaConfig.get().getRoot(); @Autowired - public HazelcastConfiguration(PoolMapConfigs poolMapConfigs, ImdgSettings imdgSettings) { + public HazelcastConfiguration(PoolMapConfigs poolMapConfigs, + ImdgSettings imdgSettings) { this.poolMapConfigs = poolMapConfigs; this.hzSettings = imdgSettings.getHazelcast(); } diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/PoolMapConfigs.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/PoolMapConfigs.java index 7749e454d..7b2d9d7c2 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/PoolMapConfigs.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/PoolMapConfigs.java @@ -12,6 +12,7 @@ import ru.spcex.clearing.imdg.base.AutoconfiguredMap; import ru.spcex.clearing.imdg.base.DictionaryTMapStore; import ru.spcex.clearing.imdg.businessevent.CompanyHistoryMapStore; import ru.spcex.clearing.imdg.businessobject.CompanyMapStore; +import ru.spcex.clearing.imdg.dictionary.*; import ru.spcex.clearing.imdg.object.CompanySymbolsMapStore; import ru.spcex.clearing.imdg.object.ContactMapStore; import ru.spcex.clearing.imdg.object.ProfileDocumentMapStore; @@ -23,29 +24,12 @@ import java.util.List; @Configuration public class PoolMapConfigs { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final ConfigurationRootElement configRoot = DfaConfig.get().getRoot(); - @Autowired - private List> listOfAutopluginStores; - @Autowired - private CompanySymbolsMapStore companySymbolsMapStore; - @Autowired - private ProfileDocumentMapStore profileDocumentMapStore; - @Autowired - private ContactMapStore contactMapStore; - @Autowired - private CompanyMapStore companyMapStore; - // @Autowired - private CompanyHistoryMapStore companyHistoryMapStore; - - public PoolMapConfigs() { - } + private Logger log = LoggerFactory.getLogger(getClass()); private MapStoreConfig makeDefaultMapStoreConfig(MapLoader mapBean) { return new MapStoreConfig() .setImplementation(mapBean) - ;//todo config: .setWriteDelaySeconds(configRoot.getIMDG().getDbSyncSeconds()); +;//todo config: .setWriteDelaySeconds(configRoot.getIMDG().getDbSyncSeconds()); } public ScheduledExecutorConfig makeDefaultScheduledExecutorConfig(String name) { @@ -83,13 +67,82 @@ public class PoolMapConfigs { return makeMapIndexConfig(attributeName, false); } -// @Autowired todo эксперимент с мапстором, см. ниже autoconfiguratorOfMapstorage. -// private CompanyRoleSetMapStore companyRoleSetMapStore; -// -// public MapConfig map_CompanyRoleSet() { -// return makeDefaultMapConfig(IMDGDistributedNames.Map_CompanyRoleSet, companyRoleSetMapStore) -// .addMapIndexConfig(makeMapIndexConfig("companyId")); -// } + + + @Autowired private AllowedDictionaryMapStore allowedDictionaryMapStore; + public MapConfig map_AllowedDictionary() { + return makeDefaultMapConfig(IMDGDistributedNames.Map_AllowedDictionary, allowedDictionaryMapStore) + .setNearCacheConfig(makeDefaultNearCacheConfig()) + .addMapIndexConfig(makeMapIndexConfig("code")); + } + @Autowired private CompanyRoleDictionaryMapStore companyRoleDictionaryMapStore; + public MapConfig map_CompanyRoleDictionary() { + return makeDefaultMapConfig(IMDGDistributedNames.Map_CompanyRoleDictionary, companyRoleDictionaryMapStore) + .setNearCacheConfig(makeDefaultNearCacheConfig()) + .addMapIndexConfig(makeMapIndexConfig("code")); + } + @Autowired private CompanySymbolDictionaryMapStore companySymbolDictionaryMapStore; + public MapConfig map_CompanySymbolDictionary() { + return makeDefaultMapConfig(IMDGDistributedNames.Map_CompanySymbolDictionary, companySymbolDictionaryMapStore) + .setNearCacheConfig(makeDefaultNearCacheConfig()) + .addMapIndexConfig(makeMapIndexConfig("code")); + } + @Autowired private ContactTypeDictionaryMapStore contactTypeDictionaryMapStore; + public MapConfig map_ContactTypeDictionary() { + return makeDefaultMapConfig(IMDGDistributedNames.Map_ContactTypeDictionary, contactTypeDictionaryMapStore) + .setNearCacheConfig(makeDefaultNearCacheConfig()) + .addMapIndexConfig(makeMapIndexConfig("code")); + } + @Autowired private CorporationSoleTypeDictionaryMapStore corporationSoleTypeDictionaryMapStore; + public MapConfig map_CorporationSoleTypeDictionary() { + return makeDefaultMapConfig(IMDGDistributedNames.Map_CorporationSoleTypeDictionary, corporationSoleTypeDictionaryMapStore) + .setNearCacheConfig(makeDefaultNearCacheConfig()) + .addMapIndexConfig(makeMapIndexConfig("code")); + } + @Autowired private CountryCodeDictionaryMapStore countryCodeDictionaryMapStore; + public MapConfig map_CountryCodeDictionary() { + return makeDefaultMapConfig(IMDGDistributedNames.Map_CountryCodeDictionary, countryCodeDictionaryMapStore) + .setNearCacheConfig(makeDefaultNearCacheConfig()) + .addMapIndexConfig(makeMapIndexConfig("code")); + } + @Autowired private DocumentTypeDictionaryMapStore documentTypeDictionaryMapStore; + public MapConfig map_DocumentTypeDictionary() { + return makeDefaultMapConfig(IMDGDistributedNames.Map_DocumentTypeDictionary, documentTypeDictionaryMapStore) + .setNearCacheConfig(makeDefaultNearCacheConfig()) + .addMapIndexConfig(makeMapIndexConfig("code")); + } + @Autowired private LegalKindDictionaryMapStore legalKindDictionaryMapStore; + public MapConfig map_LegalKindDictionary() { + return makeDefaultMapConfig(IMDGDistributedNames.Map_LegalKindDictionary, legalKindDictionaryMapStore) + .setNearCacheConfig(makeDefaultNearCacheConfig()) + .addMapIndexConfig(makeMapIndexConfig("code")); + } + @Autowired private OrganizationTypeDictionaryMapStore organizationTypeDictionaryMapStore; + public MapConfig map_OrganizationTypeDictionary() { + return makeDefaultMapConfig(IMDGDistributedNames.Map_OrganizationTypeDictionary, organizationTypeDictionaryMapStore) + .setNearCacheConfig(makeDefaultNearCacheConfig()) + .addMapIndexConfig(makeMapIndexConfig("code")); + } + @Autowired private WorkflowStatusDictionaryMapStore workflowStatusDictionaryMapStore; + public MapConfig map_WorkflowStatusDictionary() { + return makeDefaultMapConfig(IMDGDistributedNames.Map_WorkflowStatusDictionary, workflowStatusDictionaryMapStore) + .setNearCacheConfig(makeDefaultNearCacheConfig()) + .addMapIndexConfig(makeMapIndexConfig("code")); + } + + + + @Autowired + private CompanyMapStore companyMapStore; + + public MapConfig map_Company() { + return makeDefaultMapConfig(IMDGDistributedNames.Map_Company, companyMapStore); + } + + + // Автоконфигурируемые мапсторы: + @Autowired + private List> listOfAutopluginStores; // @Qualifier("AutoconfiguredMapStore") public List autoconfiguratorOfMapstorages() { @@ -120,35 +173,10 @@ public class PoolMapConfigs { } out.add(mapCfg); } catch (RuntimeException e) { - throw new RuntimeException("Can not configure MapStore " + mapStore.getMapName() + "(" + mapStore + "): " + e, e); + throw new RuntimeException("Can not configure MapStore " + mapStore.getMapName() + "(" + mapStore.toString() + "): " + e, e); } } log.debug("Configured {} mapStore's", out.size()); return out; } - - public MapConfig map_CompanySymbols() { - return makeDefaultMapConfig(IMDGDistributedNames.Map_CompanySymbols, companySymbolsMapStore) - .addMapIndexConfig(makeMapIndexConfig("companyId")) - .addMapIndexConfig(makeMapIndexConfig("companySymbol")); - } - - public MapConfig map_ProfileDocument() { - return makeDefaultMapConfig(IMDGDistributedNames.Map_ProfileDocument, profileDocumentMapStore) - .addMapIndexConfig(makeMapIndexConfig("companyId")); - } - - public MapConfig map_Contact() { - return makeDefaultMapConfig(IMDGDistributedNames.Map_Contact, contactMapStore) - .addMapIndexConfig(makeMapIndexConfig("companyId")); - } - - public MapConfig map_Company() { - return makeDefaultMapConfig(IMDGDistributedNames.Map_Company, companyMapStore) - .addMapIndexConfig(makeMapIndexConfig("Id")); - } - - public MapConfig map_CompanyUpdate() { - return makeDefaultMapConfig(IMDGDistributedNames.Map_CompanyHistory, companyHistoryMapStore); - } } diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/ServicesElement.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/ServicesElement.java deleted file mode 100644 index 172c65bdb..000000000 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/ServicesElement.java +++ /dev/null @@ -1,34 +0,0 @@ -package ru.spcex.clearing.imdg.config; - -//import com.fasterxml.jackson.annotation.JsonFormat; -//import com.fasterxml.jackson.annotation.JsonProperty; - -import java.io.Serializable; -import java.util.Date; - -/** - * Настройка сервисов - */ -public class ServicesElement implements Serializable { - - /** - * Время, через которое выставленная заявка будет снята, в миллисекундах. - */ -// @JsonProperty(value = "ExpirationDelay") - private Integer ExpirationDelay = 5 * 60 * 1000; - - public Integer getExpirationDelay() { - return ExpirationDelay; - } - - /** - * Время окончания торговой сессии - */ -// @JsonProperty(value = "SessionEndTime") -// @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss", timezone = "Europe/Moscow") - private Date SessionEndTime = null; - - public Date getSessionEndTime() { - return SessionEndTime; - } -} diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/SettingsElement.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/SettingsElement.java deleted file mode 100644 index cb44271ba..000000000 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/SettingsElement.java +++ /dev/null @@ -1,29 +0,0 @@ -package ru.spcex.clearing.imdg.config; - -//import com.fasterxml.jackson.annotation.JsonProperty; - -import java.io.Serializable; - -@SuppressWarnings({"DefaultAnnotationParam", "unused", "FieldCanBeLocal"}) -public class SettingsElement implements Serializable { -// @JsonProperty(value = "InitHazelcastThreadMultiplier", required = false) - private int initHazelcastThreadMultiplier = 2; - -// @JsonProperty(value = "RecoveryLogPath", required = false) - private String recoveryLogPath; - -// @JsonProperty(value = "ExecutionLimitationPeriod", required = false) - private Integer executionLimitationPeriod = 10; - - public int getInitHazelcastThreadMultiplier() { - return initHazelcastThreadMultiplier; - } - - public Integer getExecutionLimitationPeriod() { - return executionLimitationPeriod; - } - - public String getRecoveryLogPath() { - return recoveryLogPath; - } -} \ No newline at end of file diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/SettingsElementDatabase.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/SettingsElementDatabase.java deleted file mode 100644 index 642bc3ac2..000000000 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/SettingsElementDatabase.java +++ /dev/null @@ -1,89 +0,0 @@ -package ru.spcex.clearing.imdg.config; - -//import com.fasterxml.jackson.annotation.JsonProperty; - -import java.io.Serializable; - -@SuppressWarnings({"FieldCanBeLocal", "unused", "DefaultAnnotationParam"}) -public class SettingsElementDatabase implements Serializable { - -// @JsonProperty(value = "Driver") - private String driver = "org.firebirdsql.jdbc.FBDriver"; - -// @JsonProperty(value = "JdbcConnectionString", required = true) - private String jdbcConnectionString; - -// @JsonProperty(value = "Login", required = true) - private String login; - -// @JsonProperty(value = "Password", required = true) - private String password; - -// @JsonProperty(value = "MaxPoolSize") - private int maxPoolSize = 30; - -// @JsonProperty(value = "MinPoolSize") - private int minPoolSize = 10; - -// @JsonProperty(value = "EmbeddedFilePath", required = false) - private String embeddedFilePath; - -// @JsonProperty(value = "NumHelperThreads", required = false) - private int numHelperThreads = Runtime.getRuntime().availableProcessors() * 2; - -// @JsonProperty(value = "ConnectionAcquireTimeoutSeconds", required = false) - private int connectionAcquireTimeoutSeconds = 30; - - public String getDriver() { - return driver; - } - - public String getJdbcConnectionString() { - return jdbcConnectionString; - } - - public String getLogin() { - return login; - } - - public String getPassword() { - return password; - } - - public int getMaxPoolSize() { - return maxPoolSize; - } - - public int getMinPoolSize() { - return minPoolSize; - } - - public String getEmbeddedFilePath() { - return embeddedFilePath; - } - - public int getNumHelperThreads() { - return numHelperThreads; - } - - public int getConnectionAcquireTimeoutSeconds() { - return connectionAcquireTimeoutSeconds; - } - - // для поддержки интеграционных тестов otc-test: - public void setJdbcConnectionString(String jdbcConnectionString) { - this.jdbcConnectionString = jdbcConnectionString; - } - - public void setLogin(String login) { - this.login = login; - } - - public void setPassword(String password) { - this.password = password; - } - - public void setEmbeddedFilePath(String embeddedFilePath) { - this.embeddedFilePath = embeddedFilePath; - } -} diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/DatabaseConnectionElement.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/element/DatabaseSettings.java similarity index 86% rename from clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/DatabaseConnectionElement.java rename to clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/element/DatabaseSettings.java index 274839a2c..670bfde03 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/DatabaseConnectionElement.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/element/DatabaseSettings.java @@ -1,6 +1,6 @@ -package ru.spcex.clearing.imdg.config; +package ru.spcex.clearing.imdg.config.element; -public class DatabaseConnectionElement { +public class DatabaseSettings { private String login; private String password; private String url; diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/HazelcastServerElement.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/element/HazelcastServerSettings.java similarity index 79% rename from clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/HazelcastServerElement.java rename to clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/element/HazelcastServerSettings.java index db267c74e..b0daa2dd6 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/HazelcastServerElement.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/element/HazelcastServerSettings.java @@ -1,12 +1,12 @@ -package ru.spcex.clearing.imdg.config; +package ru.spcex.clearing.imdg.config.element; import java.util.List; -public class HazelcastServerElement { +public class HazelcastServerSettings { - private int listenPort = 5071; - private String login = "dev"; - private String password = "dev-pass"; + private int listenPort = 5701; + private String login; + private String password; private List clusterMembers; public int getListenPort() { diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/ImdgSettings.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/element/ImdgSettings.java similarity index 57% rename from clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/ImdgSettings.java rename to clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/element/ImdgSettings.java index a178af9fb..95eae7658 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/ImdgSettings.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/element/ImdgSettings.java @@ -1,4 +1,4 @@ -package ru.spcex.clearing.imdg.config; +package ru.spcex.clearing.imdg.config.element; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; @@ -8,23 +8,22 @@ import org.springframework.stereotype.Component; @PropertySource("file:${spring.config.location}/application.properties") @ConfigurationProperties("imdg") public class ImdgSettings { + private HazelcastServerSettings hazelcast; + private DatabaseSettings database; - private HazelcastServerElement hazelcast; - private DatabaseConnectionElement database; - - public DatabaseConnectionElement getDatabase() { - return database; - } - - public void setDatabase(DatabaseConnectionElement database) { - this.database = database; - } - - public HazelcastServerElement getHazelcast() { + public HazelcastServerSettings getHazelcast() { return hazelcast; } - public void setHazelcast(HazelcastServerElement hazelcast) { + public void setHazelcast(HazelcastServerSettings hazelcast) { this.hazelcast = hazelcast; } + + public DatabaseSettings getDatabase() { + return database; + } + + public void setDatabase(DatabaseSettings database) { + this.database = database; + } } diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/InDocumentJournalMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/InDocumentJournalMapStore.java index 00b977451..ce1858fd3 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/InDocumentJournalMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/InDocumentJournalMapStore.java @@ -31,7 +31,7 @@ public class InDocumentJournalMapStore extends TemplateMapStore { object.setId(resultSet.getObject("ID", Long.class)); object.setAccount(resultSet.getObject("ACCOUNT", String.class)); object.setDeal(resultSet.getObject("DEAL", String.class)); - object.setStatus(resultSet.getObject("STATUS", BigDecimal.class)); + object.setStatus(resultSet.getObject("STATUS", Long.class)); object.setFileName(resultSet.getObject("FILE_NAME", String.class)); object.setGenerationTime(getInstantFromTimestamp(resultSet, "GENERATION_TIME")); object.setGenerationId(resultSet.getObject("GENERATION_ID", Long.class)); diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf13MapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf13MapStore.java index 42925b4aa..01b9b80bf 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf13MapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf13MapStore.java @@ -29,13 +29,13 @@ public class SDf13MapStore extends TemplateMapStore { @Override public String[] getFields() { - return new String[] { + return new String[]{ "ID", "SEG_TYPE", "DOC_TYPE", "DOCNM_REF", "DOCNMPREV", "PRIORITY", "SBANKCODE", "C_ACC_DEB", "SBANKNAM1", "SBANKNAM2", "SBANKNAM3", "SBANKNAM4", "SBANKNAM5", "RBANKCODE", "C_ACC_CRED", "RBANKNAM1", "OP_TYPE", "OP_ORDER", "RBANKNAM4", "RBANKNAM5", "PAY_DATE", "EXT_DATE", "PAY_VAL", "SUM_DEB", "SCLIENTN1", "INN_DEB", - "KPP_DEB", "SCLIENTN4", "SC_CODE", "ACC_DEB", "RCLIENTN1", "KPP_CRED", "RCLIENTN4", - "ACC_KR_1", "ACC_KR_2", "SP_CODE", "SPECIF_1", "SPECIF_2", "SPECIF_3", "SPECIF_4", "SPECIF_5", - "SPECIF_6", "SEND_TYPE", "SERVDATE", "DOC_RESULT", "GENERATION_TIME", "GENERATION_ID" + "KPP_DEB", "SCLIENTN4", "SC_CODE", "ACC_DEB", "RCLIENTN1", "INN_CRED", "KPP_CRED", "RCLIENTN4", "ACC_KR_1", + "ACC_KR_2", "SP_CODE", "SPECIF_1", "SPECIF_2", "SPECIF_3", "SPECIF_4", "SPECIF_5", "SPECIF_6", "SEND_TYPE", + "SERVDATE", "DOC_RESULT", "GENERATION_TIME", "GENERATION_ID" }; } @@ -73,6 +73,7 @@ public class SDf13MapStore extends TemplateMapStore { object.setSc_code(resultSet.getObject("SC_CODE", String.class)); object.setAcc_deb(resultSet.getObject("ACC_DEB", String.class)); object.setRclientn1(resultSet.getObject("RCLIENTN1", String.class)); + object.setInn_cred(resultSet.getObject("INN_CRED", String.class)); object.setKpp_cred(resultSet.getObject("KPP_CRED", String.class)); object.setRclientn4(resultSet.getObject("RCLIENTN4", String.class)); object.setAcc_kr_1(resultSet.getObject("ACC_KR_1", String.class)); @@ -97,49 +98,50 @@ public class SDf13MapStore extends TemplateMapStore { Object[] args = new Object[]{ object.getId(), object.getSeg_type(), - object.getDoc_type(), - object.getDocnm_ref(), + object.getDoc_type(), + object.getDocnm_ref(), object.getDocnmprev(), - object.getPriority(), - object.getSbankcode(), - object.getC_acc_deb(), - object.getSbanknam1(), - object.getSbanknam2(), - object.getSbanknam3(), - object.getSbanknam4(), - object.getSbanknam5(), - object.getRbankcode(), - object.getC_acc_cred(), - object.getRbanknam1(), - object.getOp_type(), - object.getOp_order(), - object.getRbanknam4(), - object.getRbanknam5(), - object.getPay_date(), - object.getExt_date(), - object.getPay_val(), - object.getSum_deb(), - object.getSclientn1(), - object.getInn_deb(), - object.getKpp_deb(), - object.getSclientn4(), - object.getSc_code(), - object.getAcc_deb(), - object.getRclientn1(), - object.getKpp_cred(), - object.getRclientn4(), - object.getAcc_kr_1(), - object.getAcc_kr_2(), - object.getSp_code(), - object.getSpecif_1(), - object.getSpecif_2(), - object.getSpecif_3(), - object.getSpecif_4(), - object.getSpecif_5(), - object.getSpecif_6(), - object.getSend_type(), - object.getServdate(), - object.getDoc_result(), + object.getPriority(), + object.getSbankcode(), + object.getC_acc_deb(), + object.getSbanknam1(), + object.getSbanknam2(), + object.getSbanknam3(), + object.getSbanknam4(), + object.getSbanknam5(), + object.getRbankcode(), + object.getC_acc_cred(), + object.getRbanknam1(), + object.getOp_type(), + object.getOp_order(), + object.getRbanknam4(), + object.getRbanknam5(), + object.getPay_date(), + object.getExt_date(), + object.getPay_val(), + object.getSum_deb(), + object.getSclientn1(), + object.getInn_deb(), + object.getKpp_deb(), + object.getSclientn4(), + object.getSc_code(), + object.getAcc_deb(), + object.getRclientn1(), + object.getInn_cred(), + object.getKpp_cred(), + object.getRclientn4(), + object.getAcc_kr_1(), + object.getAcc_kr_2(), + object.getSp_code(), + object.getSpecif_1(), + object.getSpecif_2(), + object.getSpecif_3(), + object.getSpecif_4(), + object.getSpecif_5(), + object.getSpecif_6(), + object.getSend_type(), + object.getServdate(), + object.getDoc_result(), TimeUtil.toDateFromInstant(object.getGenerationTime()), object.getGenerationId() }; diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf16MapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf16MapStore.java index edd7bf445..69fa4b308 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf16MapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf16MapStore.java @@ -31,7 +31,7 @@ public class SDf16MapStore extends TemplateMapStore { @Override public String[] getFields() { return new String[]{ - "ID", "DATE", "ACCOUNT", "SUM", "MARKET", "TYPE", "_I_N_N", "_B_I_C", "_S_P_E_C", "NUMBER", "RESULT_CODE", "FILE_NAME", "GENERATION_TIME", "GENERATION_ID" + "ID", "ACCOUNT", "SUM", "MARKET", "TYPE", "_I_N_N", "_B_I_C", "_S_P_E_C", "NUMBER", "FILE_NAME", "GENERATION_TIME", "GENERATION_ID" }; } @@ -39,7 +39,6 @@ public class SDf16MapStore extends TemplateMapStore { public SDf16 objectReader(ResultSet resultSet) throws SQLException { SDf16 object = new SDf16(); object.setId(resultSet.getObject("ID", Long.class)); - object.setDate(getInstantFromTimestamp(resultSet, "DATE")); object.setAccount(resultSet.getObject("ACCOUNT", String.class)); object.setSum(resultSet.getObject("SUM", BigDecimal.class)); object.setMarket(resultSet.getObject("MARKET", String.class)); @@ -48,7 +47,6 @@ public class SDf16MapStore extends TemplateMapStore { object.setBIC(resultSet.getObject("_B_I_C", BigDecimal.class)); object.setSPEC(resultSet.getObject("_S_P_E_C", String.class)); object.setNumber(resultSet.getObject("NUMBER", BigDecimal.class)); - object.setResultCode(resultSet.getObject("RESULT_CODE", String.class)); object.setFileName(resultSet.getObject("FILE_NAME", String.class)); object.setGenerationTime(getInstantFromTimestamp(resultSet, "GENERATION_TIME")); object.setGenerationId(resultSet.getObject("GENERATION_ID", Long.class)); @@ -59,7 +57,6 @@ public class SDf16MapStore extends TemplateMapStore { public Object[] objectToField(SDf16 object) { Object[] args = new Object[]{ object.getId(), - TimeUtil.toDateFromInstant(object.getDate()), object.getAccount(), object.getSum(), object.getMarket(), @@ -68,7 +65,6 @@ public class SDf16MapStore extends TemplateMapStore { object.getBIC(), object.getSPEC(), object.getNumber(), - object.getResultCode(), object.getFileName(), TimeUtil.toDateFromInstant(object.getGenerationTime()), object.getGenerationId() diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf17MapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf17MapStore.java index 369505d65..ad1f57bea 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf17MapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf17MapStore.java @@ -47,10 +47,10 @@ public class SDf17MapStore extends TemplateMapStore { object.setBIC(resultSet.getObject("_B_I_C", BigDecimal.class)); object.setSPEC(resultSet.getObject("_S_P_E_C", String.class)); object.setNumber(resultSet.getObject("NUMBER", BigDecimal.class)); - object.setResult(resultSet.getObject("RESULT_CODE", String.class)); + object.setResult(resultSet.getObject("RESULT", BigDecimal.class)); object.setGenerationTime(getInstantFromTimestamp(resultSet, "GENERATION_TIME")); object.setGenerationId(resultSet.getObject("GENERATION_ID", Long.class)); - object.setIn_s_df16_id(resultSet.getObject("IN_S_DF16_ID", Long.class)); + object.setInSDf16Id(resultSet.getObject("IN_S_DF16_ID", Long.class)); return object; } @@ -69,7 +69,7 @@ public class SDf17MapStore extends TemplateMapStore { object.getResult(), TimeUtil.toDateFromInstant(object.getGenerationTime()), object.getGenerationId(), - object.getIn_s_df16_id() + object.getInSDf16Id() }; return args; } diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf18MapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf18MapStore.java index a7ab87623..7a785dc1c 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf18MapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf18MapStore.java @@ -41,7 +41,7 @@ public class SDf18MapStore extends TemplateMapStore { object.setId(resultSet.getObject("ID", Long.class)); object.setAccount(resultSet.getObject("ACCOUNT", String.class)); object.setDeal(resultSet.getObject("DEAL", String.class)); - object.setStatus(resultSet.getObject("STATUS", BigDecimal.class)); + object.setStatus(resultSet.getObject("STATUS", Long.class)); object.setResult(resultSet.getObject("RESULT", BigDecimal.class)); object.setGenerationTime(getInstantFromTimestamp(resultSet, "GENERATION_TIME")); object.setGenerationId(resultSet.getObject("GENERATION_ID", Long.class)); diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/AbstractHazelcastLifecycleSupport.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/AbstractHazelcastLifecycleSupport.java index 868c4de0c..5c1e24129 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/AbstractHazelcastLifecycleSupport.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/services/AbstractHazelcastLifecycleSupport.java @@ -4,24 +4,20 @@ import com.hazelcast.config.MapStoreConfig; import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.IMap; import com.hazelcast.core.IdGenerator; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; -import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import ru.clearing.classes.objects.BusinessObject; +import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.base.DictionaryMapStore; import ru.spcex.clearing.imdg.base.SimpleObjectMapStore; -import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.imdg.iml.hazelcast.util.HazelcastHelper; import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; //todo почистить класс public abstract class AbstractHazelcastLifecycleSupport implements InitializingBean, DisposableBean { @@ -108,103 +104,19 @@ public abstract class AbstractHazelcastLifecycleSupport implements InitializingB log.info("IDGenerator {} already initialized in other node", IMDGDistributedNames.MAP_SEQUENCE_NAME); } -// MapStoreConfig mapStoreConfig = hazelcastServerInstance.getConfig().getMapConfig(HazelcastDistributedNames.Map_FixedIncomeProductExecution).getMapStoreConfig(); -// FixedIncomeProductExecutionMapStore fixedIncomeProductExecutionMapStore = (FixedIncomeProductExecutionMapStore) mapStoreConfig.getImplementation(); -// Long maxExecutionNumber = jdbcTemplate.queryForObject("select max(executionnumber) from " + fixedIncomeProductExecutionMapStore.getTableName(), Long.class); -// log.info("{} max(executionnumber)={}", fixedIncomeProductExecutionMapStore.getTableName(), maxExecutionNumber); -// if (maxExecutionNumber != null) { -// if (Integer.MAX_VALUE - maxExecutionNumber < 1000000) -// log.error("max(executionnumber) close to int32 max value"); -// IAtomicLong executionNumberAtomicLong = hazelcastServerInstance.getAtomicLong(HazelcastDistributedNames.AtomicLong_ExecutionNumber); -// executionNumberAtomicLong.set(maxExecutionNumber); -// } -// -// if (startupTasksAdministrator != null) { -// startupTasksAdministrator.createTasks(); -// } } catch (InterruptedException | ExecutionException e) { throw new RuntimeException("MapStore multithreaded not complete.", e); } HazelcastHelper.otcSystem_setStorageState(true, hazelcastServerInstance); -// hazelcastServerInstance.getClientService().addClientListener(clientListener); loadTime = System.currentTimeMillis() - loadTime; log.info("All map load time {} ms", loadTime); -// TextErrorService.setHazelcast(hazelcastServerInstance); - -// clusterStatistic(); } -// /** -// * Подсчитывает кол-во запусков, первый запуск. Пишет в лог. -// * Storage note status: ... -// */ -// protected void clusterStatistic() { -// try { -// boolean isFirstNodeReady = HazelcastCommon.otcSystem_setStorageInfo(new Date(), true, hazelcastServerInstance); -// String msg = "Storage node status: " + (isFirstNodeReady ? "first Storage node" : "second node") -// + ", first node start at " + HazelcastCommon.otcSystem_getFirstStorageTime(hazelcastServerInstance); -// String firstOtcVersion = HazelcastCommon.otcSystem_getFirstStorageVersion(hazelcastServerInstance); -// if (firstOtcVersion != null) -// msg += "(OTC " + firstOtcVersion + ")"; -// msg += ", count of all storage connection " + HazelcastCommon.otcSystem_getStorageConnectCount(hazelcastServerInstance) + "."; -// msg += " Hazelcast cluster members: " + hazelcastServerInstance.getCluster().getMembers().size() + "."; -// log.info(msg); -// } catch (Exception e) { -// log.warn("Error at print Storage cluster info.", e); -// } -// } - @Override public void destroy() { hazelcastServerInstance.shutdown(); } - - protected void databaseVersionCheck() throws RuntimeException, IllegalArgumentException { - log.debug("Validate DB version, expected \"{}\"", getCheckDbVersion()); - String dbVersion = null; - try { - dbVersion = jdbcTemplate.queryForObject("select version from VERSIONEDID", String.class); - log.info("DB version is \"{}\"", dbVersion); - if (StringUtils.isBlank(dbVersion)) { - String msg = "Database not contain version information (table VERSIONEDID)";//TextErrorService.text(StorageErrors.StorageErrors_WrongDBVersion) + " Database not contain version information (table VERSIONEDID)"; - log.error(msg); - throw new RuntimeException(msg); - } - if (!isAllowDBVersion(getCheckDbVersion(), dbVersion)) { - String msg = " platform " + getCheckDbVersion() + ", db " + dbVersion;//TextErrorService.text(StorageErrors.StorageErrors_WrongDBVersion) + " platform " + getCheckDbVersion() + ", db " + dbVersion; - log.error(msg); - throw new RuntimeException(msg); - } - } catch (DataAccessException | IllegalArgumentException e) { // EmptyResultDataAccessException - String msg = e.toString();//TextErrorService.text(StorageErrors.StorageErrors_WrongDBVersion) + " platform " + getCheckDbVersion() + ", db " + dbVersion; - log.error(msg); - throw new RuntimeException(msg, e); // Ошибка 10002 - Версия Бд не поддерживается - } - } - - /** - * Првоерка версии. Формат: 1.2.* - * - * @param moduleVersion версия кода - * @param dbVersion версия базы - * @return true - версии правильные, false - версия БД устарела или не совпадает. - * @throws IllegalArgumentException если неправильно распарсилась версия, в частности может случиться NumberFormatException. - */ - static boolean isAllowDBVersion(String moduleVersion, String dbVersion) throws IllegalArgumentException { - Pattern versionPattern = Pattern.compile("(\\d+)\\.(\\d+)(\\..*){0,1}"); // (\d+)\.(\d+)(\..*){0,1} - Matcher mModule = versionPattern.matcher(moduleVersion); - Matcher mDB = versionPattern.matcher(dbVersion); - if (!mModule.find()) - throw new IllegalArgumentException("Module version have wrong format: " + moduleVersion); - if (!mDB.find()) - throw new IllegalArgumentException("Version from database have wrong format: " + moduleVersion); - int majorModule = Integer.parseInt(mModule.group(1)); - int minorModule = Integer.parseInt(mModule.group(2)); - int majorDB = Integer.parseInt(mDB.group(1)); - int minorDB = Integer.parseInt(mDB.group(2)); - return majorDB == majorModule && minorDB >= minorModule; - } } diff --git a/clearing-parent/securities-service/src/main/resources/application.properties b/clearing-parent/securities-service/src/main/resources/application.properties index 65e23fde1..ee89c6710 100644 --- a/clearing-parent/securities-service/src/main/resources/application.properties +++ b/clearing-parent/securities-service/src/main/resources/application.properties @@ -1,6 +1,6 @@ spring.main.web-application-type=none -securities-service.hazelcast.cluster-members=127.0.0.1 +securities-service.hazelcast.cluster-members=127.0.0.1:5701 securities-service.hazelcast.login=dev securities-service.hazelcast.password=dev-pass diff --git a/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/UserSettingService.java b/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/UserSettingService.java new file mode 100644 index 000000000..f34af7255 --- /dev/null +++ b/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/UserSettingService.java @@ -0,0 +1,59 @@ +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.user.UserSettings; +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.utilities.UserSettingsUpdateRequest; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.util.Map; + +@Service +public class UserSettingService extends QueueConsumer implements InitializingBean { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final Imdg userSettingsMap; + + @Autowired + public UserSettingService(Consumer kafkaQueue, ImdgProvider imdgProvider) { + super(kafkaQueue); + this.userSettingsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_UserSettings, UserSettings.class); + } + + @Override + public void afterPropertiesSet() { + callback(UserSettingsUpdateRequest.class) + .setConsumer(this::updateUserSettings) + .forDestination(Consts.USER_SETTINGS_UPDATE, callbacks::put); + init(); + } + + private void updateUserSettings(BaseRequest userRequest) { + UserSettingsUpdateRequest req = userRequest.getRequestPayload(); + log.debug("UserSettingsUpdateRequest received userId = {}", req.getUserId()); + UserSettings settings = userSettingsMap.getSingleObjectByFieldValues(Map.of("userId", req.getUserId())); + if (settings != null) { + log.debug("found user settings for userId={}, id={}...", req.getUserId(), settings.getId()); + settings.setVersion(req.getVersion()); + settings.setJson(req.getJson()); + userSettingsMap.update(settings); + log.debug("updated user settings for userId={}, id={}", req.getUserId(), settings.getId()); + } else { + log.debug("creating user settings for userId={}...", req.getUserId()); + settings = new UserSettings(); + settings.setUserId(req.getUserId()); + settings.setVersion(req.getVersion()); + settings.setJson(req.getJson()); + userSettingsMap.insert(settings); + log.debug("created user settings for userId={}, id={}", req.getUserId(), settings.getId()); + } + } +} diff --git a/clearing-parent/utility-service/src/main/resources/application.properties b/clearing-parent/utility-service/src/main/resources/application.properties index aab233b1f..fbc306eab 100644 --- a/clearing-parent/utility-service/src/main/resources/application.properties +++ b/clearing-parent/utility-service/src/main/resources/application.properties @@ -1,12 +1,12 @@ spring.main.web-application-type=none -utility-service.hazelcast.cluster-members=127.0.0.1 +utility-service.hazelcast.cluster-members=127.0.0.1:5701 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 -utility-service.kafka.enable-auto-commit=false +utility-service.kafka.enable-auto-commit=true utility-service.kafka.session-timeout-ms=30000 utility-service.kafka.auto-offset-reset=latest utility-service.kafka.linger-ms=1 diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/BalanceAccountType.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/BalanceAccountType.java new file mode 100644 index 000000000..1e6577dd3 --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/BalanceAccountType.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum BalanceAccountType implements IEnumKey { + Active("ACTV"), Blocked("BLKD"); + + private final String key; + + BalanceAccountType(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/CurrencyCode.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/CurrencyCode.java new file mode 100644 index 000000000..7c6fb4daa --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/CurrencyCode.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum CurrencyCode implements IEnumKey { + RUB("RUB"); + + private final String key; + + CurrencyCode(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InOutDirection.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InOutDirection.java new file mode 100644 index 000000000..ec91a9dbf --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InOutDirection.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum InOutDirection implements IEnumKey { + in("IN"); + + private final String key; + + InOutDirection(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InOutSDfType.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InOutSDfType.java new file mode 100644 index 000000000..c6b103761 --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InOutSDfType.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum InOutSDfType implements IEnumKey { + type1("0102"); + + private final String key; + + InOutSDfType(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/OperationStatus.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/OperationStatus.java new file mode 100644 index 000000000..037b60c22 --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/OperationStatus.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum OperationStatus implements IEnumKey { + Pending("PEND"), Executed("EXEC"); + + private final String key; + + OperationStatus(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Sender.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Sender.java new file mode 100644 index 000000000..f4f822c5c --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Sender.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumId; + +public enum Sender implements IEnumId { + Prc(2L); + + private final Long key; + + Sender(Long key) { + this.key = key; + } + + @Override + public Long getId() { + return key; + } +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/StatementType.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/StatementType.java new file mode 100644 index 000000000..b351b4c9a --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/StatementType.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum StatementType implements IEnumKey { + full("FULL"); + + private final String key; + + StatementType(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/service/HazelcastServiceBase.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/service/HazelcastServiceBase.java index e68defd6d..1ee90ea9c 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/service/HazelcastServiceBase.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/service/HazelcastServiceBase.java @@ -173,7 +173,7 @@ public abstract class HazelcastServiceBase while (!done) { log.debug("Execute awaitGeneratorId()"); try { - HazelcastHelper.otcSystem_waitTillReadyState(getHazelcast()); + HazelcastHelper.waitTillReadyState(getHazelcast()); onAvailable(); done = true; } catch (Throwable e) { @@ -310,7 +310,7 @@ public abstract class HazelcastServiceBase try { HazelcastInstance instance = getHazelcast(); if (instance != null) { - HazelcastHelper.otcSystem_waitTillReadyState(instance); + HazelcastHelper.waitTillReadyState(instance); done = true; break; } else { diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/util/HazelcastHelper.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/util/HazelcastHelper.java index 14b9f3394..97977b217 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/util/HazelcastHelper.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/util/HazelcastHelper.java @@ -17,7 +17,8 @@ public final class HazelcastHelper { public static final int DEFAULT_CONNECTION_ATTEMPT_PERIOD_SEC = 10; public static final int DEFAULT_CONNECTION_ATTEMPT_LIMIT = Integer.MAX_VALUE; public static final int TEST_CONNECTION_ATTEMPT_LIMIT = 1; - public static final String OTC_SYSTEM_MAP = "OTC_SYSTEM"; + public static final String CLEARING_SYSTEM_MAP = "CLEARING_SYSTEM"; + public static final String STATE_OF_IMDG_SERVER = "IMDG.STATE"; public static ClientConfig getClientConfig(String members, String login, String password, String instanceName) { return getClientConfig(members, login, password, instanceName, null); @@ -79,8 +80,7 @@ public final class HazelcastHelper { while (!done) { try { instance = HazelcastClient.newHazelcastClient(hzClientConfig);// createHzClient(); - otcSystem_waitTillReadyState(instance); -// TextErrorService.setHazelcast(instance); + waitTillReadyState(instance); log.info("Hazelcast: TextErrorService done"); done = true; } catch (InterruptedException e) { @@ -99,10 +99,10 @@ public final class HazelcastHelper { return instance; } - public static void otcSystem_waitTillReadyState(HazelcastInstance hazelcast) throws InterruptedException { + public static void waitTillReadyState(HazelcastInstance hazelcast) throws InterruptedException { int sleepCount = 0; try { - while (!otcSystem_getStorageState(hazelcast)) { + while (!getIdmgState(hazelcast)) { if (sleepCount++ % 30 == 0) log.info("Wait till STORAGE be ready..."); Thread.sleep(100); @@ -115,14 +115,14 @@ public final class HazelcastHelper { } } - public static boolean otcSystem_getStorageState(HazelcastInstance hazelcast) { - IMap systemMap = hazelcast.getMap(OTC_SYSTEM_MAP); - return Boolean.valueOf(systemMap.get("STORAGE.STATE")); + public static boolean getIdmgState(HazelcastInstance hazelcast) { + IMap systemMap = hazelcast.getMap(CLEARING_SYSTEM_MAP); + return Boolean.valueOf(systemMap.get(STATE_OF_IMDG_SERVER)); } public static void otcSystem_setStorageState(boolean val, HazelcastInstance hazelcast) { - IMap systemMap = hazelcast.getMap(OTC_SYSTEM_MAP); - systemMap.set("STORAGE.STATE", Boolean.toString(val)); + IMap systemMap = hazelcast.getMap(CLEARING_SYSTEM_MAP); + systemMap.set(STATE_OF_IMDG_SERVER, Boolean.toString(val)); } diff --git a/platform-parent/platform-imdg-api/pom.xml b/platform-parent/platform-imdg-api/pom.xml index 7d01f350c..678e60d10 100644 --- a/platform-parent/platform-imdg-api/pom.xml +++ b/platform-parent/platform-imdg-api/pom.xml @@ -25,5 +25,9 @@ ru.spcex.platform platform-classes-base + + ru.spcex.platform + platform-utils + \ No newline at end of file diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/clearing/imdg/IMDGDistributedNames.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/clearing/imdg/IMDGDistributedNames.java index 26e7c9295..b3c3b9d8d 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/clearing/imdg/IMDGDistributedNames.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/clearing/imdg/IMDGDistributedNames.java @@ -8,7 +8,6 @@ public final class IMDGDistributedNames { public static final String Map_CompanyHistory = "Map_CompanyHistory"; public static final String Map_CompanyRoleSet = "Map_CompanyRoleSet"; public static final String Map_CompanySymbols = "Map_CompanySymbols"; - // 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"; diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/ImdgValidationContext.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/ImdgValidationContext.java similarity index 90% rename from clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/ImdgValidationContext.java rename to platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/ImdgValidationContext.java index 40a5f805e..3d853cff4 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/ImdgValidationContext.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/ImdgValidationContext.java @@ -1,4 +1,4 @@ -package ru.spcex.clearing.balance.config; +package ru.spcex.platform.imdg.validation; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.imdg.api.Imdg; @@ -17,11 +17,11 @@ public class ImdgValidationContext implements IValidatorContext { this.storedObjects = new HashMap<>(); } - void addImdg(String key, Imdg imdg) { + public void addImdg(String key, Imdg imdg) { imdgs.put(key, imdg); } - void setValidatedObject(T validatedObject) { + public void setValidatedObject(T validatedObject) { this.validatedObject = validatedObject; } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index d9d4fc0c8..212900ad1 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -25,9 +25,12 @@ public interface Consts { String USER_AUTH_SUCCESS = "user-auth-success"; String USER_LOGOUT_SUCCESS = "user-logout-success"; + String USER_SETTINGS_UPDATE = "user-settings-update"; //todo - String STATEMENT_NEW = "statement-action"; + String STATEMENT_PROCESS = "statement-process"; + String EXPORT_PROCESS = "export-process"; String ACCOUNT_NEW = "account-new"; + String BALANCE_ACCOUNT_NEW = "balance-account-new"; } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java deleted file mode 100644 index 2241fcbc2..000000000 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/AccountNewRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.spcex.clearing.platform.messaging.domain.cud.account; - -public class AccountNewRequest { - - private String account; - - public String getAccount() { - return account; - } - - public void setAccount(String account) { - this.account = account; - } -} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01Request.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01Request.java new file mode 100644 index 000000000..01a4cb4b7 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01Request.java @@ -0,0 +1,29 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class AccountSdf01Request { + + private Long groupingSdf01Id; + + @JsonProperty("accounts") + List accounts; + + public List getAccounts() { + return accounts; + } + + public void setAccounts(List accounts) { + this.accounts = accounts; + } + + public Long getGroupingSdf01Id() { + return groupingSdf01Id; + } + + public void setGroupingSdf01Id(Long groupingSdf01Id) { + this.groupingSdf01Id = groupingSdf01Id; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01RequestPart.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01RequestPart.java new file mode 100644 index 000000000..a48429623 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/sdf01/AccountSdf01RequestPart.java @@ -0,0 +1,36 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class AccountSdf01RequestPart { + @JsonProperty + private Long sdf01Id; + @JsonProperty + private String account; + @JsonProperty + private Long companyId; + + public Long getSdf01Id() { + return sdf01Id; + } + + public void setSdf01Id(Long sdf01Id) { + this.sdf01Id = sdf01Id; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/AccountSdf01ToStatementRequestPart.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/AccountSdf01ToStatementRequestPart.java new file mode 100644 index 000000000..4921c9d2e --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/AccountSdf01ToStatementRequestPart.java @@ -0,0 +1,36 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.balance; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class AccountSdf01ToStatementRequestPart { + @JsonProperty + private Long sdf01Id; + @JsonProperty + private Long errorCode; + @JsonProperty + private String errorText; + + public Long getSdf01Id() { + return sdf01Id; + } + + public void setSdf01Id(Long sdf01Id) { + this.sdf01Id = sdf01Id; + } + + public Long getErrorCode() { + return errorCode; + } + + public void setErrorCode(Long errorCode) { + this.errorCode = errorCode; + } + + public String getErrorText() { + return errorText; + } + + public void setErrorText(String errorText) { + this.errorText = errorText; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/ExportToFileRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/ExportToFileRequest.java new file mode 100644 index 000000000..5b196e20d --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/ExportToFileRequest.java @@ -0,0 +1,26 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.balance; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ExportToFileRequest { + @JsonProperty + private Long sdfGroupId; + @JsonProperty + private String nameOfTable; + + public Long getSdfGroupId() { + return sdfGroupId; + } + + public void setSdfGroupId(Long sdfGroupId) { + this.sdfGroupId = sdfGroupId; + } + + public String getNameOfTable() { + return nameOfTable; + } + + public void setNameOfTable(String nameOfTable) { + this.nameOfTable = nameOfTable; + } +} \ No newline at end of file diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/StatementRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/StatementRequest.java index d1a98147a..e2477137a 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/StatementRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/StatementRequest.java @@ -2,15 +2,39 @@ package ru.spcex.clearing.platform.messaging.domain.cud.balance; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.ArrayList; +import java.util.List; + public class StatementRequest { @JsonProperty - private Long sdf01Id; + private Long sdf01GroupId; + //------------------- + //from accountBalance creation + @JsonProperty + List accountCreationResults = new ArrayList<>(); - public Long getSdf01Id() { - return sdf01Id; +// public StatementRequestType getType() { +// if (errorCode != null || errorText != null || status != null) { +// return StatementRequestType.accountBalanceResponse; +// } else if (inOutSDfType != null) { +// return StatementRequestType.sdf02Response; +// } else return StatementRequestType.create; +// return type; +// } + + public Long getSdf01GroupId() { + return sdf01GroupId; } - public void setSdf01Id(Long sdf01Id) { - this.sdf01Id = sdf01Id; + public void setSdf01GroupId(Long sdf01GroupId) { + this.sdf01GroupId = sdf01GroupId; + } + + public List getAccountCreationResults() { + return accountCreationResults; + } + + public void setAccountCreationResults(List accountCreationResults) { + this.accountCreationResults = accountCreationResults; } } \ No newline at end of file diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/StatementRequestType.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/StatementRequestType.java new file mode 100644 index 000000000..02434916b --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/balance/StatementRequestType.java @@ -0,0 +1,6 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.balance; + +public enum StatementRequestType { + create, accountBalanceResponse, sdf02Response, + batch +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/UserSettingsUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/UserSettingsUpdateRequest.java new file mode 100644 index 000000000..8eb9093fe --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/UserSettingsUpdateRequest.java @@ -0,0 +1,37 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.utilities; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRawValue; + +public class UserSettingsUpdateRequest { + @JsonProperty + public Long userId; + @JsonProperty + public String version; + @JsonRawValue + public String json; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getJson() { + return json; + } + + public void setJson(String json) { + this.json = json; + } +} diff --git a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/number/BigDecimalUtil.java b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/number/BigDecimalUtil.java new file mode 100644 index 000000000..b30f30f12 --- /dev/null +++ b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/number/BigDecimalUtil.java @@ -0,0 +1,20 @@ +package ru.spcex.platform.utils.number; + +import java.math.BigDecimal; + +public class BigDecimalUtil { + +// private final Pattern numberPattern = Pattern.compile("\\d+([.,]\\d+)?"); + + public static BigDecimal parse(String number) { + if (number == null) { + return null; + } + number = number.trim().replace(",", "."); + try { + return new BigDecimal(number); + } catch (Exception e) { + return null; + } + } +} diff --git a/pom.xml b/pom.xml index a70f4b92f..270dfddac 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,11 @@ ${folder_root_clearing}/clearing-parent/imdg ${folder_root_clearing}/clearing-parent/dbf-exporter ${folder_root_clearing}/clearing-parent/dbf-importer + ${folder_root_clearing}/clearing-parent/account-service + ${folder_root_clearing}/clearing-parent/balance-service + ${folder_root_clearing}/clearing-parent/company-service + ${folder_root_clearing}/clearing-parent/reports-service + ${folder_root_clearing}/clearing-parent/utility-service 3.12.4 1.7.33 diff --git a/z-distr/pom.xml b/z-distr/pom.xml index 820f787cb..92a874b5a 100644 --- a/z-distr/pom.xml +++ b/z-distr/pom.xml @@ -191,6 +191,101 @@ + + copy-account-service-bin + prepare-package + + copy + + + + + ${folder_root_account-service}/target/account-service.jar + ${folder.clearing.distr.modules}/account-service/account-service.jar + + + ${folder_root_account-service}/src/main/resources/application.properties + ${folder.clearing.distr.modules}/account-service/application.properties + + + + + + copy-balance-service-bin + prepare-package + + copy + + + + + ${folder_root_balance-service}/target/balance-service.jar + ${folder.clearing.distr.modules}/balance-service/balance-service.jar + + + ${folder_root_balance-service}/src/main/resources/application.properties + ${folder.clearing.distr.modules}/balance-service/application.properties + + + + + + copy-company-service-bin + prepare-package + + copy + + + + + ${folder_root_company-service}/target/company-service.jar + ${folder.clearing.distr.modules}/company-service/company-service.jar + + + ${folder_root_company-service}/src/main/resources/application.properties + ${folder.clearing.distr.modules}/company-service/application.properties + + + + + + copy-reports-service-bin + prepare-package + + copy + + + + + ${folder_root_reports-service}/target/reports-service.jar + ${folder.clearing.distr.modules}/reports-service/reports-service.jar + + + ${folder_root_reports-service}/src/main/resources/application.properties + ${folder.clearing.distr.modules}/reports-service/application.properties + + + + + + copy-utility-service-bin + prepare-package + + copy + + + + + ${folder_root_utility-service}/target/utility-service.jar + ${folder.clearing.distr.modules}/utility-service/utility-service.jar + + + ${folder_root_utility-service}/src/main/resources/application.properties + ${folder.clearing.distr.modules}/utility-service/application.properties + + + + diff --git a/z-distr/src/main/resources/distr/bin/account-service.sh b/z-distr/src/main/resources/distr/bin/account-service.sh new file mode 100644 index 000000000..7ec2c2bd8 --- /dev/null +++ b/z-distr/src/main/resources/distr/bin/account-service.sh @@ -0,0 +1,3 @@ +#!/bin/bash +docker build -t account-service:1.0.0 ../modules/account-service/ +docker run -d -p 8055:8080 -v /opt/clearing/logs:/opt/clearing/bin/logs account-service:1.0.0 \ No newline at end of file diff --git a/z-distr/src/main/resources/distr/bin/backend-api.sh b/z-distr/src/main/resources/distr/bin/backend-api.sh index 8bbec107f..292b7f616 100644 --- a/z-distr/src/main/resources/distr/bin/backend-api.sh +++ b/z-distr/src/main/resources/distr/bin/backend-api.sh @@ -1,3 +1,3 @@ -#!/bin/sh +#!/bin/bash docker build -t backend-api:1.0.0 ../modules/backend-api/ -docker run -p 8090:8080 -v /opt/clearing/logs:/opt/clearing/bin/logs backend-api:1.0.0 & \ No newline at end of file +docker run -d -p 8095:8080 -v /opt/clearing/logs:/opt/clearing/bin/logs backend-api:1.0.0 \ No newline at end of file diff --git a/z-distr/src/main/resources/distr/bin/balance-service.sh b/z-distr/src/main/resources/distr/bin/balance-service.sh new file mode 100644 index 000000000..543801d68 --- /dev/null +++ b/z-distr/src/main/resources/distr/bin/balance-service.sh @@ -0,0 +1,3 @@ +#!/bin/bash +docker build -t balance-service:1.0.0 ../modules/balance-service/ +docker run -d -p 8040:8080 -v /opt/clearing/logs:/opt/clearing/bin/logs balance-service:1.0.0 \ No newline at end of file diff --git a/z-distr/src/main/resources/distr/bin/company-service.sh b/z-distr/src/main/resources/distr/bin/company-service.sh new file mode 100644 index 000000000..4005003fc --- /dev/null +++ b/z-distr/src/main/resources/distr/bin/company-service.sh @@ -0,0 +1,3 @@ +#!/bin/bash +docker build -t company-service:1.0.0 ../modules/company-service/ +docker run -d -p 8030:8080 -v /opt/clearing/logs:/opt/clearing/bin/logs company-service:1.0.0 \ No newline at end of file diff --git a/z-distr/src/main/resources/distr/bin/dbf-exporter.sh b/z-distr/src/main/resources/distr/bin/dbf-exporter.sh index a8c5b380c..203ad8b5f 100644 --- a/z-distr/src/main/resources/distr/bin/dbf-exporter.sh +++ b/z-distr/src/main/resources/distr/bin/dbf-exporter.sh @@ -1,3 +1,3 @@ -#!/bin/sh +#!/bin/bash docker build -t dbf-exporter:1.0.0 ../modules/dbf-exporter/ -docker run -p 8070:8080 -v /opt/clearing/logs:/opt/clearing/bin/logs dbf-exporter:1.0.0 & \ No newline at end of file +docker run -d -p 8065:8080 -v /opt/clearing/logs:/opt/clearing/bin/logs -v /opt/clearing/file/exporter:/opt/clearing/file/exporter/ dbf-exporter:1.0.0 \ No newline at end of file diff --git a/z-distr/src/main/resources/distr/bin/dbf-importer.sh b/z-distr/src/main/resources/distr/bin/dbf-importer.sh index 909b00cdd..b23914c28 100644 --- a/z-distr/src/main/resources/distr/bin/dbf-importer.sh +++ b/z-distr/src/main/resources/distr/bin/dbf-importer.sh @@ -1,3 +1,3 @@ -#!/bin/sh +#!/bin/bash docker build -t dbf-importer:1.0.0 ../modules/dbf-importer/ -docker run -p 8060:8080 -v /opt/clearing/logs:/opt/clearing/bin/logs dbf-importer:1.0.0 & \ No newline at end of file +docker run -d -p 8060:8080 -v /opt/clearing/logs:/opt/clearing/bin/logs -v /opt/clearing/file/importer/:/opt/clearing/file/importer -v /opt/clearing/file/importer/loaded:/opt/clearing/file/importer/loaded dbf-importer:1.0.0 \ No newline at end of file diff --git a/z-distr/src/main/resources/distr/bin/deploy.sh b/z-distr/src/main/resources/distr/bin/deploy.sh index 2ed33c187..260812a4d 100644 --- a/z-distr/src/main/resources/distr/bin/deploy.sh +++ b/z-distr/src/main/resources/distr/bin/deploy.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash ./os.sh sleep 60 ./backend-api.sh & diff --git a/z-distr/src/main/resources/distr/bin/os.sh b/z-distr/src/main/resources/distr/bin/os.sh index 72c4b51ad..417525c9a 100644 --- a/z-distr/src/main/resources/distr/bin/os.sh +++ b/z-distr/src/main/resources/distr/bin/os.sh @@ -1,2 +1,2 @@ -#!/bin/sh +#!/bin/bash docker build -t debian:stable-20220125-jdk17 ../modules/os/ \ No newline at end of file diff --git a/z-distr/src/main/resources/distr/bin/report-service.sh b/z-distr/src/main/resources/distr/bin/report-service.sh new file mode 100644 index 000000000..0d587301d --- /dev/null +++ b/z-distr/src/main/resources/distr/bin/report-service.sh @@ -0,0 +1,3 @@ +#!/bin/bash +docker build -t reports-service:1.0.0 ../modules/reports-service/ +docker run -d -p 8020:8080 -v /opt/clearing/logs:/opt/clearing/bin/logs reports-service:1.0.0 \ No newline at end of file diff --git a/z-distr/src/main/resources/distr/bin/securities-service.sh b/z-distr/src/main/resources/distr/bin/securities-service.sh index f12309928..48629c6f1 100644 --- a/z-distr/src/main/resources/distr/bin/securities-service.sh +++ b/z-distr/src/main/resources/distr/bin/securities-service.sh @@ -1,3 +1,3 @@ -#!/bin/sh +#!/bin/bash docker build -t securities-service:1.0.0 ../modules/securities-service/ -docker run -v /opt/clearing/logs:/opt/clearing/bin/logs securities-service:1.0.0 & \ No newline at end of file +docker run -d -p 8010:8080 -v /opt/clearing/logs:/opt/clearing/bin/logs securities-service:1.0.0 \ No newline at end of file diff --git a/z-distr/src/main/resources/distr/bin/utility-service.sh b/z-distr/src/main/resources/distr/bin/utility-service.sh new file mode 100644 index 000000000..cc1434fbc --- /dev/null +++ b/z-distr/src/main/resources/distr/bin/utility-service.sh @@ -0,0 +1,3 @@ +#!/bin/bash +docker build -t utility-service:1.0.0 ../modules/utility-service/ +docker run -d -p 8015:8080 -v /opt/clearing/logs:/opt/clearing/bin/logs utility-service:1.0.0 \ No newline at end of file diff --git a/z-distr/src/main/resources/distr/modules/account-service/Dockerfile b/z-distr/src/main/resources/distr/modules/account-service/Dockerfile new file mode 100644 index 000000000..c9d49599c --- /dev/null +++ b/z-distr/src/main/resources/distr/modules/account-service/Dockerfile @@ -0,0 +1,6 @@ +FROM debian:stable-20220125-jdk17 + +ADD account-service.jar /opt/clearing/bin/account-service.jar +ADD application.properties /opt/clearing/bin/application.properties +USER root +ENTRYPOINT java -jar /opt/clearing/bin/account-service.jar --spring.config.location=/opt/clearing/bin/ \ No newline at end of file diff --git a/z-distr/src/main/resources/distr/modules/balance-service/Dockerfile b/z-distr/src/main/resources/distr/modules/balance-service/Dockerfile new file mode 100644 index 000000000..d06190e49 --- /dev/null +++ b/z-distr/src/main/resources/distr/modules/balance-service/Dockerfile @@ -0,0 +1,6 @@ +FROM debian:stable-20220125-jdk17 + +ADD balance-service.jar /opt/clearing/bin/balance-service.jar +ADD application.properties /opt/clearing/bin/application.properties +USER root +ENTRYPOINT java -jar /opt/clearing/bin/balance-service.jar --spring.config.location=/opt/clearing/bin/ \ No newline at end of file diff --git a/z-distr/src/main/resources/distr/modules/company-service/Dockerfile b/z-distr/src/main/resources/distr/modules/company-service/Dockerfile new file mode 100644 index 000000000..51b04e98c --- /dev/null +++ b/z-distr/src/main/resources/distr/modules/company-service/Dockerfile @@ -0,0 +1,6 @@ +FROM debian:stable-20220125-jdk17 + +ADD company-service.jar /opt/clearing/bin/company-service.jar +ADD application.properties /opt/clearing/bin/application.properties +USER root +ENTRYPOINT java -jar /opt/clearing/bin/company-service.jar --spring.config.location=/opt/clearing/bin/ \ No newline at end of file diff --git a/z-distr/src/main/resources/distr/modules/reports-service/Dockerfile b/z-distr/src/main/resources/distr/modules/reports-service/Dockerfile new file mode 100644 index 000000000..b533fe630 --- /dev/null +++ b/z-distr/src/main/resources/distr/modules/reports-service/Dockerfile @@ -0,0 +1,6 @@ +FROM debian:stable-20220125-jdk17 + +ADD reports-service.jar /opt/clearing/bin/reports-service.jar +ADD application.properties /opt/clearing/bin/application.properties +USER root +ENTRYPOINT java -jar /opt/clearing/bin/reports-service.jar --spring.config.location=/opt/clearing/bin/ \ No newline at end of file diff --git a/z-distr/src/main/resources/distr/modules/utility-service/Dockerfile b/z-distr/src/main/resources/distr/modules/utility-service/Dockerfile new file mode 100644 index 000000000..e2eb6d7f0 --- /dev/null +++ b/z-distr/src/main/resources/distr/modules/utility-service/Dockerfile @@ -0,0 +1,6 @@ +FROM debian:stable-20220125-jdk17 + +ADD utility-service.jar /opt/clearing/bin/utility-service.jar +ADD application.properties /opt/clearing/bin/application.properties +USER root +ENTRYPOINT java -jar /opt/clearing/bin/utility-service.jar --spring.config.location=/opt/clearing/bin/ \ No newline at end of file