diff --git a/clearing-parent/account-service/pom.xml b/clearing-parent/account-service/pom.xml index e397eb120..80eea51aa 100644 --- a/clearing-parent/account-service/pom.xml +++ b/clearing-parent/account-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 4.0.0 diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClientCodeValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClientCodeValidationConfig.java index 61e03aeb8..9a7dd0630 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClientCodeValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClientCodeValidationConfig.java @@ -1,5 +1,9 @@ package ru.spcex.clearing.account.config.validation; +import java.util.Map; +import java.util.Objects; +import java.util.function.Consumer; +import java.util.function.Function; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.clearing.classes.statics.data.account.Account; @@ -7,9 +11,12 @@ import ru.clearing.classes.statics.data.account.ClientCode; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.platform.dictionary.ServiceStatusDictionary; import ru.spcex.clearing.account.errors.AccountError; +import ru.spcex.clearing.account.validation.BackendClientCodeValidationRule; +import ru.spcex.clearing.account.validation.GatewayClientCodeValidationRule; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; @@ -17,18 +24,9 @@ import ru.spcex.clearing.validation.common.rules.IdPresentRule; import ru.spcex.platform.classes.base.SpcexObjectBase; 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 ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.ValidatorImpl; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Consumer; -import java.util.function.Function; - @Configuration public class ClientCodeValidationConfig { @@ -41,86 +39,50 @@ public class ClientCodeValidationConfig { addImdg.accept(IMDGDistributedNames.Map_Company); addImdg.accept(IMDGDistributedNames.Map_Account); addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry); + addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryList); addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); return new ValidatorImpl<>(context, - FieldRequiredRule.instance("companyId", ClientCodeNewRequest::getCompanyId, AccountError.RequiredFieldEmpty), - IdPresentRule.instance("companyId", - ClientCodeNewRequest::getCompanyId, - IMDGDistributedNames.Map_Company, - Company.class, - AccountError.RequiredFieldEmpty, - AccountError.CompanyNotFound), + FieldRequiredRule.instance("companyId", ClientCodeNewRequest::getCompanyId, AccountError.RequiredFieldEmpty), + IdPresentRule.instance("companyId", + ClientCodeNewRequest::getCompanyId, + IMDGDistributedNames.Map_Company, + Company.class, + AccountError.RequiredFieldEmpty, + AccountError.CompanyNotFound), - IdPresentRule.instance("moneyAccountId", - ClientCodeNewRequest::getMoneyAccountId, - IMDGDistributedNames.Map_Account, - Account.class, - AccountError.RequiredFieldEmpty, - AccountError.AccountNotFound, - false, - acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId()) - ? null : AccountError.AccountNotFound - ), - IdPresentRule.instance("depoAccountId", - ClientCodeNewRequest::getDepoAccountId, - IMDGDistributedNames.Map_Account, - Account.class, - AccountError.RequiredFieldEmpty, - AccountError.AccountNotFound, - false, - acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId()) - ? null : AccountError.AccountNotFound - ), - new ExistAllCurrencyAccountId<>("currencyAccountList", - ClientCodeNewRequest::getCurrencyAccountList - ), - - DictionaryPresentRule.instance("stauts", - ClientCodeNewRequest::getStatus, - IMDGDistributedNames.Map_ServiceStatusDictionary, - ServiceStatusDictionary.class, - AccountError.RequiredFieldEmpty, - AccountError.DictionaryNotFound, - false) + IdPresentRule.instance("moneyAccountId", + ClientCodeNewRequest::getMoneyAccountId, + IMDGDistributedNames.Map_Account, + Account.class, + AccountError.RequiredFieldEmpty, + AccountError.AccountNotFound, + false, + acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId()) + ? null : AccountError.AccountNotFound + ), + IdPresentRule.instance("depoAccountId", + ClientCodeNewRequest::getDepoAccountId, + IMDGDistributedNames.Map_Account, + Account.class, + AccountError.RequiredFieldEmpty, + AccountError.AccountNotFound, + false, + acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId()) + ? null : AccountError.AccountNotFound + ), + BackendClientCodeValidationRule.AllAccountsPresent, + BackendClientCodeValidationRule.TcrIsNotPresentByAccount, + DictionaryPresentRule.instance("status", + ClientCodeNewRequest::getStatus, + IMDGDistributedNames.Map_ServiceStatusDictionary, + ServiceStatusDictionary.class, + AccountError.RequiredFieldEmpty, + AccountError.DictionaryNotFound, + false) ); }; } - public static class ExistAllCurrencyAccountId implements IValidationRule> { - String fieldName; - Function> idGetter; - - public ExistAllCurrencyAccountId(String fieldName, Function> idGetter) { - this.fieldName = fieldName; - this.idGetter = idGetter; - } - - @Override - public Optional validate(ImdgValidationContext context) { - R validatedObject = context.getValidatedObject(); - List ids = idGetter.apply(validatedObject); - if (ids == null || ids.isEmpty()) { - return empty(); // необязательное поле - } - Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); - for (Long id:ids) { - if (id == null) { // null значения в массиве не ожидаются - return of(AccountError.RequiredFieldEmpty, fieldName); - } - Account byIdObject = imdg.getSingleObjectByID(id); - if (byIdObject == null) - return of(AccountError.AccountNotFound, id, fieldName); - } - - return empty(); - } - - @Override - public String ruleName() { - return getClass().getSimpleName() + "{" + fieldName + "}"; - } - } - @Bean("clientCodeUpdateRequestValidator") public Function clientCodeUpdateRequestValidator(Map> imdgForValidation) { return clientCodeUpdateRequest -> { @@ -132,54 +94,51 @@ public class ClientCodeValidationConfig { addImdg.accept(IMDGDistributedNames.Map_Account); addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry); addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); - return new ValidatorImpl>(context, - IdPresentRule.instance("id", - ClientCodeUpdateRequest::getId, - IMDGDistributedNames.Map_ClientCode, - ClientCode.class, - AccountError.RequiredFieldEmpty, - AccountError.RecordNotFound - ), + return new ValidatorImpl<>(context, + IdPresentRule.instance("id", + ClientCodeUpdateRequest::getId, + IMDGDistributedNames.Map_ClientCode, + ClientCode.class, + AccountError.RequiredFieldEmpty, + AccountError.RecordNotFound + ), - FieldRequiredRule.instance("companyId", ClientCodeUpdateRequest::getCompanyId, AccountError.RequiredFieldEmpty), - IdPresentRule.instance("companyId", - ClientCodeUpdateRequest::getCompanyId, - IMDGDistributedNames.Map_Company, - Company.class, - AccountError.RequiredFieldEmpty, - AccountError.CompanyNotFound), + FieldRequiredRule.instance("companyId", ClientCodeUpdateRequest::getCompanyId, AccountError.RequiredFieldEmpty), + IdPresentRule.instance("companyId", + ClientCodeUpdateRequest::getCompanyId, + IMDGDistributedNames.Map_Company, + Company.class, + AccountError.RequiredFieldEmpty, + AccountError.CompanyNotFound), - IdPresentRule.instance("moneyAccountId", - ClientCodeUpdateRequest::getMoneyAccountId, - IMDGDistributedNames.Map_Account, - Account.class, - AccountError.RequiredFieldEmpty, - AccountError.AccountNotFound, - false, - acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId()) - ? null : AccountError.AccountNotFound - ), - IdPresentRule.instance("depoAccountId", - ClientCodeUpdateRequest::getDepoAccountId, - IMDGDistributedNames.Map_Account, - Account.class, - AccountError.RequiredFieldEmpty, - AccountError.AccountNotFound, - false, - acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId()) - ? null : AccountError.AccountNotFound - ), - new ExistAllCurrencyAccountId<>("currencyAccountList", - ClientCodeUpdateRequest::getCurrencyAccountList - ), - - DictionaryPresentRule.instance("stauts", - ClientCodeUpdateRequest::getStatus, - IMDGDistributedNames.Map_ServiceStatusDictionary, - ServiceStatusDictionary.class, - AccountError.RequiredFieldEmpty, - AccountError.DictionaryNotFound, - false) + IdPresentRule.instance("moneyAccountId", + ClientCodeUpdateRequest::getMoneyAccountId, + IMDGDistributedNames.Map_Account, + Account.class, + AccountError.RequiredFieldEmpty, + AccountError.AccountNotFound, + true, + acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId()) + ? null : AccountError.AccountNotFound + ), + IdPresentRule.instance("depoAccountId", + ClientCodeUpdateRequest::getDepoAccountId, + IMDGDistributedNames.Map_Account, + Account.class, + AccountError.RequiredFieldEmpty, + AccountError.AccountNotFound, + false, + acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId()) + ? null : AccountError.AccountNotFound + ), + BackendClientCodeValidationRule.AllAccountsPresent, + DictionaryPresentRule.instance("stauts", + ClientCodeUpdateRequest::getStatus, + IMDGDistributedNames.Map_ServiceStatusDictionary, + ServiceStatusDictionary.class, + AccountError.RequiredFieldEmpty, + AccountError.DictionaryNotFound, + false) ); }; } @@ -192,14 +151,35 @@ public class ClientCodeValidationConfig { Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_ClientCode); return new ValidatorImpl<>(context, -// FieldRequiredRule.instance("id", CommonDeleteRequest::getId, CompanyErrors.RequiredFieldEmpty), - IdPresentRule.instance("id", - CommonDeleteRequest::getId, - IMDGDistributedNames.Map_ClientCode, - ClientCode.class, - AccountError.RequiredFieldEmpty, - AccountError.RecordNotFound) + IdPresentRule.instance("id", + CommonDeleteRequest::getId, + IMDGDistributedNames.Map_ClientCode, + ClientCode.class, + AccountError.RequiredFieldEmpty, + AccountError.RecordNotFound) ); }; } + + @Bean("tkrAccountsGatewayValidator") + public Function newTkrAccountsGatewayValidator(Map> imdgForValidation) { + return tkrGatewayRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(tkrGatewayRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Company); + addImdg.accept(IMDGDistributedNames.Map_CompanySymbols); + addImdg.accept(IMDGDistributedNames.Map_Account); + addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry); + return new ValidatorImpl<>(context, + FieldRequiredRule.instance("client_code", TkrAccount::getClientCode, AccountError.RequiredFieldEmpty), + GatewayClientCodeValidationRule.CompanyPresent, + GatewayClientCodeValidationRule.AllAccountsPresent, + GatewayClientCodeValidationRule.DepoAccountsPresent, + GatewayClientCodeValidationRule.TcrIsNotPresent, + GatewayClientCodeValidationRule.TcrListIsNotPresent + ); + }; + } + } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java index 35581a678..837836244 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryListValidationConfig.java @@ -1,6 +1,8 @@ package ru.spcex.clearing.account.config.validation; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -49,25 +51,27 @@ public class TradingClearingRegistryListValidationConfig { addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry); addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); return new ValidatorImpl<>(context, - IdPresentRule.instance("tradingClearingRegistryId", - TradingClearingRegistryListNewRequest::getTradingClearingRegistryId, - IMDGDistributedNames.Map_TradingClearingRegistry, - TradingClearingRegistry.class, - AccountError.RequiredFieldEmpty, - AccountError.TradingClearingRegistryNotFound, - false), - new ExistAllAccountId<>("accountId", - TradingClearingRegistryListNewRequest::getAccountId, - false, - null), - DictionaryPresentRule.instance("stauts", - TradingClearingRegistryListNewRequest::getStatus, - IMDGDistributedNames.Map_ServiceStatusDictionary, - ServiceStatusDictionary.class, - AccountError.RequiredFieldEmpty, - AccountError.DictionaryNotFound, - false), - NotAlreadyPresent.instance + IdPresentRule.instance("tradingClearingRegistryId", + TradingClearingRegistryListNewRequest::getTradingClearingRegistryId, + IMDGDistributedNames.Map_TradingClearingRegistry, + TradingClearingRegistry.class, + AccountError.RequiredFieldEmpty, + AccountError.TradingClearingRegistryNotFound, + false), + new ExistAllAccountId<>("accountId", + TradingClearingRegistryListNewRequest::getCurrencyAccountList, + TradingClearingRegistryListNewRequest::getAccountId, + TradingClearingRegistryListNewRequest::getTradingClearingRegistryId, + false, + null), + DictionaryPresentRule.instance("stauts", + TradingClearingRegistryListNewRequest::getStatus, + IMDGDistributedNames.Map_ServiceStatusDictionary, + ServiceStatusDictionary.class, + AccountError.RequiredFieldEmpty, + AccountError.DictionaryNotFound, + false), + NotAlreadyPresent.instance ); }; } @@ -83,43 +87,43 @@ public class TradingClearingRegistryListValidationConfig { addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry); addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); return new ValidatorImpl>(context, - IdPresentRule.instance2("id", - TradingClearingRegistryListUpdateRequest::getId, - IMDGDistributedNames.Map_TradingClearingRegistryList, - TradingClearingRegistryList.class, - AccountError.RequiredFieldEmpty, - AccountError.RecordNotFound, - true, - (tcrList)-> { - Long accountId = tcrList.getAccountId(); - if (accountId==null) - return null; - if (!IEnumKey.contains(context.getValidatedObject().getStatus(), - ServiceStatus.Active, ServiceStatus.Reopened)) - return null; + IdPresentRule.instance2("id", + TradingClearingRegistryListUpdateRequest::getId, + IMDGDistributedNames.Map_TradingClearingRegistryList, + TradingClearingRegistryList.class, + AccountError.RequiredFieldEmpty, + AccountError.RecordNotFound, + true, + (tcrList) -> { + Long accountId = tcrList.getAccountId(); + if (accountId == null) + return null; + if (!IEnumKey.contains(context.getValidatedObject().getStatus(), + ServiceStatus.Active, ServiceStatus.Reopened)) + return null; - Imdg tradingClearingRegistryListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); - ImdgPredicateBuilder pb = tradingClearingRegistryListImdg.predicateBuilder(); - ImdgPredicate query = pb.and(pb.equals("status", WorkflowStatus.Active.getKey()), - pb.equals("accountId", accountId)); - query = pb.and(query, pb.not(pb.equals("id", tcrList.getId()))); - Collection inOtherLists = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate(query); - if (!inOtherLists.isEmpty()) { - Collection duplicateAccounts = inOtherLists.stream() - .map(TradingClearingRegistryList::getAccountId) - .filter(accountId::equals) - .collect(Collectors.toSet()); - return new EnumMessage(AccountError.AccountForTradingClearingRegistryAlreadyUsed, duplicateAccounts, "accountId"); // (5023) «Счет %s уже используется» - } - return null; - }), - DictionaryPresentRule.instance("status", - TradingClearingRegistryListUpdateRequest::getStatus, - IMDGDistributedNames.Map_ServiceStatusDictionary, - ServiceStatusDictionary.class, - AccountError.RequiredFieldEmpty, - AccountError.DictionaryNotFound, - true) + Imdg tradingClearingRegistryListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); + ImdgPredicateBuilder pb = tradingClearingRegistryListImdg.predicateBuilder(); + ImdgPredicate query = pb.and(pb.equals("status", WorkflowStatus.Active.getKey()), + pb.equals("accountId", accountId)); + query = pb.and(query, pb.not(pb.equals("id", tcrList.getId()))); + Collection inOtherLists = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate(query); + if (!inOtherLists.isEmpty()) { + Collection duplicateAccounts = inOtherLists.stream() + .map(TradingClearingRegistryList::getAccountId) + .filter(accountId::equals) + .collect(Collectors.toSet()); + return new EnumMessage(AccountError.AccountForTradingClearingRegistryAlreadyUsed, duplicateAccounts, "accountId"); // (5023) «Счет %s уже используется» + } + return null; + }), + DictionaryPresentRule.instance("status", + TradingClearingRegistryListUpdateRequest::getStatus, + IMDGDistributedNames.Map_ServiceStatusDictionary, + ServiceStatusDictionary.class, + AccountError.RequiredFieldEmpty, + AccountError.DictionaryNotFound, + true) ); }; } @@ -153,13 +157,21 @@ public class TradingClearingRegistryListValidationConfig { public static class ExistAllAccountId implements IValidationRule> { String fieldName; + Function> accountIdListGetter; Function accountIdGetter; + Function tkrIdGetter; boolean required; Function idGetter; - public ExistAllAccountId(String fieldName, Function accountIdGetter, boolean required, Function idGetter) { + public ExistAllAccountId(String fieldName, + Function> accountIdListGetter, + Function accountIdGetter, + Function tkrIdGetter, + boolean required, Function idGetter) { this.fieldName = fieldName; + this.accountIdListGetter = accountIdListGetter; this.accountIdGetter = accountIdGetter; + this.tkrIdGetter = tkrIdGetter; this.required = required; this.idGetter = idGetter; } @@ -167,8 +179,15 @@ public class TradingClearingRegistryListValidationConfig { @Override public Optional validate(ImdgValidationContext context) { R validatedObject = context.getValidatedObject(); - Long accountId = accountIdGetter.apply(validatedObject); - if (accountId == null) { + List accounts = accountIdListGetter.apply(validatedObject); + if (accounts == null) { + accounts = new ArrayList<>(); + } + Long singleAccountId = accountIdGetter.apply(validatedObject); + if (singleAccountId != null) { + accounts.add(singleAccountId); + } + if (accounts.isEmpty()) { if (required) return of(AccountError.RequiredFieldEmpty, fieldName); // обязательное поле else @@ -177,36 +196,50 @@ public class TradingClearingRegistryListValidationConfig { Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); // Проверить существование счетов { - Account byIdObject = accountImdg.getSingleObjectByID(accountId); - if (byIdObject == null) - return of(AccountError.AccountNotFound, accountId, fieldName); - if (!IEnumKey.contains(byIdObject.getAccountType(), AccountType.Clrn, AccountType.Info)) { - return of(AccountError.AccountIsNotACurrency, accountId, + for (Long accountId : accounts) { + Account byIdObject = accountImdg.getSingleObjectByID(accountId); + if (byIdObject == null) + return of(AccountError.AccountNotFound, accountId, fieldName); + if (!IEnumKey.contains(byIdObject.getAccountType(), AccountType.Clrn, AccountType.Info)) { + return of(AccountError.AccountIsNotACurrency, accountId, fieldName, "expected: CLRN/INFO but is " + byIdObject.getAccountType()); // Счет %S не - } - if (CurrencyCode.isRub(byIdObject.getCurrency()) || StringUtils.isEmpty(byIdObject.getCurrency())) { - return of(AccountError.AccountIsNotACurrency, accountId, fieldName); // Счет %S не валютный - } - } + } + if (CurrencyCode.isRub(byIdObject.getCurrency()) || StringUtils.isEmpty(byIdObject.getCurrency())) { + return of(AccountError.AccountIsNotACurrency, accountId, fieldName); // Счет %S не валютный + } - // Проверка отсутствия других TradingClearingRegistryList с этими счетами - Imdg tradingClearingRegistryListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); - ImdgPredicateBuilder pb = tradingClearingRegistryListImdg.predicateBuilder(); - ImdgPredicate query = pb.and(pb.equals("status", WorkflowStatus.Active.getKey()), - pb.equals("accountId", accountId)); - if (idGetter != null) { - Long id = idGetter.apply(validatedObject); - if (id == null) // never - return of(AccountError.RequiredFieldEmpty, "id"); - query = pb.and(query, pb.not(pb.equals("id", id))); - } - Collection inOtherLists = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate(query); - if (!inOtherLists.isEmpty()) { - Collection duplicateAccounts = inOtherLists.stream() - .map(TradingClearingRegistryList::getAccountId) - .filter(accountId::equals) - .collect(Collectors.toSet()); - return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, duplicateAccounts, fieldName); // (5023) «Счет %s уже используется» + // Проверка отсутствия других TradingClearingRegistryList с этими счетами + Imdg tradingClearingRegistryListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); + ImdgPredicateBuilder pb = tradingClearingRegistryListImdg.predicateBuilder(); + + Collection listWithAccountId = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate( + pb.and( + pb.equals("accountId", accountId), + pb.equals("status", WorkflowStatus.Active.getKey()) + )); + if (!listWithAccountId.isEmpty()){ + return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, byIdObject.getAccount(), fieldName); // (5023) «Данная счет %s уже используется» + } + Long tkrId = tkrIdGetter.apply(validatedObject); + ImdgPredicate query = pb.and( + pb.equals("tradingClearingRegistryId", tkrId), + pb.equals("status", WorkflowStatus.Active.getKey()), + pb.equals("currency", byIdObject.getCurrency())); + if (idGetter != null) { + Long id = idGetter.apply(validatedObject); + if (id == null) // never + return of(AccountError.RequiredFieldEmpty, "id"); + query = pb.and(query, pb.not(pb.equals("id", id))); + } + Collection inOtherLists = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate(query); + if (!inOtherLists.isEmpty()) { +// Collection duplicateAccounts = inOtherLists.stream() +// .map(tradingClearingRegistryList -> +// accountImdg.getSingleObjectByID(tradingClearingRegistryList.getAccountId()).getAccount()) +// .collect(Collectors.toSet()); + return of(AccountError.CurrencyForTradingClearingRegistryListAlreadyUsed, byIdObject.getCurrency(), fieldName); // (5023) «Данная валюта %s уже используется» + } + } } return empty(); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryValidationConfig.java index 2a9d7a877..fe1e099db 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/TradingClearingRegistryValidationConfig.java @@ -31,6 +31,7 @@ import ru.spcex.platform.utils.validation.ValidatorImpl; import java.util.Collection; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; @@ -140,11 +141,6 @@ public class TradingClearingRegistryValidationConfig { if (validatedObject.getMoneyAccountId() == null) { return of(AccountError.RequiredFieldEmpty, "MoneyAccountId"); } - //Map> query = new HashMap<>(); -// query.put("moneyAccountId", validatedObject.getMoneyAccountId()); -// if (validatedObject.getDepoAccountId() != null) { -// query.put("depoAccountId", validatedObject.getDepoAccountId()); -// } ImdgPredicateBuilder pb = tcrMap.predicateBuilder(); ImdgPredicate query = pb.equals("moneyAccountId", validatedObject.getMoneyAccountId()); if (validatedObject.getDepoAccountId() != null) { @@ -160,8 +156,49 @@ public class TradingClearingRegistryValidationConfig { Account account = accountImdg.getSingleObjectByID(validatedObject.getMoneyAccountId()); if (account == null && validatedObject.getDepoAccountId() != null) account = accountImdg.getSingleObjectByID(validatedObject.getDepoAccountId()); return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, account.getAccount()); -// String tcrIds = existTCR.stream().map(tcr -> String.valueOf(tcr.getId())).collect(Collectors.joining(";")); -// return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, tcrIds); + } + } + } + + static class updateTCRDepoCheck implements IValidationRule> { + @Override + public Optional validate(ImdgValidationContext context) { + TradingClearingRegistryUpdateRequest validatedObject = context.getValidatedObject(); + Long depoAccountId = validatedObject.getDepoAccountId(); + if (depoAccountId == null) // необязательное поле + return empty(); + + // Проверка типа счёта ДЕПО, что существует + Imdg depoAccountImdg = context.obtainMap(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class); + DepoAccount depoAccount = depoAccountImdg.getFirstObjectByFieldValues( + Map.of("accountId", depoAccountId) + ); + if (depoAccount == null) + return of(AccountError.AccountNotFound, depoAccountId); + + // Проверка компании ТКР и счёта + Imdg tcrMap = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); + Imdg accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + Account account = accountImdg.getSingleObjectByID(validatedObject.getMoneyAccountId()); + if (account == null) { // never + return of(AccountError.AccountNotFound, depoAccountId); + } + TradingClearingRegistry updateObject = tcrMap.getSingleObjectByID(validatedObject.getId()); + if (!Objects.equals(account.getCompanyId(), updateObject.getCompanyId())) { + return of(AccountError.AccountNotFound, depoAccountId); // или UserVerifyDenial + } + + // Проверка использования счёта в других ТКР + ImdgPredicateBuilder pb = tcrMap.predicateBuilder(); + ImdgPredicate query = pb.and(pb.equals("depoAccountId", validatedObject.getDepoAccountId()), + pb.not(pb.equals("id", validatedObject.getId())) + ); + Collection existTCR = tcrMap.getCollectionObjectsByPredicate(query); + if (existTCR.isEmpty()) { + return empty(); + } else { + if (account == null && validatedObject.getDepoAccountId() != null) account = accountImdg.getSingleObjectByID(validatedObject.getDepoAccountId()); + return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, account.getAccount()); } } } @@ -177,6 +214,8 @@ public class TradingClearingRegistryValidationConfig { Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary); addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry); + addImdg.accept(IMDGDistributedNames.Map_Account); + addImdg.accept(IMDGDistributedNames.Map_DepoAccount); return new ValidatorImpl<>(context, IdPresentRule.instance("id", TradingClearingRegistryUpdateRequest::getId, @@ -190,7 +229,9 @@ public class TradingClearingRegistryValidationConfig { ServiceStatusDictionary.class, AccountError.RequiredFieldEmpty, AccountError.DictionaryNotFound, - false) + false), + + new updateTCRDepoCheck() ); }; } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java index 6e6f29144..61465871d 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ValidationConfig.java @@ -1,15 +1,28 @@ package ru.spcex.clearing.account.config.validation; +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import ru.clearing.classes.statics.data.account.*; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.AccountSymbols; +import ru.clearing.classes.statics.data.account.BankAccount; +import ru.clearing.classes.statics.data.account.ClearingAccount; +import ru.clearing.classes.statics.data.account.ClientCode; +import ru.clearing.classes.statics.data.account.DepoAccount; +import ru.clearing.classes.statics.data.account.InformationAccount; import ru.clearing.classes.statics.data.company.ClearingMemberCategory; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.misc.Currency; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList; -import ru.clearing.platform.dictionary.*; +import ru.clearing.platform.dictionary.AccountTypeDictionary; +import ru.clearing.platform.dictionary.ClearingAccountTypeDictionary; +import ru.clearing.platform.dictionary.CurrencyCodeDictionary; +import ru.clearing.platform.dictionary.ServiceStatusDictionary; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.classes.base.SpcexObjectBase; @@ -17,10 +30,6 @@ import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.IMessageResolver; -import java.util.HashMap; -import java.util.Map; -import java.util.function.BiConsumer; - @Configuration public class ValidationConfig { @@ -44,6 +53,7 @@ public class ValidationConfig { addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); addImdg.accept(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class); addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); + addImdg.accept(IMDGDistributedNames.Map_Currency, Currency.class); //for ClientCodeValidationConfig addImdg.accept(IMDGDistributedNames.Map_ClientCode, ClientCode.class); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java index 0b379cd29..23f3cfd0d 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/errors/AccountError.java @@ -24,6 +24,12 @@ public enum AccountError implements IErrorEnumId { AccountFieldNotSet(5024L), AccountDepoTypeRequired(5025L), AccountIsNotACurrency(5026L), // Счет %S не валютный + CompanyHasNotClearingMemberCategory(5027L), + //ошибки для трансляции в модуль gateway + TCR_NOT_FOUND_GTW(5028L), + ACCOUNT_NOT_FOUND_GTW(5029L), + COMPANY_NOT_FOUND_GTW(5030L), + CurrencyForTradingClearingRegistryListAlreadyUsed(5031L), TradingClearingRegistryNotFound(3022L), CurrencyNotFound(1016L), ; diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/ClientCodeBusiness.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/ClientCodeBusiness.java new file mode 100644 index 000000000..825f75c89 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/ClientCodeBusiness.java @@ -0,0 +1,28 @@ +package ru.spcex.clearing.account.model; + +import java.util.List; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.spcex.platform.enumeration.Status; + +public class ClientCodeBusiness { + private Status code; + private Company company; + private Account moneyAccount; + private Account depoAccount; + private List currentAccounts; + private TradingClearingRegistry tradingClearingRegistry; + private Status status; + + public ClientCodeBusiness(Status code, + Company company, Account moneyAccount, Account depoAccount, List currentAccounts, TradingClearingRegistry tradingClearingRegistry, Status status) { + this.code = code; + this.company = company; + this.moneyAccount = moneyAccount; + this.depoAccount = depoAccount; + this.currentAccounts = currentAccounts; + this.tradingClearingRegistry = tradingClearingRegistry; + this.status = status; + } +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/TradingClearingRegistryBusiness.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/TradingClearingRegistryBusiness.java new file mode 100644 index 000000000..fb5c6b7ea --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/TradingClearingRegistryBusiness.java @@ -0,0 +1,79 @@ +package ru.spcex.clearing.account.model; + +import java.util.Optional; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.DepoAccount; +import ru.clearing.classes.statics.data.company.Company; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.enumeration.TradingClearingRegistryType; + +public class TradingClearingRegistryBusiness { + private Company company; + private Account moneyAccount; + private Status status; + private Optional depoAccount; + private Optional tradingClearingRegistryType; + + private TradingClearingRegistryBusiness() { + this.depoAccount = Optional.empty(); + this.tradingClearingRegistryType = Optional.empty(); + } + + public static TradingClearingRegistryBusiness builder() { + return new TradingClearingRegistryBusiness(); + } + + public TradingClearingRegistryBusiness company(Company company) { + this.company = company; + return this; + } + + public TradingClearingRegistryBusiness moneyAccount(Account moneyAccount) { + this.moneyAccount = moneyAccount; + return this; + } + + public TradingClearingRegistryBusiness depoAccount(DepoAccount depoAccount) { + this.depoAccount = Optional.of(depoAccount); + return this; + } + + public TradingClearingRegistryBusiness status(Status status) { + this.status = status; + return this; + } + public TradingClearingRegistryBusiness tradingClearingRegistryType(TradingClearingRegistryType type) { + this.tradingClearingRegistryType = Optional.of(type); + return this; + } + + public TradingClearingRegistryBusiness build() { + TradingClearingRegistryBusiness tradingClearingRegistryBusiness = new TradingClearingRegistryBusiness(); + tradingClearingRegistryBusiness.company = this.company; + tradingClearingRegistryBusiness.status = this.status; + tradingClearingRegistryBusiness.depoAccount = this.depoAccount; + tradingClearingRegistryBusiness.moneyAccount = this.moneyAccount; + tradingClearingRegistryBusiness.tradingClearingRegistryType = this.tradingClearingRegistryType; + return tradingClearingRegistryBusiness; + } + + public Company getCompany() { + return company; + } + + public Account getMoneyAccount() { + return moneyAccount; + } + + public Optional getDepoAccount() { + return depoAccount; + } + + public Status getStatus() { + return status; + } + + public Optional getTradingClearingRegistryType() { + return tradingClearingRegistryType; + } +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/ValidationResult.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/ValidationResult.java new file mode 100644 index 000000000..dfd6c4b80 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/model/ValidationResult.java @@ -0,0 +1,12 @@ +package ru.spcex.clearing.account.model; + +import java.util.Optional; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidator; + +public record ValidationResult(IValidator validator, Optional error, Optional errorMsg) { + public boolean isValid() { + return error.isEmpty(); + } +} + 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 index 1856f6713..669159287 100644 --- 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 @@ -34,6 +34,7 @@ import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.DepoAccountType; import ru.spcex.platform.enumeration.Sender; import ru.spcex.platform.enumeration.ServiceStatus; @@ -137,20 +138,21 @@ public class AccountService extends QueueConsumer implements InitializingBean { CorrespondentAccountNewRequest req = userRequest.getRequestPayload(); Currency currency = validator.getStored(Stored.currency); - + String currencyCode = req.getCurrency() == null ? CurrencyCode.RUB.getKey() : req.getCurrency(); + Long currencyCodeId = CurrencyCode.RUB.getKey().equals(currencyCode) ? 810 : currency.getId(); Instant now = Instant.now(); Account account = new Account(); account.setCompanyId(req.getCompanyId()); account.setAccount(req.getAccount()); if (AccountType.Info.equalsByKey(req.getAccountType())) { - Long infoSequenceId = informationAccountService.accountNextId(currency.getCurrencyCode(), currency.getId()); + Long infoSequenceId = informationAccountService.accountNextId(currencyCode, currencyCodeId); - String accountValue = informationAccountService.generateInfoAccount(currency.getId(), infoSequenceId); + String accountValue = informationAccountService.generateInfoAccount(currencyCodeId, infoSequenceId); log.trace("New info-account SequenceId={} account={}", infoSequenceId, accountValue); account.setAccount(accountValue); } account.setAccountType(req.getAccountType()); - account.setCurrency(currency.getCurrencyCode()); + account.setCurrency(currencyCode); if (req.getStatus() == null) { account.setStatus(WorkflowStatus.Active.getKey()); log.trace("Status not set in request. Use default: {}", account.getStatus()); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java index a8513210c..ded1d1dec 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/BankAccountService.java @@ -138,6 +138,7 @@ public class BankAccountService extends QueueConsumer implements InitializingBea bankAccount.setCompanyId(req.getCompanyId()); bankAccount.setAccountId(accountId); bankAccount.setSwiftCode(req.getSwiftCode()); + bankAccount.setIntermediarySwiftCode(req.getIntermediarySwiftCode()); bankAccountId = bankAccountMap.insert(bankAccount); txOk = true; @@ -176,6 +177,7 @@ public class BankAccountService extends QueueConsumer implements InitializingBea bankAccount.setTaxRegistrationReasonCode(req.getTaxRegistrationReasonCode()); bankAccount.setAccount(req.getAccount()); bankAccount.setSwiftCode(req.getSwiftCode()); + bankAccount.setIntermediarySwiftCode(req.getIntermediarySwiftCode()); Account account = accountMap.getSingleObjectByID(bankAccount.getAccountId()); account.setAccount(req.account); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java index c3a2664e9..f289d9900 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java @@ -18,6 +18,7 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.ClearingAccount; import ru.clearing.classes.statics.data.company.ClearingMemberCategory; @@ -27,6 +28,7 @@ import ru.clearing.classes.statics.data.misc.Currency; import ru.clearing.classes.statics.data.misc.Notification; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.sdf.SDf52; +import ru.clearing.platform.dictionary.ClearingAccountTypeDictionary; import ru.clearing.platform.dictionary.ClearingCategoryDictionary; import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -92,6 +94,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin private final Imdg clearingCategoryImdg; private final Imdg tradingClearingRegistryImdg; private final Imdg notificationImdg; + private final Imdg clearingAccountTypeDictionaryImdg; @Autowired public ClearingAccountService(Consumer kafkaQueue, @@ -127,6 +130,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin this.clearingCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingCategoryDictionary, ClearingCategoryDictionary.class); this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.notificationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Notification, Notification.class); + this.clearingAccountTypeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccountTypeDictionary, ClearingAccountTypeDictionary.class); } @Override @@ -378,6 +382,30 @@ public class ClearingAccountService extends QueueConsumer implements Initializin * @return */ private synchronized Account createSdf52Account(String accountValue, String acctType, Long companyId, Long userRequestId) { + { // Валидация + boolean existClearingAccountTypeDictionary; + if (!StringUtils.hasText(acctType)) { + existClearingAccountTypeDictionary = false; + } else { + ClearingAccountTypeDictionary catd = clearingAccountTypeDictionaryImdg.getFirstObjectByFieldValues( + Map.of("code", acctType)); + existClearingAccountTypeDictionary = catd != null; + } + if (!existClearingAccountTypeDictionary) { + String errMsg = messageResolver.resolve(new EnumMessage(AccountError.DictionaryNotFound, acctType, clearingAccountTypeDictionaryImdg.getMapName())); + log.warn(errMsg); + return null; + } + + ClearingMemberCategory companyAnyCMC = clearingMemberCategoryImdg.getFirstObjectByFieldValues(Map.of( + "companyId", companyId + )); + if (companyAnyCMC == null) { + String errMsg = messageResolver.resolve(new EnumMessage(AccountError.CompanyHasNotClearingMemberCategory, companyId)); + log.warn(errMsg); + } + } + Instant now = Instant.now(); Account account = new Account(); account.setAccount(accountValue); @@ -388,7 +416,9 @@ public class ClearingAccountService extends QueueConsumer implements Initializin Long currencyId = Long.valueOf(accountValue.substring(5, 8)); Currency currency = currImdg.getSingleObjectByID(currencyId); account.setCurrency(currency.getCurrencyCode()); - } catch (Throwable e) {} + } catch (Throwable e) { + log.trace("When obtain currency from accountValue: {}", e.toString()); + } } if (TextUtil.isEmpty(account.getCurrency())) { log.warn("Sdf52: Wrong accountValue=\"{}\" - can not parse for get currency", accountValue); @@ -477,14 +507,11 @@ public class ClearingAccountService extends QueueConsumer implements Initializin Account account = sDf52.getAccount() == null ? null : accountImdg.getFirstObjectByFieldValues(accountQuery); if (account == null) { if (SDFProcessService.SDF52_STATUS_3Open.equals(sDf52.getStatus())) { - //log.debug("By generationId={} s_df52[{}].status={}, but account not found (query: {}). Continue with result OK for status 3", - // groupId, sDf52.getId(), sDf52.getStatus(), accountQuery); - // todo http://jira.mfd.msk:8088/browse/CLS-585 добавят поле acc_type в формат дф52 log.trace("By generationId={} s_df52[{}].status={}, account not found (query: {}). Try create new account.", groupId, sDf52.getId(), sDf52.getStatus(), accountQuery); account = createSdf52Account(sDf52.getAccount(),sDf52.getAcc_type(), company.getId(), systemRequest.getId()); if (account == null) { - log.warn("Can not create account: \"{}\", companyId={}. Ignore SDF52.id={}", + log.info("Can not create account: \"{}\", companyId={}. Ignore SDF52.id={}", sDf52.getAccount(), company.getId(), sDf52.getId()); continue; } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java index 226e41430..e49dc9e21 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClientCodeService.java @@ -1,5 +1,14 @@ package ru.spcex.clearing.account.service; +import java.time.Instant; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.function.Function; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerRecord; @@ -11,7 +20,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.ClientCode; +import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -20,7 +31,11 @@ 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.ClientCodeNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgResponse; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr; import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest; @@ -29,6 +44,7 @@ import ru.spcex.clearing.platform.messaging.serialization.LogFormatter; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.platform.messaging.service.Status; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.util.services.RequestHelper; import ru.spcex.clearing.validation.common.ValidationHelper; @@ -42,15 +58,6 @@ import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.log.ExceptionUtils; import ru.spcex.platform.utils.validation.IValidator; -import java.time.Instant; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.function.Function; - @Service public class ClientCodeService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -59,11 +66,12 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean private final ImdgProvider imdgProvider; private final Imdg clientCodeMap; private final Imdg tradingClearingRegistryMap; - - + private final Imdg companySymbolsImdg; + private final Imdg accountImdg; private final Function clientCodeNewRequestValidator; private final Function clientCodeUpdateRequestValidator; private final Function clientCodeDeleteRequestValidator; + private final Function tkrAccountsGatewayValidator; private final ValidationHelper validationHelper; private final UserRoleVerification userRoleVerification; private final IMessageResolver messageResolver; @@ -71,11 +79,13 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean protected TradingClearingRegistryService tradingClearingRegistryService; protected ConfigurableApplicationContext context; + private final KafkaSender kafkaSender; //protected TradingClearingRegistryListService tradingClearingRegistryListService; @Autowired public ClientCodeService(Consumer kafkaQueue, Producer kafkaProducer, + KafkaSender kafkaSender, ImdgProvider imdgProvider, ValidationHelper validationHelper, IMessageResolver messageResolver, @@ -85,16 +95,21 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean UserRoleVerification userRoleVerification, @Qualifier("clientCodeNewRequestValidator") Function clientCodeNewRequestValidator, @Qualifier("clientCodeUpdateRequestValidator") Function clientCodeUpdateRequestValidator, - @Qualifier("clientCodeDeleteRequestValidator") Function clientCodeDeleteRequestValidator) { + @Qualifier("clientCodeDeleteRequestValidator") Function clientCodeDeleteRequestValidator, + @Qualifier("tkrAccountsGatewayValidator") Function tkrAccountsGatewayValidator) { super(kafkaQueue, kafkaProducer); this.kafkaProducer = kafkaProducer; + this.kafkaSender = kafkaSender; this.imdgProvider = imdgProvider; this.idGenerator = imdgProvider.getImdgIdGenerator(); this.clientCodeMap = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class); this.tradingClearingRegistryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); + this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); this.clientCodeNewRequestValidator = clientCodeNewRequestValidator; this.clientCodeUpdateRequestValidator = clientCodeUpdateRequestValidator; this.clientCodeDeleteRequestValidator = clientCodeDeleteRequestValidator; + this.tkrAccountsGatewayValidator = tkrAccountsGatewayValidator; this.validationHelper = validationHelper; this.requestHelper = requestHelper; this.messageResolver = messageResolver; @@ -107,19 +122,23 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean public void afterPropertiesSet() { imdgProvider.waitAvailable(); +// callback(ClientCodeNewRequest.class) +// .setFunction(this::clientCodeNew) +// .forDestination(Consts.DESTINATION_CLIENT_CODE_NEW, callbacks::put); + //note переехало в ClientCodeMessageListener[новая версия сервиса] +// callback(TkrAccountsGatewayRequest.class) +// .setFunction(this::clientCodeNewFromGateway) +// .forDestination(Consts.DESTINATION_CLIENT_CODE_NEW_FROM_GATEWAY, callbacks::put); callback(ClientCodeNewRequest.class) - .setFunction(this::clientCodeNew) - .forDestination(Consts.DESTINATION_CLIENT_CODE_NEW, callbacks::put); - callback(ClientCodeNewRequest.class) - .setFunction(this::clientCodeNewFromApiUmCompany) - .forDestination(Consts.DESTINATION_CLIENT_CODE_NEW_UM_COMPANY, callbacks::put); + .setFunction(this::clientCodeNewFromApiUmCompany) + .forDestination(Consts.DESTINATION_CLIENT_CODE_NEW_UM_COMPANY, callbacks::put); callback(ClientCodeUpdateRequest.class) - .setFunction(this::clientCodeUpdate) - .forDestination(Consts.DESTINATION_CLIENT_CODE_UPDATE, callbacks::put); + .setFunction(this::clientCodeUpdate) + .forDestination(Consts.DESTINATION_CLIENT_CODE_UPDATE, callbacks::put); callback(CommonDeleteRequest.class) - .setFunction(this::clientCodeDelete) - .forDestination(Consts.DESTINATION_CLIENT_CODE_DELETE, callbacks::put); + .setFunction(this::clientCodeDelete) + .forDestination(Consts.DESTINATION_CLIENT_CODE_DELETE, callbacks::put); init(); } @@ -153,10 +172,6 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean return null; } - protected RequestInfoUpdate clientCodeNew(BaseRequest userRequest) { - return clientCodeNew0(userRequest, false); - } - protected RequestInfoUpdate clientCodeNew0(BaseRequest userRequest, boolean fromTCRList) { log.debug("ClientCodeNewRequest received {}", userRequest.getId()); @@ -175,12 +190,12 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean if (doCreateTCR) { try { requestInfoUpdate = createAndWaitTCR(userRequest.getId(), null, - req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId()); + req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId()); if (requestInfoUpdate != null) return requestInfoUpdate; } catch (Exception e) { log.error("Can not wait creation of TCR. request id={};CompanyId={}, MoneyAccountId={}, DepoAccountId={}; {}", - userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(), - e.toString()); + userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(), + e.toString()); return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage()); } } @@ -211,8 +226,8 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean if (requestInfoUpdate != null) return requestInfoUpdate; } catch (Exception e) { log.error("Can not wait creation of tradingClearingRegistryList. request id={}; {}", - userRequest.getId(), - ExceptionUtils.getStackTrace(e)); + userRequest.getId(), + ExceptionUtils.getStackTrace(e)); return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage()); } } @@ -254,12 +269,12 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean if (doCreateTCR) { try { requestInfoUpdate = createAndWaitTCR(userRequest.getId(), null, - req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId()); + req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId()); if (requestInfoUpdate != null) return requestInfoUpdate; } catch (Exception e) { log.error("Can not wait creation of TCR. request id={};CompanyId={}, MoneyAccountId={}, DepoAccountId={}; {}", - userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(), - e.toString()); + userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(), + e.toString()); return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR at this moment" + e.getMessage()); } } @@ -289,8 +304,8 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean if (requestInfoUpdate != null) return requestInfoUpdate; } catch (Exception e) { log.error("Can not wait creation of tradingClearingRegistryList. request id={}; {}", - userRequest.getId(), - ExceptionUtils.getStackTrace(e)); + userRequest.getId(), + ExceptionUtils.getStackTrace(e)); return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage()); } } @@ -333,12 +348,12 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean if (doCreateTCR) { try { requestInfoUpdate = createAndWaitTCR(userRequest.getId(), clientCode.getId(), - req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId()); + req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId()); if (requestInfoUpdate != null) return requestInfoUpdate; } catch (Exception e) { log.error("Can not wait creation of TCR. request id={};CompanyId={}, MoneyAccountId={}, DepoAccountId={}; {}", - userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(), - e.toString()); + userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(), + e.toString()); return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage()); } } @@ -387,7 +402,7 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean query.put("depoAccountId", depoAccountId); } TradingClearingRegistry result = tradingClearingRegistryMap.getFirstObjectByFieldValues(query); - log.trace("TradingClearingRegistry by: {}; {}found", query, result == null ? "not " : ""); + log.trace("TradingClearingRegistry by: {}; {} found", query, result == null ? "not" : ""); return result; } @@ -407,8 +422,8 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean protected RequestInfoUpdate createAndWaitTCR(Long reqId, Long clientCode, Long companyId, Long moneyAccountId, Long depoAccountId) { log.debug("For request {}, clientCode={} need create TCR: companyId={}, moneyAccountId={}, depoAccountId={}", - reqId, clientCode == null ? "new" : clientCode, - companyId, moneyAccountId, depoAccountId); + reqId, clientCode == null ? "new" : clientCode, + companyId, moneyAccountId, depoAccountId); BaseRequest request = new BaseRequest<>(); request.setId(idGenerator.nextId()); request.setActionType(ActionType.NEW); @@ -495,7 +510,7 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean TradingClearingRegistry tradingClearingRegistry = selectTradingClearingRegistry(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId()); if (tradingClearingRegistry == null) { log.warn("TCR not found: CompanyId {}, MoneyAccountId {}, DepoAccountId {}", - req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId()); + req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId()); } else { clientCode.setTradingClearingRegistryId(tradingClearingRegistry.getId()); } @@ -518,7 +533,7 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean TradingClearingRegistry tradingClearingRegistry = selectTradingClearingRegistry(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId()); if (tradingClearingRegistry == null) { log.warn("TCR not found: CompanyId {}, MoneyAccountId {}, DepoAccountId {}", - req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId()); + req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId()); } else { clientCode.setTradingClearingRegistryId(tradingClearingRegistry.getId()); } @@ -532,4 +547,21 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean clientCode.setUpdated(Instant.now()); } + + private Tkr crateErrorTkrToGateway(TkrAccount tkrAccount, Optional errorMsg) { + Tkr tkr = new Tkr(); + tkr.setTkrCode(tkrAccount.getTkrCode()); + tkr.setClientCode(tkrAccount.getClientCode()); + tkr.setCompanyId(tkrAccount.getCompanyId()); + tkr.setDepoAccount(tkrAccount.getDepoAccount()); + errorMsg.ifPresent(tkr::setErrorMessage); + return tkr; + } + + private MoneyAccountMsgResponse convertAccountToResponse(MoneyAccountMsgRequest moneyAccountMsgRequest) { + MoneyAccountMsgResponse msgResponse = new MoneyAccountMsgResponse(); + msgResponse.setAccount(moneyAccountMsgRequest.getAccount()); + msgResponse.setCurrCode(moneyAccountMsgRequest.getCurrCode()); + return msgResponse; + } } diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java index 781ae04ba..1a98c6b2c 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/InformationAccountService.java @@ -302,7 +302,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali } public String generateInfoAccount(Long currencyCodeId, Long id) { - return "%d%d%08d%d".formatted(39911, currencyCodeId, id, 7000); + return "%d%03d%08d%d".formatted(39911, currencyCodeId, id, 7000); } public synchronized Long accountNextId(String currency) { @@ -316,6 +316,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali * @return infoCounter++ */ public synchronized Long accountNextId(String currency, Long currencyCodeId) { + String idWithTrailingZero = String.format("%03d", currencyCodeId); if (currency == null) currency = CurrencyCode.RUB.getKey(); // default AtomicLong infoCounter = infoCounterByCurrency.get(currency); @@ -338,7 +339,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali infoCounter = new AtomicLong(1); log.debug("No account information on map. n={}", infoCounter.get()); } else { - Pattern accPattern = Pattern.compile("39911%d([0-9]{8})7000".formatted(currencyCodeId)); + Pattern accPattern = Pattern.compile("39911%s([0-9]{8})7000".formatted(idWithTrailingZero)); int maxN = 1; int parsedCount = 0; String lastAccount = null; // for debug diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryListService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryListService.java index 1b6b3658d..49d1b7ab4 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryListService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryListService.java @@ -141,7 +141,6 @@ public class TradingClearingRegistryListService extends QueueConsumer implements TradingClearingRegistryListNewRequest req = userRequest.getRequestPayload(); - Account account = accountImdg.getSingleObjectByID(req.getAccountId()); Instant now = Instant.now(); List newIds=new ArrayList<>(); @@ -153,6 +152,7 @@ public class TradingClearingRegistryListService extends QueueConsumer implements tradingClearingRegistryList.setUpdated(now); tradingClearingRegistryList.setTradingClearingRegistryId(req.getTradingClearingRegistryId()); tradingClearingRegistryList.setAccountId(currAccId); + Account account = accountImdg.getSingleObjectByID(currAccId); tradingClearingRegistryList.setCurrency(account.getCurrency()); if (req.getStatus() == null) { tradingClearingRegistryList.setStatus(ServiceStatus.Active.getKey()); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java index 7e7b5f3e6..f8e9a82b9 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/TradingClearingRegistryService.java @@ -6,6 +6,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.function.Function; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; @@ -14,23 +15,34 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.AccountSymbols; import ru.clearing.classes.statics.data.account.ClearingAccount; +import ru.clearing.classes.statics.data.account.ClientCode; import ru.clearing.classes.statics.data.account.DepoAccount; import ru.clearing.classes.statics.data.account.InformationAccount; import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.relation.Relation; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList; import ru.spcex.clearing.account.errors.AccountError; 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.ClientCodeNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount; +import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccountsGatewayRequest; import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest; import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgResponse; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SendTkrRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr; import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.cud.reports.NotificationRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.serialization.LogFormatter; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; @@ -38,7 +50,12 @@ import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.clearing.util.services.RequestHelper; import ru.spcex.clearing.validation.common.ValidationHelper; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.CompanySymbol; +import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.ServiceStatus; +import ru.spcex.platform.enumeration.Status; +import static ru.spcex.platform.enumeration.Task.makeFiles_MTCR; import ru.spcex.platform.enumeration.TradingClearingRegistryPurpose; import ru.spcex.platform.enumeration.TradingClearingRegistryType; import ru.spcex.platform.imdg.api.Imdg; @@ -56,12 +73,16 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini private final ImdgProvider imdgProvider; private final Imdg tradingClearingRegistryImdg; + private final Imdg tradingClearingRegistryListImdg; private final Imdg depoAccountImdg; private final Imdg clearingAccountImdg; private final Imdg informationAccountImdg; private final Imdg accountImdg; + private final Imdg accountSymbolsImdg; private final Imdg companyImdg; + private final Imdg companySymbolsImdg; private final Imdg relationImdg; + private final Imdg clientCodeImdg; private final Function tradingClearingRegistryUpdateRequestValidator; private final RequestHelper requestHelper; @@ -82,11 +103,11 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini IMessageResolver messageResolver, RequestHelper requestHelper, @Qualifier("tradingClearingRegistryNewRequest") - Function tradingClearingRegistryNewRequestValidator, + Function tradingClearingRegistryNewRequestValidator, @Qualifier("tradingClearingRegistryUpdateRequest") - Function tradingClearingRegistryUpdateRequestValidator, + Function tradingClearingRegistryUpdateRequestValidator, @Qualifier("tradingClearingRegistryBlockRequest") - Function tradingClearingRegistryBlockRequestValidator) { + Function tradingClearingRegistryBlockRequestValidator) { super(kafkaQueue, kafkaProducer); this.kafkaProducer = kafkaProducer; this.kafkaSender = kafkaSender; @@ -95,12 +116,16 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini this.requestHelper = requestHelper; this.imdgProvider = imdgProvider; this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); + this.tradingClearingRegistryListImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); this.depoAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class); this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class); this.informationAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class); this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); + this.accountSymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class); this.relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); + this.clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class); + this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); this.tradingClearingRegistryNewRequestValidator = tradingClearingRegistryNewRequestValidator; this.tradingClearingRegistryAutoNewRequestValidator = tradingClearingRegistryNewRequestValidator; // без relation. this.tradingClearingRegistryUpdateRequestValidator = tradingClearingRegistryUpdateRequestValidator; @@ -112,17 +137,23 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini public void afterPropertiesSet() throws Exception { imdgProvider.waitAvailable(); callback(TradingClearingRegistryNewRequest.class) // todo deprecated - unused. - .setFunction(this::tradingClearingRegistryAutoNew) - .forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_AUTO_NEW, callbacks::put); + .setFunction(this::tradingClearingRegistryAutoNew) + .forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_AUTO_NEW, callbacks::put); callback(TradingClearingRegistryNewRequest.class) - .setFunction(this::tradingClearingRegistryNew) - .forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_NEW, callbacks::put); + .setFunction(this::tradingClearingRegistryNew) + .forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_NEW, callbacks::put); callback(TradingClearingRegistryUpdateRequest.class) - .setFunction(this::tradingClearingRegistryUpdate) - .forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE, callbacks::put); + .setFunction(this::tradingClearingRegistryUpdate) + .forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE, callbacks::put); callback(CommonIdRequest.class) - .setFunction(this::tradingClearingRegistryBlock) - .forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_BLOCK, callbacks::put); + .setFunction(this::tradingClearingRegistryBlock) + .forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_BLOCK, callbacks::put); + callback(TkrAccountsGatewayRequest.class) + .setFunction(this::tradingClearingRegistryCheck) + .forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_CHECK, callbacks::put); + callback(LauncherCommandRequest.class) + .setConsumer(this::sendAllTkrToGateway) + .forDestination(makeFiles_MTCR.topic(), callbacks::put); init(); } @@ -162,10 +193,10 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini TradingClearingRegistry registryByCompany = tradingClearingRegistryImdg.getFirstObjectByFieldValues(Map.of("companyId", req.getCompanyId())); if (registryByCompany == null) { log.trace("Not found registry with companyId={}", - req.getCompanyId()); + req.getCompanyId()); return requestHelper.makeErrorResponse(userRequest, - AccountError.TradingClearingRegistryNotFound, - req.getCompanyId()); + AccountError.TradingClearingRegistryNotFound, + req.getCompanyId()); } } @@ -210,6 +241,12 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini targetExistTradingClearingRegistry.setUpdated(Instant.now()); tradingClearingRegistryImdg.update(targetExistTradingClearingRegistry); log.debug("successfully processed, id {}. Updated exist TradingClearingRegistry.id={}", id, targetExistTradingClearingRegistry.getId()); + Optional tkr = createRequestToGateway(tradingClearingRegistry); + if (tkr.isPresent()) { + SendTkrRequest sendTkrRequest = new SendTkrRequest(); + sendTkrRequest.getTkrs().add(tkr.get()); + kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest); + } return null; } } @@ -248,9 +285,8 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini } tradingClearingRegistry.setTradingClearingRegistryType(tradingRegistryType); - TradingClearingRegistryPurpose registryPurpose; - if (req.getDepoAccountId() != null) registryPurpose = TradingClearingRegistryPurpose.C; - else registryPurpose = TradingClearingRegistryPurpose.M; + TradingClearingRegistryPurpose registryPurpose = TradingClearingRegistryPurpose.C; + //http://jira.mfd.msk:8088/browse/CLS-631#comment-60200 tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey()); Company company = companyImdg.getSingleObjectByID(req.getCompanyId()); @@ -293,8 +329,8 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini TradingClearingRegistry registryByCompany = tradingClearingRegistryImdg.getFirstObjectByFieldValues(Map.of("companyId", req.getCompanyId())); if (registryByCompany == null) { return requestHelper.makeErrorResponse(userRequest, - AccountError.TradingClearingRegistryNotFound, - "companyId=" + req.getCompanyId()); + AccountError.TradingClearingRegistryNotFound, + "companyId=" + req.getCompanyId()); } } @@ -327,9 +363,8 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini } tradingClearingRegistry.setTradingClearingRegistryType(tradingRegistryType); - TradingClearingRegistryPurpose registryPurpose; - if (req.getDepoAccountId() != null) registryPurpose = TradingClearingRegistryPurpose.C; - else registryPurpose = TradingClearingRegistryPurpose.M; + //http://jira.mfd.msk:8088/browse/CLS-631#comment-60200 + TradingClearingRegistryPurpose registryPurpose = TradingClearingRegistryPurpose.C; tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey()); Company company = companyImdg.getSingleObjectByID(req.getCompanyId()); @@ -344,6 +379,12 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini tradingClearingRegistryImdg.insert(tradingClearingRegistry); log.info("New TCR.id={} was created.", tradingClearingRegistry.getId()); + Optional tkr = createRequestToGateway(tradingClearingRegistry); + if (tkr.isPresent()) { + SendTkrRequest sendTkrRequest = new SendTkrRequest(); + sendTkrRequest.getTkrs().add(tkr.get()); + kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest); + } sendNotificationToReportSvc(tradingClearingRegistry); sendNotificationToClearingSvc(tradingClearingRegistry); @@ -355,11 +396,11 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini protected Long companySequenceNextId(Long companyId, TradingClearingRegistryPurpose registryPurpose, String tradingRegistryType) { ImdgPredicateBuilder pb = tradingClearingRegistryImdg.predicateBuilder(); Collection existTCR = tradingClearingRegistryImdg.getCollectionObjectsByPredicate( - pb.and( - pb.equals("companyId", companyId), - pb.equals("tradingClearingRegistryPurpose", registryPurpose.getKey()), - pb.equals("tradingClearingRegistryType", tradingRegistryType) - ) + pb.and( + pb.equals("companyId", companyId), + pb.equals("tradingClearingRegistryPurpose", registryPurpose.getKey()), + pb.equals("tradingClearingRegistryType", tradingRegistryType) + ) ); if (existTCR.isEmpty()) { log.trace("For company id={} not found exist TCR.", companyId); @@ -423,18 +464,26 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini if (req.getMoneyAccountId() != null && !req.getMoneyAccountId().equals(tradingClearingRegistry.getMoneyAccountId())) { return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, "MoneyAccountId", req.getMoneyAccountId()); } - if (req.getDepoAccountId() != null && !req.getDepoAccountId().equals(tradingClearingRegistry.getDepoAccountId())) { + if (tradingClearingRegistry.getDepoAccountId() != null && // но можно с null заменить + req.getDepoAccountId() != null && !req.getDepoAccountId().equals(tradingClearingRegistry.getDepoAccountId())) { return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, "DepoAccountId", req.getDepoAccountId()); } // tradingClearingRegistry.setMoneyAccountId(req.getMoneyAccountId()); -// tradingClearingRegistry.setDepoAccountId(req.getDepoAccountId()); - - if (req.getStatus() != null && !Objects.equals(req.getStatus(), tradingClearingRegistry.getStatus())) { + if (req.getStatus() != null && !Objects.equals(req.getStatus(), tradingClearingRegistry.getStatus()) + || req.getDepoAccountId() != null && !req.getDepoAccountId().equals(tradingClearingRegistry.getDepoAccountId()) + ) { Instant now = Instant.now(); tradingClearingRegistry.setUpdated(now); tradingClearingRegistry.setStatus(req.getStatus()); + tradingClearingRegistry.setDepoAccountId(req.getDepoAccountId()); tradingClearingRegistryImdg.update(tradingClearingRegistry); + Optional tkr = createRequestToGateway(tradingClearingRegistry); + if (tkr.isPresent()) { + SendTkrRequest sendTkrRequest = new SendTkrRequest(); + sendTkrRequest.getTkrs().add(tkr.get()); + kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest); + } log.debug("Update TCR.id={}.", tradingClearingRegistry.getId()); } else { log.debug("Nothing to update TCR.id={}.", tradingClearingRegistry.getId()); @@ -464,6 +513,127 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini return null; } + public RequestInfoUpdate tradingClearingRegistryCheck(BaseRequest gatewayRequest) { + TkrAccountsGatewayRequest req = gatewayRequest.getRequestPayload(); + log.debug("TradingClearingRegistryCheckRequest received with requestId : {}", req.getRequestId()); + for (TkrAccount accountForCheck : req.getAccounts()) { + log.debug("Checking TKR with code: {}", accountForCheck.getTkrCode()); + TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryImdg.getSingleObjectByFieldValues( + Map.of("code", accountForCheck.getTkrCode()) + ); + Optional tkr = createRequestToGateway(tradingClearingRegistry); + if (tkr.isPresent()) { + SendTkrRequest sendTkrRequest = new SendTkrRequest(); + sendTkrRequest.getTkrs().add(tkr.get()); + kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest); + } + } + return null; + } + + public RequestInfoUpdate sendAllTkrToGateway(BaseRequest gatewayRequest) { + Collection tkrs = tradingClearingRegistryImdg.getAllValues(); + SendTkrRequest sendTkrRequest = new SendTkrRequest(); + for (TradingClearingRegistry tkr : tkrs) { + log.debug("Create TKR request with id: {}", tkr.getId()); + Optional tkrRequest = createRequestToGateway(tkr); + tkrRequest.ifPresent(value -> sendTkrRequest.getTkrs().add(value)); + } + kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest); + return null; + } + + private Optional createRequestToGateway(TradingClearingRegistry tradingClearingRegistry) { + if (tradingClearingRegistry != null) { + Tkr tkr = new Tkr(); + log.debug("Found TKR with id: {} and code: {}", tradingClearingRegistry.getId(), tradingClearingRegistry.getCode()); + Company company = companyImdg.getSingleObjectByID(tradingClearingRegistry.getCompanyId()); + CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues( + Map.of( + "companySymbol", CompanySymbol.UUID.getKey(), + "companyId", company.getId() + ) + ); + if (companySymbols == null) { + log.warn("CompanySymbols is null, searched by company.id: {}, skip this tkr", company.getId()); + return Optional.empty(); + } + ClientCode clientCode = clientCodeImdg.getFirstObjectByFieldValues( + Map.of("tradingClearingRegistryId", tradingClearingRegistry.getId()) + ); + tkr.setCompanyId(companySymbols.getCompanySymbolValue()); + tkr.setTradingCode(Long.valueOf(company.getTradingCode())); + tkr.setTkrCode(tradingClearingRegistry.getCode()); + tkr.setTkrType(tradingClearingRegistry.getTradingClearingRegistryPurpose()); + tkr.setActive(Status.Active.equalsByKey(tradingClearingRegistry.getStatus())); + String accountType; + if (clientCode == null) { + if (TradingClearingRegistryType.Client_B.equalsByKey( + tradingClearingRegistry.getTradingClearingRegistryType())) { + accountType = "Клиентский общий"; + } else { + accountType = "Общий"; + } + } else { + tkr.setClientCode(clientCode.getCode()); + accountType = "Клиентский обособленный"; + } + tkr.setAccountTypeName(accountType); + if (tradingClearingRegistry.getDepoAccountId() != null) { + AccountSymbols depoAccountSymbol = accountSymbolsImdg.getFirstObjectByFieldValues( + Map.of("accountId", tradingClearingRegistry.getDepoAccountId()) + ); + if (depoAccountSymbol != null) { + tkr.setDepoAccount(depoAccountSymbol.getAccountSymbolValue()); + } + } + { + if (tradingClearingRegistry.getMoneyAccountId() != null) { + Account moneyAccount = accountImdg.getSingleObjectByID(tradingClearingRegistry.getMoneyAccountId()); + MoneyAccountMsgResponse moneyAccountMsg = new MoneyAccountMsgResponse(); + moneyAccountMsg.setAccount(moneyAccount.getAccount()); + moneyAccountMsg.setCurrCode(StringUtils.hasText(moneyAccount.getCurrency()) ? moneyAccount.getCurrency() : "RUB"); + getEksAccount(moneyAccount).ifPresent(moneyAccountMsg::setEksAccount); + moneyAccountMsg.setActive(Status.Active.equalsByKey(moneyAccount.getStatus())); + tkr.getMoneyAccounts().add(moneyAccountMsg); + } + } + { + Collection tradingClearingRegistries = tradingClearingRegistryListImdg.getCollectionObjectsByFieldValues( + Map.of( + "tradingClearingRegistryId", tradingClearingRegistry.getId() + ) + ); + for (TradingClearingRegistryList tkrList : tradingClearingRegistries) { + Account additionalAcc = accountImdg.getSingleObjectByID(tkrList.getAccountId()); + MoneyAccountMsgResponse moneyAccountMsg = new MoneyAccountMsgResponse(); + moneyAccountMsg.setAccount(additionalAcc.getAccount()); + getEksAccount(additionalAcc).ifPresent(moneyAccountMsg::setEksAccount); + moneyAccountMsg.setCurrCode(StringUtils.hasText(additionalAcc.getCurrency()) ? additionalAcc.getCurrency() : "RUB"); + moneyAccountMsg.setActive(Status.Active.equalsByKey(additionalAcc.getStatus())); + tkr.getMoneyAccounts().add(moneyAccountMsg); + } + } + return Optional.of(tkr); + } + return Optional.empty(); + } + + private Optional getEksAccount(Account account) { + if (AccountType.Info.equalsByKey(account.getAccountType())) { + String currency = StringUtils.hasText(account.getCurrency()) ? account.getCurrency() : CurrencyCode.RUB.getKey(); + Account anltAcc = accountImdg.getFirstObjectByFieldValues( + Map.of( + "currency", currency, + "accountType", AccountType.Anlt.getKey() + ) + ); + if (anltAcc != null) { + return Optional.of(anltAcc.getAccount()); + } + } + return Optional.empty(); + } /** * company-service сообщение об успешном добавлении ТКР клиента с параметром tradingClearingRegistry.code diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/GatewayRequestCreator.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/GatewayRequestCreator.java new file mode 100644 index 000000000..9ab1f9844 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/GatewayRequestCreator.java @@ -0,0 +1,130 @@ +package ru.spcex.clearing.account.service.v2; + +import java.util.Collection; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.ClientCode; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgResponse; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr; +import ru.spcex.platform.enumeration.CompanySymbol; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.enumeration.TradingClearingRegistryType; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +@Service +public class GatewayRequestCreator { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final ImdgProvider imdgProvider; + + public GatewayRequestCreator(ImdgProvider imdgProvider) { + this.imdgProvider = imdgProvider; + } + + public Tkr crateErrorTkrToGateway(TkrAccount tkrAccount, Optional errorMsg) { + Tkr tkr = new Tkr(); + tkr.setTkrCode(tkrAccount.getTkrCode()); + tkr.setClientCode(tkrAccount.getClientCode()); + tkr.setCompanyId(tkrAccount.getCompanyId()); + tkr.setDepoAccount(tkrAccount.getDepoAccount()); + tkr.setMoneyAccounts(tkrAccount.getMoneyAccounts() + .stream() + .map(this::convertAccountToResponse) + .collect(Collectors.toList())); + errorMsg.ifPresent(tkr::setErrorMessage); + return tkr; + } + + public Tkr createTkrGatewayReq(TradingClearingRegistry tradingClearingRegistry) { + Tkr tkr = new Tkr(); + log.debug("Found TKR with id: {} and code: {}", tradingClearingRegistry.getId(), tradingClearingRegistry.getCode()); + Imdg companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + Imdg companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + Imdg clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class); + Imdg accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); + Imdg tradingClearingRegistryListImdg = imdgProvider. + getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); + + Company company = companyImdg.getSingleObjectByID(tradingClearingRegistry.getCompanyId()); + CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues( + Map.of( + "companySymbol", CompanySymbol.UUID.getKey(), + "companyId", company.getId() + ) + ); + + ClientCode clientCode = clientCodeImdg.getFirstObjectByFieldValues( + Map.of("tradingClearingRegistryId", tradingClearingRegistry.getId()) + ); + tkr.setCompanyId(companySymbols.getCompanySymbolValue()); + tkr.setTradingCode(Long.valueOf(company.getTradingCode())); + tkr.setTkrCode(tradingClearingRegistry.getCode()); + tkr.setTkrType(tradingClearingRegistry.getTradingClearingRegistryPurpose()); + tkr.setActive(Status.Active.equalsByKey(tradingClearingRegistry.getStatus())); + String accountType; + if (clientCode == null) { + if (TradingClearingRegistryType.Client_B.equalsByKey( + tradingClearingRegistry.getTradingClearingRegistryType())) { + accountType = "Клиентский общий"; + } else { + accountType = "Общий"; + } + } else { + tkr.setClientCode(clientCode.getCode()); + accountType = "Клиентский обособленный"; + } + tkr.setAccountTypeName(accountType); + if (tradingClearingRegistry.getDepoAccountId() != null) { + Account depoAccount = accountImdg.getSingleObjectByID(tradingClearingRegistry.getDepoAccountId()); + if (depoAccount != null) { + tkr.setDepoAccount(depoAccount.getAccount()); + } + } + { + if (tradingClearingRegistry.getMoneyAccountId() != null) { + Account moneyAccount = accountImdg.getSingleObjectByID(tradingClearingRegistry.getMoneyAccountId()); + MoneyAccountMsgResponse moneyAccountMsg = new MoneyAccountMsgResponse(); + moneyAccountMsg.setAccount(moneyAccount.getAccount()); + moneyAccountMsg.setCurrCode(StringUtils.hasText(moneyAccount.getCurrency()) ? moneyAccount.getCurrency() : "RUB"); + moneyAccountMsg.setActive(Status.Active.equalsByKey(moneyAccount.getStatus())); + tkr.getMoneyAccounts().add(moneyAccountMsg); + } + } + { + Collection tradingClearingRegistries = tradingClearingRegistryListImdg.getCollectionObjectsByFieldValues( + Map.of( + "tradingClearingRegistryId", tradingClearingRegistry.getId() + ) + ); + for (TradingClearingRegistryList tkrList : tradingClearingRegistries) { + Account additionalAcc = accountImdg.getSingleObjectByID(tkrList.getAccountId()); + MoneyAccountMsgResponse moneyAccountMsg = new MoneyAccountMsgResponse(); + moneyAccountMsg.setAccount(additionalAcc.getAccount()); + moneyAccountMsg.setCurrCode(StringUtils.hasText(additionalAcc.getCurrency()) ? additionalAcc.getCurrency() : "RUB"); + moneyAccountMsg.setActive(Status.Active.equalsByKey(additionalAcc.getStatus())); + tkr.getMoneyAccounts().add(moneyAccountMsg); + } + } + return tkr; + } + + private MoneyAccountMsgResponse convertAccountToResponse(MoneyAccountMsgRequest moneyAccountMsgRequest) { + MoneyAccountMsgResponse msgResponse = new MoneyAccountMsgResponse(); + msgResponse.setAccount(moneyAccountMsgRequest.getAccount()); + msgResponse.setCurrCode(moneyAccountMsgRequest.getCurrCode()); + return msgResponse; + } +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/ClientCodeFacade.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/ClientCodeFacade.java new file mode 100644 index 000000000..a0b7cd4ca --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/ClientCodeFacade.java @@ -0,0 +1,122 @@ +package ru.spcex.clearing.account.service.v2.facade; + +import java.time.Instant; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.account.ClientCode; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest; +import ru.spcex.platform.classes.base.interfaces.IClearingFacade; +import ru.spcex.platform.enumeration.TradingClearingRegistryType; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgId; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.validation.IValidator; + +@Service +public class ClientCodeFacade implements IClearingFacade { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final ImdgId idGenerator; + private final ImdgProvider imdgProvider; + private final Imdg clientCodeImdg; + private final TradingClearingRegistryFacade tradingClearingRegistryFacade; + private final TradingClearingRegistryListFacade tradingClearingRegistryListFacade; + + public ClientCodeFacade(ImdgProvider imdgProvider, + TradingClearingRegistryFacade tradingClearingRegistryFacade, TradingClearingRegistryListFacade tradingClearingRegistryListFacade) { + this.idGenerator = imdgProvider.getImdgIdGenerator(); + this.imdgProvider = imdgProvider; + this.clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class); + this.tradingClearingRegistryFacade = tradingClearingRegistryFacade; + this.tradingClearingRegistryListFacade = tradingClearingRegistryListFacade; + } + + /** + * Создает clientCode, TCR и опционально TCRList, если указаны валюты. + */ + public void createClientCode(ClientCodeNewRequest request, IValidator validator) { + log.trace("Start process creating new client code"); + TradingClearingRegistry tradingClearingRegistry; + { + log.debug("Trading Clearing Registry is not exist, creating..."); + TradingClearingRegistryNewRequest creationTcrRequest = new TradingClearingRegistryNewRequest(); + creationTcrRequest.setCompanyId(request.getCompanyId()); + creationTcrRequest.setMoneyAccountId(request.getMoneyAccountId()); + creationTcrRequest.setDepoAccountId(request.getDepoAccountId()); + creationTcrRequest.setTradingClearingRegistryType(TradingClearingRegistryType.Client_B.getKey()); + tradingClearingRegistry = tradingClearingRegistryFacade.createTradingClearingRegistry(creationTcrRequest, null); + } + { + if (request.getCurrencyAccountList() != null && !request.getCurrencyAccountList().isEmpty()) { + TradingClearingRegistryListNewRequest tcrListNew = new TradingClearingRegistryListNewRequest(); + tcrListNew.setTradingClearingRegistryId(tradingClearingRegistry.getId()); + tcrListNew.setCurrencyAccountList(request.getCurrencyAccountList()); + List tkrListIds = tradingClearingRegistryListFacade.createTradingClearingRegistryList(tcrListNew, null); + } + } + + { + ClientCode clientCode = new ClientCode(); + clientCode.setCreated(Instant.now()); + clientCode.setUpdated(clientCode.getCreated()); + + clientCode.setCompanyId(request.getCompanyId()); + clientCode.setCode(request.getCode()); + clientCode.setMoneyAccountId(request.getMoneyAccountId()); + clientCode.setDepoAccountId(request.getDepoAccountId()); + clientCode.setStatus(request.getStatus()); + clientCodeImdg.insert(clientCode); + log.debug("successfully processed, new clientCode id {}", clientCode.getId()); + } + } + +// public void createClientCode(ClientCodeBusiness businessRequest) { +// log.trace("Start process creating new client code"); +// TradingClearingRegistry tradingClearingRegistry; +// { +// log.debug("Trading Clearing Registry is not exist, creating..."); +// TradingClearingRegistryBusiness creationTcrRequest = new TradingClearingRegistryBusiness(); +// creationTcrRequest.setCompanyId(request.getCompanyId()); +// creationTcrRequest.setMoneyAccountId(request.getMoneyAccountId()); +// creationTcrRequest.setDepoAccountId(request.getDepoAccountId()); +// creationTcrRequest.setTradingClearingRegistryType(TradingClearingRegistryType.Client_B.getKey()); +// tradingClearingRegistry = tradingClearingRegistryFacade.createTradingClearingRegistry(creationTcrRequest, null); +// } +// { +// if (request.getCurrencyAccountList() != null && !request.getCurrencyAccountList().isEmpty()) { +// TradingClearingRegistryListNewRequest tcrListNew = new TradingClearingRegistryListNewRequest(); +// tcrListNew.setTradingClearingRegistryId(tradingClearingRegistry.getId()); +// tcrListNew.setCurrencyAccountList(request.getCurrencyAccountList()); +// List tkrListIds = tradingClearingRegistryListFacade.createTradingClearingRegistryList(tcrListNew, null); +// } +// } +// +// { +// ClientCode clientCode = new ClientCode(); +// clientCode.setCreated(Instant.now()); +// clientCode.setUpdated(clientCode.getCreated()); +// +// clientCode.setCompanyId(request.getCompanyId()); +// clientCode.setCode(request.getCode()); +// clientCode.setMoneyAccountId(request.getMoneyAccountId()); +// clientCode.setDepoAccountId(request.getDepoAccountId()); +// clientCode.setStatus(request.getStatus()); +// clientCodeImdg.insert(clientCode); +// log.debug("successfully processed, new clientCode id {}", clientCode.getId()); +// } +// } + public void lock() { +// tradingClearingRegistryFacade.lock() +// tradingClearingRegistryListFacade.lock() + } + + public void unlock() { +// tradingClearingRegistryFacade.lock() +// tradingClearingRegistryListFacade.lock() + } +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/TradingClearingRegistryFacade.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/TradingClearingRegistryFacade.java new file mode 100644 index 000000000..2a7b8c0f6 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/TradingClearingRegistryFacade.java @@ -0,0 +1,248 @@ +package ru.spcex.clearing.account.service.v2.facade; + +import java.time.Instant; +import java.util.Collection; +import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.account.ClearingAccount; +import ru.clearing.classes.statics.data.account.DepoAccount; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.spcex.clearing.account.model.TradingClearingRegistryBusiness; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.reports.NotificationRequest; +import ru.spcex.clearing.platform.messaging.serialization.LogFormatter; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.platform.enumeration.ServiceStatus; +import ru.spcex.platform.enumeration.TradingClearingRegistryPurpose; +import ru.spcex.platform.enumeration.TradingClearingRegistryType; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.utils.validation.IValidator; + +@Service +public class TradingClearingRegistryFacade { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final ImdgProvider imdgProvider; + private final KafkaSender kafkaSender; + private final Imdg tradingClearingRegistryImdg; + private final Imdg depoAccountImdg; + private final Imdg clearingAccountImdg; + private final Imdg companyImdg; + + public TradingClearingRegistryFacade(ImdgProvider imdgProvider, + KafkaSender kafkaSender) { + this.imdgProvider = imdgProvider; + this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, + TradingClearingRegistry.class); + this.depoAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class); + this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class); + this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + this.kafkaSender = kafkaSender; + } + + public TradingClearingRegistry createTradingClearingRegistry(TradingClearingRegistryNewRequest request, + IValidator validator) { + Long id = tradingClearingRegistryImdg.nextIDSequenceFor(); + TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry(); + tradingClearingRegistry.setId(id); + tradingClearingRegistry.setCompanyId(request.getCompanyId()); + tradingClearingRegistry.setMoneyAccountId(request.getMoneyAccountId()); + tradingClearingRegistry.setDepoAccountId(request.getDepoAccountId()); + + DepoAccount depoAccount = request.getDepoAccountId() != null ? + depoAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", request.getDepoAccountId())) : null; + ClearingAccount clearingAccount = request.getMoneyAccountId() != null ? + clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", request.getMoneyAccountId())) : null; + + if (request.getStatus() == null) { + tradingClearingRegistry.setStatus(ServiceStatus.Active.getKey()); + log.trace("TCR status in request not set. Use default: {}", tradingClearingRegistry.getStatus()); + } else { + tradingClearingRegistry.setStatus(request.getStatus()); + log.trace("TCR status in request set: {}", tradingClearingRegistry.getStatus()); + } + + String tradingRegistryType; + if (request.getTradingClearingRegistryType() != null) { + tradingRegistryType = request.getTradingClearingRegistryType(); + } else if (depoAccount != null) { + tradingRegistryType = depoAccount.getDepoAccountType(); + } else { + if (clearingAccount != null) tradingRegistryType = clearingAccount.getClearingAccountType(); + else tradingRegistryType = TradingClearingRegistryType.Owner_A.getKey(); + } + tradingClearingRegistry.setTradingClearingRegistryType(tradingRegistryType); + + //http://jira.mfd.msk:8088/browse/CLS-631#comment-60200 + TradingClearingRegistryPurpose registryPurpose = TradingClearingRegistryPurpose.C; + tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey()); + + Company company = companyImdg.getSingleObjectByID(request.getCompanyId()); + Long seqId = companySequenceNextId(request.getCompanyId(), registryPurpose, tradingRegistryType); + String code = makeCode(company.getClearingCode(), registryPurpose, tradingRegistryType, seqId); + log.debug("For new TCR.id={} of companyId={} next sequence={}; code={}", id, request.getCompanyId(), seqId, code); + tradingClearingRegistry.setCode(code); + + Instant now = Instant.now(); + tradingClearingRegistry.setCreated(now); + tradingClearingRegistry.setUpdated(now); + + tradingClearingRegistryImdg.insert(tradingClearingRegistry); + + log.info("New TCR.id={} was created.", tradingClearingRegistry.getId()); + sendNotificationToReportSvc(tradingClearingRegistry); + sendNotificationToClearingSvc(tradingClearingRegistry); + + log.debug("successfully processed, id {}", id); + return tradingClearingRegistry; + } + + public TradingClearingRegistry createTradingClearingRegistry(TradingClearingRegistryBusiness businessRequest) { + Long id = tradingClearingRegistryImdg.nextIDSequenceFor(); + TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry(); + tradingClearingRegistry.setId(id); + tradingClearingRegistry.setCompanyId(businessRequest.getCompany().getId()); + tradingClearingRegistry.setMoneyAccountId(businessRequest.getMoneyAccount().getId()); + businessRequest.getDepoAccount().ifPresent(depoAccount -> + tradingClearingRegistry.setDepoAccountId(depoAccount.getId())); + ; + if (businessRequest.getTradingClearingRegistryType().isEmpty()){ + if (businessRequest.getDepoAccount().isPresent()){ + + } + } +// ClearingAccount clearingAccount = request.getMoneyAccountId() != null ? +// clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", request.getMoneyAccountId())) : null; +// +// if (request.getStatus() == null) { +// tradingClearingRegistry.setStatus(ServiceStatus.Active.getKey()); +// log.trace("TCR status in request not set. Use default: {}", tradingClearingRegistry.getStatus()); +// } else { +// tradingClearingRegistry.setStatus(request.getStatus()); +// log.trace("TCR status in request set: {}", tradingClearingRegistry.getStatus()); +// } +// +// String tradingRegistryType; +// if (request.getTradingClearingRegistryType() != null) { +// tradingRegistryType = request.getTradingClearingRegistryType(); +// } else if (depoAccount != null) { +// tradingRegistryType = depoAccount.getDepoAccountType(); +// } else { +// if (clearingAccount != null) tradingRegistryType = clearingAccount.getClearingAccountType(); +// else tradingRegistryType = TradingClearingRegistryType.Owner_A.getKey(); +// } +// tradingClearingRegistry.setTradingClearingRegistryType(tradingRegistryType); + + //http://jira.mfd.msk:8088/browse/CLS-631#comment-60200 + TradingClearingRegistryPurpose registryPurpose = TradingClearingRegistryPurpose.C; + tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey()); + + Company company = businessRequest.getCompany(); +// Long seqId = companySequenceNextId(company.getId(), registryPurpose, tradingRegistryType); +// String code = makeCode(company.getClearingCode(), registryPurpose, tradingRegistryType, seqId); +// log.debug("For new TCR.id={} of companyId={} next sequence={}; code={}", id, company.getId(), seqId, code); +// tradingClearingRegistry.setCode(code); + + Instant now = Instant.now(); + tradingClearingRegistry.setCreated(now); + tradingClearingRegistry.setUpdated(now); + + tradingClearingRegistryImdg.insert(tradingClearingRegistry); + + log.info("New TCR.id={} was created.", tradingClearingRegistry.getId()); + sendNotificationToReportSvc(tradingClearingRegistry); + sendNotificationToClearingSvc(tradingClearingRegistry); + + log.debug("successfully processed, id {}", id); + return tradingClearingRegistry; + } + + private Long companySequenceNextId(Long companyId, + TradingClearingRegistryPurpose registryPurpose, + String tradingRegistryType) { + Imdg tradingClearingRegistryImdg = imdgProvider.getImdg( + IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class + ); + ImdgPredicateBuilder pb = tradingClearingRegistryImdg.predicateBuilder(); + Collection existTCR = tradingClearingRegistryImdg.getCollectionObjectsByPredicate( + pb.and( + pb.equals("companyId", companyId), + pb.equals("tradingClearingRegistryPurpose", registryPurpose.getKey()), + pb.equals("tradingClearingRegistryType", tradingRegistryType) + ) + ); + if (existTCR.isEmpty()) { + log.trace("For company id={} not found exist TCR.", companyId); + return 1L; + } + log.trace("For company id={} found {} exist TCR.", companyId, existTCR.size()); + long maxN = 0; + for (TradingClearingRegistry tcr : existTCR) { + Long codeN = parseCodeSeqId(tcr.getCode()); + if (codeN != null) { + if (maxN < codeN) + maxN = codeN; + } + } + return maxN + 1; + } + + private Long parseCodeSeqId(String code) { + if (code == null || code.isBlank()) + return null; + try { + String toParse = code.trim(); + if (toParse.length() > 5) + toParse = toParse.substring(toParse.length() - 5); + return Long.parseLong(toParse); + } catch (NumberFormatException nan) { + log.warn("Can not parse number from TCR code \"{}\": {}", code, nan.getMessage()); + } + return null; + } + + private String makeCode(String companyClearingCode, + TradingClearingRegistryPurpose registryPurpose, + String tradingRegistryType, + Long id) { + String code; + code = companyClearingCode; + if (code.length() > 4) + code = code.substring(code.length() - 4); + code = "%4s".formatted(code).replace(' ', '0'); +// code += registryPurpose.getKey(); // C / M / ... + code += "C";//пока ставим всегда С, возможно придется откатить + String trType = tradingRegistryType + "T"; // 2 символа + code += trType; + String sId = "%5s".formatted(id).replace(' ', '0'); + if (sId.length() > 5) + sId = sId.substring(sId.length() - 5); + code += sId; + return code; // 12 символов + } + + private void sendNotificationToClearingSvc(TradingClearingRegistry tradingClearingRegistry) { + CreateRegistryRequest request = new CreateRegistryRequest(); + request.setCompanyId(tradingClearingRegistry.getCompanyId()); + request.setTradingClearingRegistryId(tradingClearingRegistry.getId()); + log.debug("Send message to kafka \"{}\": {}", Consts.REGISTRY_NEW, LogFormatter.toStringWrapper(request)); + kafkaSender.sendRequestToQueue(Consts.REGISTRY_NEW, request); + } + + /** + * report-service сообщение на формирование уведомления о создании нового ТКР + */ + private void sendNotificationToReportSvc(TradingClearingRegistry tradingClearingRegistry) { + NotificationRequest request = new NotificationRequest(); + request.setConsumerId(tradingClearingRegistry.getCompanyId()); + log.debug("Send message to kafka \"{}\": {}", Consts.CREATE_NOTIFICATION_NTCR, LogFormatter.toStringWrapper(request)); + kafkaSender.sendRequestToQueue(Consts.CREATE_NOTIFICATION_NTCR, request); + } +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/TradingClearingRegistryListFacade.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/TradingClearingRegistryListFacade.java new file mode 100644 index 000000000..a6bf31300 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/facade/TradingClearingRegistryListFacade.java @@ -0,0 +1,87 @@ +package ru.spcex.clearing.account.service.v2.facade; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest; +import ru.spcex.clearing.platform.messaging.serialization.LogFormatter; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.platform.enumeration.ServiceStatus; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +@Service +public class TradingClearingRegistryListFacade { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final ImdgProvider imdgProvider; + private final KafkaSender kafkaSender; + private final Imdg tradingClearingRegistryImdg; + private final Imdg tradingClearingRegistryListImdg; + private final Imdg accountImdg; + + public TradingClearingRegistryListFacade(ImdgProvider imdgProvider, + KafkaSender kafkaSender) { + this.imdgProvider = imdgProvider; + this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, + TradingClearingRegistry.class); + this.tradingClearingRegistryListImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, + TradingClearingRegistryList.class); + this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); + this.kafkaSender = kafkaSender; + } + + public static class Stored { + TradingClearingRegistry tcr; + Account account; + + } + + public List createTradingClearingRegistryList(TradingClearingRegistryListNewRequest request, + Stored stored) { + TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(request.getTradingClearingRegistryId()); + Instant now = Instant.now(); + + List newIds = new ArrayList<>(); + for (Long currAccId : request.getCurrencyAccountList()) { + Long id = tradingClearingRegistryListImdg.nextIDSequenceFor(); + TradingClearingRegistryList tradingClearingRegistryList = new TradingClearingRegistryList(); + tradingClearingRegistryList.setId(id); + tradingClearingRegistryList.setCreated(now); + tradingClearingRegistryList.setUpdated(now); + tradingClearingRegistryList.setTradingClearingRegistryId(tcr.getId()); + tradingClearingRegistryList.setAccountId(currAccId); + Account account = accountImdg.getSingleObjectByID(currAccId); + tradingClearingRegistryList.setCurrency(account.getCurrency()); + if (request.getStatus() == null) { + tradingClearingRegistryList.setStatus(ServiceStatus.Active.getKey()); + log.trace("TCRList status in request not set. Use default: {}", tradingClearingRegistryList.getStatus()); + } else { + tradingClearingRegistryList.setStatus(request.getStatus()); + } + tradingClearingRegistryListImdg.insert(tradingClearingRegistryList); + newIds.add(id); + + } + log.info("New TCRList.id={} has created.", newIds); + newIds.forEach(listId -> sendNotificationToClearingSvc(listId, tcr)); + return newIds; + } + + private void sendNotificationToClearingSvc(Long tradingClearingRegistryId, TradingClearingRegistry tcr) { + CreateRegistryRequest request = new CreateRegistryRequest(); + request.setTcrListId(tradingClearingRegistryId); + request.setCompanyId(tcr.getCompanyId()); + request.setTradingClearingRegistryId(tcr.getId()); + log.debug("Send message to kafka \"{}\": {}", Consts.REGISTRY_NEW, LogFormatter.toStringWrapper(request)); + kafkaSender.sendRequestToQueue(Consts.REGISTRY_NEW, request); + } +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/listeners/ClientCodeMessageListener.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/listeners/ClientCodeMessageListener.java new file mode 100644 index 000000000..ee8a81f81 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/listeners/ClientCodeMessageListener.java @@ -0,0 +1,191 @@ +package ru.spcex.clearing.account.service.v2.listeners; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.spcex.clearing.account.model.ValidationResult; +import ru.spcex.clearing.account.service.v2.GatewayRequestCreator; +import ru.spcex.clearing.account.service.v2.facade.ClientCodeFacade; +import ru.spcex.clearing.account.service.v2.validators.ClientCodeValidator; +import ru.spcex.clearing.account.validation.ClientCodeStoreObjects; +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.ClientCodeNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount; +import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccountsGatewayRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SendTkrRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.platform.messaging.service.Status; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.platform.enumeration.CurrencyCode; +import ru.spcex.platform.enumeration.TradingClearingRegistryType; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.validation.IValidator; + +@Service +public class ClientCodeMessageListener extends QueueConsumer implements InitializingBean { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final KafkaSender kafkaSender; + private final ImdgProvider imdgProvider; + private final ClientCodeFacade clientCodeFacade; + private final ClientCodeValidator clientCodeValidator; + private final GatewayRequestCreator gatewayRequestCreator; + private final UserRoleVerification userRoleVerification; + + public ClientCodeMessageListener(Consumer kafkaQueue, + Producer kafkaProducer, + KafkaSender kafkaSender, + ImdgProvider imdgProvider, + ClientCodeFacade clientCodeFacade, + ClientCodeValidator clientCodeValidator, + GatewayRequestCreator gatewayRequestCreator, + UserRoleVerification userRoleVerification) { + super(kafkaQueue, kafkaProducer); + this.kafkaSender = kafkaSender; + this.imdgProvider = imdgProvider; + this.clientCodeFacade = clientCodeFacade; + this.clientCodeValidator = clientCodeValidator; + this.gatewayRequestCreator = gatewayRequestCreator; + this.userRoleVerification = userRoleVerification; + } + + @Override + public void afterPropertiesSet() { + imdgProvider.waitAvailable(); + + //from backend-api requests + callback(ClientCodeNewRequest.class) + .setFunction(this::clientCodeNewFromBackend) + .forDestination(Consts.DESTINATION_CLIENT_CODE_NEW, callbacks::put); + //from gateway requests + callback(TkrAccountsGatewayRequest.class) + .setFunction(this::clientCodeNewFromGateway) + .forDestination(Consts.DESTINATION_CLIENT_CODE_NEW_FROM_GATEWAY, callbacks::put); + callback(TkrAccountsGatewayRequest.class) + .setFunction(this::clientCodeNewFromGateway) + .forDestination(Consts.DESTINATION_CLIENT_CODE_UPDATE_FROM_GATEWAY, callbacks::put); + init(); + } + + private RequestInfoUpdate clientCodeNewFromGateway(BaseRequest tkrRequest) { + clientCodeFacade.lock(); + //валидация запроса + TkrAccountsGatewayRequest gatewayRequest = tkrRequest.getRequestPayload(); + + SendTkrRequest sendTkrRequest = new SendTkrRequest(); + sendTkrRequest.setRequestId(gatewayRequest.getRequestId()); + + boolean isAnyoneInvalid = false; + Map accountsAfterValidation = new HashMap<>(); + for (TkrAccount tkrAccount : gatewayRequest.getAccounts()) { + ValidationResult validationResult = clientCodeValidator.checkGatewayRequest(tkrAccount); + if (!validationResult.isValid()) { + log.debug("Validation failed for tkr.client_code {}", tkrAccount.getClientCode()); + isAnyoneInvalid = true; + } + accountsAfterValidation.put(tkrAccount, validationResult); + } + if (isAnyoneInvalid) { + log.debug("Create error request to gateway service"); + + List tkrs = accountsAfterValidation.entrySet() + .stream() + .map(tkrAccountValidationResultEntry -> + gatewayRequestCreator.crateErrorTkrToGateway( + tkrAccountValidationResultEntry.getKey(), + tkrAccountValidationResultEntry.getValue().errorMsg() + )) + .toList(); + sendTkrRequest.setTkrs(tkrs); + kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest); + return null; + } + + //unwrap запроса + for (Map.Entry entry : accountsAfterValidation.entrySet()) { + ClientCodeNewRequest clientCodeNewRequest = new ClientCodeNewRequest(); + TkrAccount tkrAccount = entry.getKey(); + ValidationResult validationResult = entry.getValue(); + log.debug("Creating new clientCode by tkr account: {}", tkrAccount.getClientCode()); + + IValidator validator = validationResult.validator(); + Company company = validator.getStored(ClientCodeStoreObjects.COMPANY); + Optional depoAccount = validator.getStored(ClientCodeStoreObjects.DEPO_ACCOUNT); + Long depoAccountId = depoAccount.map(Account::getId).orElse(null); + Map accountByCurrency = validator.getStored(ClientCodeStoreObjects.MAPPED_TO_CURRENCY_ACCOUNTS); + + clientCodeNewRequest.setCompanyId(company.getId()); + clientCodeNewRequest.setCode(tkrAccount.getClientCode()); + clientCodeNewRequest.setDepoAccountId(depoAccountId); + Account moneyAccount = accountByCurrency.get(CurrencyCode.RUB); + clientCodeNewRequest.setMoneyAccountId(moneyAccount.getId()); + + List foreignCurrencyList = accountByCurrency.entrySet() + .stream() + .filter(currencyCodeAccountEntry -> !CurrencyCode.RUB.equalsByKey(currencyCodeAccountEntry.getKey())) + .map(currencyCodeAccountEntry -> currencyCodeAccountEntry.getValue().getId()) + .toList(); + clientCodeNewRequest.setCurrencyAccountList(foreignCurrencyList); + clientCodeFacade.createClientCode(clientCodeNewRequest, validator); + + TradingClearingRegistry tradingClearingRegistry = selectTradingClearingRegistry(company.getId(), + moneyAccount.getId(), depoAccountId); + sendTkrRequest.getTkrs().add(gatewayRequestCreator.createTkrGatewayReq(tradingClearingRegistry)); + log.debug("Success created new clientCode by tkr account: {}", tkrAccount.getClientCode()); + } + kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest); + return null; + } + + private RequestInfoUpdate clientCodeNewFromBackend(BaseRequest clientCodeNewRequest) { + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(clientCodeNewRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + ClientCodeNewRequest request = clientCodeNewRequest.getRequestPayload(); + ValidationResult validationResult = clientCodeValidator.checkBackendNewRequest(request); + if (!validationResult.isValid()) { + return makeErrorResponse(clientCodeNewRequest, validationResult); + } + + clientCodeFacade.createClientCode(request, validationResult.validator()); + return null; + } + + private RequestInfoUpdate makeErrorResponse(BaseRequest clientCodeNewRequest, + ValidationResult validationResult) { + RequestInfoUpdate requestInfoUpdate = new RequestInfoUpdate(); + requestInfoUpdate.setId(clientCodeNewRequest.getId()); + requestInfoUpdate.setStatus(Status.Error); + validationResult.errorMsg().ifPresent(requestInfoUpdate::setMessage); + return requestInfoUpdate; + } + + private TradingClearingRegistry selectTradingClearingRegistry(Long companyId, Long moneyAccountId, Long depoAccountId) { + Map> query = new HashMap<>(); + query.put("companyId", companyId); + query.put("moneyAccountId", moneyAccountId); + query.put("tradingClearingRegistryType", TradingClearingRegistryType.Client_B.getKey()); + if (depoAccountId != null) { + query.put("depoAccountId", depoAccountId); + } + Imdg tradingClearingRegistryImdg = imdgProvider + .getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); + TradingClearingRegistry result = tradingClearingRegistryImdg.getFirstObjectByFieldValues(query); + log.trace("TradingClearingRegistry by: {}; {} found", query, result == null ? "not" : ""); + return result; + } +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/validators/ClientCodeValidator.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/validators/ClientCodeValidator.java new file mode 100644 index 000000000..89f2eed9d --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/v2/validators/ClientCodeValidator.java @@ -0,0 +1,58 @@ +package ru.spcex.clearing.account.service.v2.validators; + +import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import ru.spcex.clearing.account.model.ValidationResult; +import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount; +import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; +import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.validation.IValidator; + +@Service +public class ClientCodeValidator { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final UserRoleVerification userRoleVerification; + private final Function clientCodeNewRequestValidator; + private final Function clientCodeUpdateRequestValidator; + private final Function clientCodeDeleteRequestValidator; + private final Function tkrAccountsGatewayValidator; + private final IMessageResolver messageResolver; + + public ClientCodeValidator(UserRoleVerification userRoleVerification, + Function clientCodeNewRequestValidator, + Function clientCodeUpdateRequestValidator, + Function clientCodeDeleteRequestValidator, + Function tkrAccountsGatewayValidator, + IMessageResolver messageResolver) { + this.userRoleVerification = userRoleVerification; + this.clientCodeNewRequestValidator = clientCodeNewRequestValidator; + this.clientCodeUpdateRequestValidator = clientCodeUpdateRequestValidator; + this.clientCodeDeleteRequestValidator = clientCodeDeleteRequestValidator; + this.tkrAccountsGatewayValidator = tkrAccountsGatewayValidator; + this.messageResolver = messageResolver; + } + + public ValidationResult checkGatewayRequest(TkrAccount gatewayAccountRequest) { + return standardValidation(tkrAccountsGatewayValidator, gatewayAccountRequest); + } + + public ValidationResult checkBackendNewRequest(ClientCodeNewRequest clientCodeNewRequest) { + return standardValidation(clientCodeNewRequestValidator, clientCodeNewRequest); + } + + private ValidationResult standardValidation(Function requestValidator, T request) { + IValidator validator = requestValidator.apply(request); + Optional error = validator.tillFirstError(); + AtomicReference> errorMsg = new AtomicReference<>(); + error.ifPresent(err -> errorMsg.set(Optional.of(messageResolver.resolve(err)))); + return new ValidationResult(validator, error, errorMsg.get()); + } +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/AccountValidationRule.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/AccountValidationRule.java index 977c67a89..50eff5996 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/AccountValidationRule.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/AccountValidationRule.java @@ -1,5 +1,7 @@ package ru.spcex.clearing.account.validation; +import java.util.Map; +import java.util.Optional; import org.springframework.util.StringUtils; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.company.Company; @@ -12,9 +14,6 @@ import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidationRule; -import java.util.Map; -import java.util.Optional; - public enum AccountValidationRule implements IValidationRule> { CompanyPresent() { diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/BackendClientCodeValidationRule.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/BackendClientCodeValidationRule.java new file mode 100644 index 000000000..b78f2f0d1 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/BackendClientCodeValidationRule.java @@ -0,0 +1,75 @@ +package ru.spcex.clearing.account.validation; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList; +import ru.spcex.clearing.account.errors.AccountError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest; +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; + +public enum BackendClientCodeValidationRule implements IValidationRule> { + AllAccountsPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + ClientCodeNewRequest validatedObject = context.getValidatedObject(); + List ids = validatedObject.getCurrencyAccountList(); + if (ids == null || ids.isEmpty()) { + return empty(); // необязательное поле + } + Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + for (Long id : ids) { + if (id == null) { // null значения в массиве не ожидаются + return of(AccountError.RequiredFieldEmpty, "accountId"); + } + Account byIdObject = imdg.getSingleObjectByID(id); + if (byIdObject == null) + return of(AccountError.AccountNotFound, id, "accountId"); + } + + return empty(); + } + }, + TcrIsNotPresentByAccount() { + @Override + public Optional validate(ImdgValidationContext context) { + ClientCodeNewRequest validatedObject = context.getValidatedObject(); + List currencyIds = validatedObject.getCurrencyAccountList(); + Long moneyAccountId = validatedObject.getMoneyAccountId(); + + Imdg tradingClearingRegistryImdg = + context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); + Imdg tradingClearingRegistryListImdg = + context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class); + + TradingClearingRegistry tcrByMoneyAccount = tradingClearingRegistryImdg.getFirstObjectByFieldValues( + Map.of( + "moneyAccountId", moneyAccountId, + "status", Status.Active.getKey() + )); + if (tcrByMoneyAccount != null) { + return of(AccountError.TradingClearingRegistryAlreadyExist); + } + + for (Long id : currencyIds) { + TradingClearingRegistryList tcrList = tradingClearingRegistryListImdg.getFirstObjectByFieldValues( + Map.of( + "accountId", id, + "status", Status.Active.getKey() + )); + if (tcrList != null) { + return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed); + } + } + + return empty(); + } + } +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/ClientCodeStoreObjects.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/ClientCodeStoreObjects.java new file mode 100644 index 000000000..b4d600f08 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/ClientCodeStoreObjects.java @@ -0,0 +1,9 @@ +package ru.spcex.clearing.account.validation; + +public enum ClientCodeStoreObjects { + COMPANY, + MONEY_ACCOUNT, + DEPO_ACCOUNT, + MAPPED_TO_CURRENCY_ACCOUNTS, + TRADING_CLEARING_REGISTRY +} diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/GatewayClientCodeValidationRule.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/GatewayClientCodeValidationRule.java new file mode 100644 index 000000000..8add6baf9 --- /dev/null +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/GatewayClientCodeValidationRule.java @@ -0,0 +1,160 @@ +package ru.spcex.clearing.account.validation; + +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import org.springframework.util.StringUtils; +import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList; +import ru.spcex.clearing.account.errors.AccountError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest; +import ru.spcex.platform.enumeration.CurrencyCode; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +public enum GatewayClientCodeValidationRule implements IValidationRule> { + CompanyPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + TkrAccount validatedObject = context.getValidatedObject(); + Long tradingCode = validatedObject.getTradingCode(); + if (tradingCode == null) { + return of(AccountError.RequiredFieldEmpty, "trading_code"); + } + + Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + Company company = companyImdg.getFirstObjectByFieldValues( + Map.of("tradingCode", String.valueOf(tradingCode)) + ); + if (company == null) { + return of(AccountError.COMPANY_NOT_FOUND_GTW, "trading_code"); + } + + context.storeObject(ClientCodeStoreObjects.COMPANY, company); + return Optional.empty(); + } + }, + AllAccountsPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + TkrAccount validatedObject = context.getValidatedObject(); + List accountList = validatedObject.getMoneyAccounts(); + if (accountList == null || accountList.isEmpty()) { + return of(AccountError.RequiredFieldEmpty, "money_account"); + } + List currencies = accountList.stream().map(MoneyAccountMsgRequest::getCurrCode).toList(); + if (!currencies.contains(CurrencyCode.RUB.getKey())) { + return of(AccountError.RequiredFieldEmpty, "money_account"); + } + Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + Map accountByCurrency = new HashMap<>(); + for (MoneyAccountMsgRequest moneyAccountMsg : accountList) { + ImdgPredicateBuilder predicateBuilder = imdg.predicateBuilder(); + ImdgPredicate currencyPredicate; + if (!StringUtils.hasText(moneyAccountMsg.getAccount())){ + return of(AccountError.RequiredFieldEmpty, "account"); + } + ImdgPredicate accountPredicate = predicateBuilder.equals("account", moneyAccountMsg.getAccount()); + if (moneyAccountMsg.getCurrCode().equals(CurrencyCode.RUB.getKey())) { + currencyPredicate = predicateBuilder.or( + predicateBuilder.equals("currency", CurrencyCode.RUB.getKey()), + predicateBuilder.isNull("currency") + ); + } else { + currencyPredicate = predicateBuilder.equals("currency", moneyAccountMsg.getCurrCode()); + } + Account account = imdg.getFirstObjectByPredicate( + predicateBuilder.and(accountPredicate, currencyPredicate) + ); + if (account == null) { + return of(AccountError.ACCOUNT_NOT_FOUND_GTW, moneyAccountMsg.getAccount(), "money_account"); + } + accountByCurrency.put(account.getCurrency(), account); + } + context.storeObject(ClientCodeStoreObjects.MAPPED_TO_CURRENCY_ACCOUNTS, accountByCurrency); + return Optional.empty(); + } + }, + DepoAccountsPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + TkrAccount validatedObject = context.getValidatedObject(); + String depoAccountVal = validatedObject.getDepoAccount(); + if (!StringUtils.hasText(depoAccountVal)) { + context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, Optional.empty()); + return empty(); + } + + Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + Account depoAccount = imdg.getFirstObjectByFieldValues( + Map.of("account", depoAccountVal) + ); + if (depoAccount == null) { + context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, Optional.empty()); + return of(AccountError.DepoAccountNotFound, "depo_account"); + } + + context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, depoAccount); + return Optional.empty(); + } + }, + TcrIsNotPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + Map accountByCurrency = context.getStoredObject(ClientCodeStoreObjects.MAPPED_TO_CURRENCY_ACCOUNTS); + Account moneyAccount = accountByCurrency.get(CurrencyCode.RUB.getKey()); + if (moneyAccount == null) { + return of(AccountError.AccountNotFound); + } + Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, + TradingClearingRegistry.class); + + TradingClearingRegistry tcr = imdg.getFirstObjectByFieldValues( + Map.of( + "moneyAccountId", moneyAccount.getId(), + "status", Status.Active.getKey() + ) + ); + if (tcr != null) { + return of(AccountError.TradingClearingRegistryAlreadyExist, tcr.getCode(), "code"); + } + return Optional.empty(); + } + }, + TcrListIsNotPresent() { + @Override + public Optional validate(ImdgValidationContext context) { + Map accountByCurrency = context.getStoredObject(ClientCodeStoreObjects.MAPPED_TO_CURRENCY_ACCOUNTS); + List currencyAccounts = accountByCurrency.entrySet().stream() + .filter(stringAccountEntry -> !stringAccountEntry.getKey().equals(CurrencyCode.RUB.getKey())) + .map(Map.Entry::getValue).toList(); + if (currencyAccounts.isEmpty()) { + return empty(); + } + List currencies = currencyAccounts.stream().map(Account::getCurrency).toList(); + Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, + TradingClearingRegistryList.class); + ImdgPredicateBuilder predicateBuilder = imdg.predicateBuilder(); + Collection tcrList = imdg.getCollectionObjectsByPredicate( + predicateBuilder.and( + predicateBuilder.in("currency", currencies.toArray(new String[0])), + predicateBuilder.equals("status", Status.Active.getKey()) + )); + if (!tcrList.isEmpty()) { + return of(AccountError.TradingClearingRegistryAlreadyExist, tcrList.iterator().next().getCurrency(), "currency"); + } + return Optional.empty(); + } + } +} diff --git a/clearing-parent/backend-api/pom.xml b/clearing-parent/backend-api/pom.xml index 50130db6b..5bec93eb4 100644 --- a/clearing-parent/backend-api/pom.xml +++ b/clearing-parent/backend-api/pom.xml @@ -11,7 +11,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 @@ -112,6 +112,11 @@ org.mockito mockito-core + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + test + @@ -185,7 +190,7 @@ - data @@ -196,13 +201,13 @@ src/main/resources/meta - data.xml + dictionaries.xml src/main/resources/meta/xsl/data.xsl - data.sql + dictionaries.sql diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java index f896bf8c2..8a9a88bba 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/register/RegistryController.java @@ -4,10 +4,13 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; +import ru.clearing.classes.statics.data.execution.ExecutionDeposit; import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController; import ru.spcex.clearing.backendapi.controller.request.cud.registry.*; @@ -18,7 +21,12 @@ 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.enumeration.RegistryDesignation; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import java.time.LocalDate; import java.util.Collection; import java.util.Map; import java.util.concurrent.ExecutionException; @@ -26,12 +34,17 @@ import java.util.concurrent.ExecutionException; @Controller @RequestMapping("/registries") public class RegistryController extends AbstractQueueController { + protected final Logger log = LoggerFactory.getLogger(getClass()); private final IStateLoader stateLoader; + private final ImdgPredicateBuilder predicateBuilder; @Autowired - public RegistryController(IOperator operator, IStateLoader stateLoader) { + public RegistryController(IOperator operator, IStateLoader stateLoader, ImdgProvider imdgProvider) { super(operator); this.stateLoader = stateLoader; + this.predicateBuilder = imdgProvider + .getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class) + .predicateBuilder(); } @ApiOperation(value = "get all registries.") @@ -39,9 +52,25 @@ public class RegistryController extends AbstractQueueController { @RequestMapping(method = RequestMethod.GET) @ResponseBody public CommonGetAllResponse getAll() { - Collection> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Registry, Registry.class); +// long t1 = System.currentTimeMillis(); + ImdgPredicate filter = predicateBuilder.or( + predicateBuilder.equals("registryDesignation", RegistryDesignation.A.getKey()), + predicateBuilder.equals("registryDesignation", RegistryDesignation.D.getKey()), + predicateBuilder.and( + predicateBuilder.or( + predicateBuilder.equals("registryDesignation", RegistryDesignation.O.getKey()), + predicateBuilder.equals("registryDesignation", RegistryDesignation.T.getKey()) + ), + predicateBuilder.greatEqual("settlementDate", LocalDate.now()) + ) + ); + Collection> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Registry, Registry.class, + filter); +// long t2 = System.currentTimeMillis(); +// log.info("Info select and format {} data {}", all.size(), t2 - t1); CommonGetAllResponse response = new CommonGetAllResponse(); response.fromEntity(all); +// log.info("Info select and format {} data {}", all.size(), System.currentTimeMillis() - t2); return response; } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java index 7e4816486..cce7a8c40 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/LauncherController.java @@ -104,7 +104,7 @@ public class LauncherController extends AbstractQueueController { if (taskEnum == null) { throw new NotFound404Exception("task dictionary element with code '" + launcherNew.getTask() + "'"); } - if (!IEnumKey.contains(taskEnum.getCode(), Task.startOfClearing, Task.dbfExport_OUTV, Task.getAllBalance)) { + if (!IEnumKey.contains(taskEnum.getCode(), Task.startOfClearing, Task.dbfExport_OUTV, Task.getAllBalance, Task.createRegistry_GBRR)) { log.warn(String.format("Task %s not support request with body", taskEnum.getCode())); } // else В мете эти модели с дополнительными параметрами (OUTV). Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/sdf/SdfsController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/sdf/SdfsController.java index e94098463..df8b94763 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/sdf/SdfsController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/sdf/SdfsController.java @@ -237,6 +237,19 @@ public class SdfsController extends AbstractQueueController { return response; } + @ApiOperation(value = "get all S_DF51") + @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)}) + @RequestMapping(value = "s-df51", method = RequestMethod.GET) + @ResponseBody + public CommonGetAllResponse getAllSdf51() { + Collection> all = stateLoader.getAllMetaTransform( + IMDGDistributedNames.Map_SDf51, + SDf51.class); + CommonGetAllResponse response = new CommonGetAllResponse(); + response.fromEntity(all); + return response; + } + @ApiOperation(value = "get all S_DF52") @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)}) @RequestMapping(value = "s-df52", method = RequestMethod.GET) diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/account/BankAccountNewAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/account/BankAccountNewAction.java index a8d013425..7f252b347 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/account/BankAccountNewAction.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/account/BankAccountNewAction.java @@ -50,6 +50,9 @@ public class BankAccountNewAction implements IAction { @ApiModelProperty(value = "SWIFT", example = "ABCDE") @JsonProperty private String swiftCode; + @ApiModelProperty(value = "Код SWIFT посредника", example = "ABCDE") + @JsonProperty + private String intermediarySwiftCode; @Override public BankAccountNewRequest toRequest() { @@ -65,6 +68,7 @@ public class BankAccountNewAction implements IAction { req.setAccount(this.account); req.setCompanyId(this.companyId); req.setSwiftCode(swiftCode); + req.setIntermediarySwiftCode(intermediarySwiftCode); return req; } @@ -161,4 +165,12 @@ public class BankAccountNewAction implements IAction { public void setSwiftCode(String swiftCode) { this.swiftCode = swiftCode; } + + public String getIntermediarySwiftCode() { + return intermediarySwiftCode; + } + + public void setIntermediarySwiftCode(String intermediarySwiftCode) { + this.intermediarySwiftCode = intermediarySwiftCode; + } } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/account/BankAccountUpdateAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/account/BankAccountUpdateAction.java index 9418aa266..bbdfff7be 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/account/BankAccountUpdateAction.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/account/BankAccountUpdateAction.java @@ -41,6 +41,9 @@ public class BankAccountUpdateAction implements IAction { @ApiModelProperty(value = "Участник получатель", example = "1000") @JsonProperty private Long addresseeId; + @ApiModelProperty(value = "Корреспондентский счет", example = "1000") + @JsonProperty + private Long correspondentAccountId; @ApiModelProperty(value = "Наименование счета получателя", example = "1000") @JsonProperty private Long debitLeg_accountId; @@ -78,6 +84,15 @@ public class LauncherNew implements IAction { @JsonProperty public LocalTime fromTime; + @ApiModelProperty(value = "Дата с", example = "2024-01-02") + @JsonDeserialize(using = LocalDateDeserializer.class) + @JsonProperty + public LocalDate fromDate; + @ApiModelProperty(value = "Дата по", example = "2024-03-02") + @JsonDeserialize(using = LocalDateDeserializer.class) + @JsonProperty + public LocalDate toDate; + @Override public Object toRequest() { LauncherCommandRequest taskRunnerCommandRequest = new LauncherCommandRequest(); @@ -99,6 +114,8 @@ public class LauncherNew implements IAction { taskRunnerCommandRequest.setDebitLeg_accountId(debitLeg_accountId); taskRunnerCommandRequest.setFromTime(fromTime); taskRunnerCommandRequest.setSwiftCode(swiftCode); + taskRunnerCommandRequest.setFromDate(fromDate); + taskRunnerCommandRequest.setToDate(toDate); return taskRunnerCommandRequest; } @@ -228,6 +245,14 @@ public class LauncherNew implements IAction { this.addresseeId = addresseeId; } + public Long getCorrespondentAccountId() { + return correspondentAccountId; + } + + public void setCorrespondentAccountId(Long correspondentAccountId) { + this.correspondentAccountId = correspondentAccountId; + } + public Long getDebitLeg_accountId() { return debitLeg_accountId; } @@ -259,4 +284,20 @@ public class LauncherNew implements IAction { public void setFromTime(LocalTime fromTime) { this.fromTime = fromTime; } + + public LocalDate getFromDate() { + return fromDate; + } + + public void setFromDate(LocalDate fromDate) { + this.fromDate = fromDate; + } + + public LocalDate getToDate() { + return toDate; + } + + public void setToDate(LocalDate toDate) { + this.toDate = toDate; + } } diff --git a/clearing-parent/backend-api/src/main/resources/meta/data.xml b/clearing-parent/backend-api/src/main/resources/meta/dictionaries.xml similarity index 92% rename from clearing-parent/backend-api/src/main/resources/meta/data.xml rename to clearing-parent/backend-api/src/main/resources/meta/dictionaries.xml index 2ebffe166..d3148ff2e 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/data.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/dictionaries.xml @@ -1,5 +1,5 @@ - + @@ -9,6 +9,7 @@
+
@@ -61,7 +62,7 @@ - + @@ -75,7 +76,7 @@ - + @@ -96,9 +97,19 @@ + + + + + - + + + + + + @@ -120,7 +131,7 @@ - + @@ -165,36 +176,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -296,6 +277,7 @@ + @@ -453,6 +435,11 @@ + + + + + diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.json b/clearing-parent/backend-api/src/main/resources/meta/meta.json index 34aff80d4..19a53abc9 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.json +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.json @@ -1,6 +1,6 @@ { - "version": "3.11.0.88", + "version": "3.12.4.97", "enums": { @@ -3977,7 +3977,7 @@ "logUpdates": "true", - "table": "client_сode", + "table": "client_code", "fields": [ {"code": "id", @@ -4231,7 +4231,7 @@ } , {"code": "depoAccountId", - "type": 1,"name": "Номер депозитарного счета","shortname": "Депозитарный счет","link": "account","linkCode": "account","enabled": false + "type": 1,"name": "Номер депозитарного счета","shortname": "Депозитарный счет","link": "account","linkCode": "account" } , {"code": "status", @@ -4539,6 +4539,10 @@ {"code": "securityId", "type": 1,"dbname": "Идентификатор инструмента","name": "Код инструмента","shortname": "Код инструмента","searchable": false,"sortable": true,"visible": false,"link": "security","linkCode": "shortName" } + , + {"code": "section", + "type": 12,"dbname": "Код секции","name": "Наименование секции","shortname": "Секция","searchable": true,"sortable": true,"visible": true,"link": "section" + } ] ,"actions":[ {"method":"post", @@ -4603,7 +4607,7 @@ "destination": "registries/identificationFunds", - "confirmation": "balance,tradingClearingRegistryId", + "confirmation": "securitySymbol,balance,tradingClearingRegistryId", "class": "ru.spcex.clearing.backendapi.controller.request.cud.registry.IdentificationFundsActionNew", @@ -4623,6 +4627,10 @@ {"code": "tradingClearingRegistryId", "type": 1,"name": "Торгово-клиринговый регистр","shortname": "Торгово-клиринговый регистр","link": "tradingClearingRegistry","linkCode": "code","required": true } + , + {"code": "securitySymbol", + "type": 2,"length": 255,"dbname": "Код инструмента","name": "Наименование инструмента/валюты","shortname": "Инструмент/валюта","searchable": false,"sortable": false,"visible": false + } ] } , @@ -4894,7 +4902,7 @@ , "bankAccount": { - "name": "Счета вывода средств из ПРЦ", + "name": "Счета вывода средств", "destination": "accounting/bank-accounts", @@ -4914,7 +4922,7 @@ } , {"code": "bankName", - "type": 2,"length": 255,"name": "Наименование банка","shortname": "Наименование","searchable": true,"sortable": true,"visible": true + "type": 2,"length": 255,"name": "Наименование компании в банке","shortname": "Наименование компании","searchable": true,"sortable": true,"visible": true } , {"code": "correspondentAccount", @@ -4968,11 +4976,15 @@ {"code": "id", "type": 1,"name": "Идентификатор записи","shortname": "ID","searchable": true,"sortable": true } + , + {"code": "intermediarySwiftCode", + "type": 2,"length": 255,"name": "Код SWIFT посредника","shortname": "SWIFT посредника","searchable": true,"sortable": true,"visible": true + } ] ,"actions":[ {"method":"post", - "name": "Добавление счета вывода средств из ПРЦ", + "name": "Добавление счета вывода средств", "confirmation": "currency,bankIdentificationCode,bankName,correspondentAccount,correspondentAccountName,taxpayerIdentificationNumber,taxRegistrationReasonCode,account", @@ -4988,7 +5000,7 @@ } , {"code": "bankName", - "type": 2,"length": 255,"name": "Наименование банка","shortname": "Наименование","required": true + "type": 2,"length": 255,"name": "Наименование компании в банке","shortname": "Наименование компании","required": true } , {"code": "correspondentAccount", @@ -4998,6 +5010,10 @@ {"code": "correspondentAccountName", "type": 2,"length": 255,"name": "Наименование корреспондентского счета","shortname": "Наименование корр. счета" } + , + {"code": "swiftCode", + "type": 2,"length": 255,"shortname": "SWIFT" + } , {"code": "taxpayerIdentificationNumber", "type": 2,"length": 255,"name": "Идентификационный номер налогоплательщика (ИНН)","shortname": "ИНН" @@ -5010,24 +5026,24 @@ {"code": "account", "type": 2,"length": 50,"name": "Номер счета","shortname": "Счет","required": true } - , - {"code": "destination", - "type": 2,"length": 255,"name": "Назначение платежа","shortname": "Назначение платежа","visible": false - } , {"code": "companyId", "type": 1,"name": "Компания","shortname": "Компания","link": "company","linkCode": "shortName","visible": false } , - {"code": "swiftCode", - "type": 2,"length": 255,"shortname": "SWIFT" + {"code": "destination", + "type": 2,"length": 255,"name": "Назначение платежа","shortname": "Назначение платежа","visible": true + } + , + {"code": "intermediarySwiftCode", + "type": 2,"length": 255,"name": "Код SWIFT посредника","shortname": "SWIFT посредника","searchable": true,"sortable": true,"visible": true } ] } , {"method":"put", - "name": "Изменение счета вывода средств из ПРЦ", + "name": "Изменение счета вывода средств", "confirmation": "currency,bankIdentificationCode,bankName,correspondentAccount,correspondentAccountName,taxpayerIdentificationNumber,taxRegistrationReasonCode,account", @@ -5047,7 +5063,7 @@ } , {"code": "bankName", - "type": 2,"length": 255,"name": "Наименование банка","shortname": "Наименование" + "type": 2,"length": 255,"name": "Наименование компании в банке","shortname": "Наименование компании" } , {"code": "correspondentAccount", @@ -5057,6 +5073,10 @@ {"code": "correspondentAccountName", "type": 2,"length": 255,"name": "Наименование корреспондентского счета","shortname": "Наименование корр. счета" } + , + {"code": "swiftCode", + "type": 2,"length": 255,"shortname": "SWIFT" + } , {"code": "taxpayerIdentificationNumber", "type": 2,"length": 255,"name": "Идентификационный номер налогоплательщика (ИНН)","shortname": "ИНН" @@ -5071,18 +5091,18 @@ } , {"code": "destination", - "type": 2,"length": 255,"name": "Назначение платежа","shortname": "Назначение платежа","visible": false + "type": 2,"length": 255,"name": "Назначение платежа","shortname": "Назначение платежа","visible": true } , - {"code": "swiftCode", - "type": 2,"length": 255,"shortname": "SWIFT" + {"code": "intermediarySwiftCode", + "type": 2,"length": 255,"name": "Код SWIFT посредника","shortname": "SWIFT посредника","searchable": true,"sortable": true,"visible": true } ] } , {"method":"delete", - "name": "Блокировка счета вывода средств из ПРЦ", + "name": "Блокировка счета вывода средств", "confirmation": "currency,bankIdentificationCode,correspondentAccount,taxpayerIdentificationNumber,taxRegistrationReasonCode,account", @@ -5863,15 +5883,19 @@ } , {"code": "creditLeg_accountId", - "type": 1,"group": "Отправитель","name": "Наименование счета отправителя","shortname": "Регистр списания","link": "account","linkCode": "account" + "type": 1,"group": "Отправитель","name": "Наименование счета отправителя","shortname": "Регистр списания","link": "account","linkCode": "account","required": true } , {"code": "addresseeId", "type": 1,"group": "Получатель","name": "Участник получатель","shortname": "Получатель","link": "company","linkCode": "shortName","required": true,"enabled": false } + , + {"code": "correspondentAccountId", + "type": 1,"group": "Получатель","name": "Корреспондентский счет","shortname": "Корр. счет","link": "bankAccount","linkCode": "correspondentAccountName","linkKeyCode": "id","required": true,"enabled": true + } , {"code": "debitLeg_accountId", - "type": 1,"group": "Получатель","name": "Наименование счета получателя","shortname": "Счет получателя","link": "bankAccount","linkCode": "correspondentAccount" + "type": 1,"group": "Получатель","name": "Наименование счета получателя","shortname": "Счет получателя","link": "bankAccount","linkCode": "account" } , {"code": "swiftCode", @@ -5964,111 +5988,27 @@ "fields": [] } , - {"method":"post", - - "destination": "GRRT", - - "group": "Формирование реестров", - - "name": "Формирование реестра остатков ценных бумаг", - - "fields": [] - } - , {"method":"post", "destination": "GBRR", "group": "Формирование реестров", - "name": "Формирование реестра остатков денежных средств", - - "fields": [] - } - , - {"method":"post", - - "destination": "ADLR", - - "group": "Формирование реестров", - - "name": "Формирование реестра обязательств, допущенных к клирингу", - - "fields": [] - } - , - {"method":"post", - - "destination": "CDLR", - - "group": "Формирование реестров", - - "name": "Формирование реестра обязательств, прошедших процедуру контроля обеспечения", - - "fields": [] - } - , - {"method":"post", - - "destination": "GORR", - - "group": "Формирование реестров", - - "name": "Формирование реестра распоряжений, направленных расчетной организации", - - "fields": [] - } - , - {"method":"post", - - "destination": "GORD", - - "group": "Формирование реестров", - - "name": "Формирование реестра распоряжений, направленных расчетному депозитарию", - - "fields": [] - } - , - {"method":"post", - - "destination": "EXLR", - - "group": "Формирование реестров", - - "name": "Формирование реестра обязательств, исключенных из клирингового пула", - - "fields": [] - } - , - {"method":"post", - - "destination": "LBSR", - - "group": "Формирование реестров", - - "name": "Формирование реестра учета обязательств", + "name": "Формирование реестров за период", "fields": [ - {"code": "settlementDate", - "type": 6,"name": "Дата","shortname": "Дата" + {"code": "fromDate", + "type": 6,"name": "С дата","shortname": "с" + } + , + {"code": "toDate", + "type": 6,"name": "По дату","shortname": "по" } ] } , {"method":"post", - "destination": "ECNR", - - "group": "Формирование реестров", - - "name": "Формирование реестра сделок", - - "fields": [] - } - , - {"method":"post", - "destination": "GRET", "group": "Формирование отчетности", @@ -6126,20 +6066,9 @@ "destination": "MTCR", - "group": "Формирование отчетности", + "group": "Обмен с интеграционными модулями", - "name": "Формирование файлов с МТКР", - - "fields": [] - } - , - {"method":"post", - - "destination": "LIMC", - - "group": "Обмен с Торговой системой", - - "name": "Выгрузка в Торговую систему остатков по валют (отправка lim)", + "name": "Выгрузка ТКР", "fields": [] } @@ -6536,7 +6465,7 @@ } , {"code": "coverageStatus", - "type": 12,"dbname": "Код статуса достаточности обеспечения","name": "Cтатус достаточности обеспечения","shortname": "Обеспеченность","searchable": true,"sortable": true,"link": "allowed" + "type": 12,"dbname": "Код статуса достаточности обеспечения","name": "Статус достаточности обеспечения","shortname": "Обеспеченность","searchable": true,"sortable": true,"link": "allowed" } , {"code": "sessionId", @@ -6702,7 +6631,7 @@ } , {"code": "coverageStatus", - "type": 12,"dbname": "Код статуса достаточности обеспечения","name": "Cтатус достаточности обеспечения","shortname": "Обеспеченность","searchable": true,"sortable": true,"link": "allowed" + "type": 12,"dbname": "Код статуса достаточности обеспечения","name": "Статус достаточности обеспечения","shortname": "Обеспеченность","searchable": true,"sortable": true,"link": "allowed" } , {"code": "sessionId", @@ -6822,7 +6751,7 @@ } , {"code": "coverageStatus", - "type": 12,"dbname": "Код статуса достаточности обеспечения","name": "Cтатус достаточности обеспечения","shortname": "Обеспеченность","searchable": true,"sortable": true,"link": "allowed" + "type": 12,"dbname": "Код статуса достаточности обеспечения","name": "Статус достаточности обеспечения","shortname": "Обеспеченность","searchable": true,"sortable": true,"link": "allowed" } , {"code": "sessionId", @@ -7250,11 +7179,11 @@ } , {"code": "validFromDate", - "type": 6,"name": "Дата начала cессии","shortname": "Дата начала cессии","searchable": true,"sortable": true + "type": 6,"name": "Дата начала сессии","shortname": "Дата начала сессии","searchable": true,"sortable": true } , {"code": "validToDate", - "type": 6,"name": "Дата окончания cессии","shortname": "Дата окончания cессии","searchable": true,"sortable": true + "type": 6,"name": "Дата окончания сессии","shortname": "Дата окончания сессии","searchable": true,"sortable": true } , {"code": "companyId", @@ -7418,11 +7347,11 @@ } , {"code": "validFromDate", - "type": 6,"name": "Дата начала cессии","shortname": "Дата начала cессии","searchable": true,"sortable": true + "type": 6,"name": "Дата начала сессии","shortname": "Дата начала сессии","searchable": true,"sortable": true } , {"code": "validToDate", - "type": 6,"name": "Дата окончания cессии","shortname": "Дата окончания cессии","searchable": true,"sortable": true + "type": 6,"name": "Дата окончания сессии","shortname": "Дата окончания сессии","searchable": true,"sortable": true } , {"code": "companyId", @@ -7718,7 +7647,7 @@ } , {"code": "creditLeg_accountId", - "type": 1,"dbname": "Идентификатор счета отправителя","name": "Cчет отправителя","shortname": "Счет отправителя","searchable": true,"sortable": true,"link": "account","ignore": true + "type": 1,"dbname": "Идентификатор счета отправителя","name": "Счет отправителя","shortname": "Счет отправителя","searchable": true,"sortable": true,"link": "account","ignore": true } , {"code": "credit_csAccount", @@ -8475,12 +8404,12 @@ "type": 1,"name": "Идентификатор взаимодействия","shortname": "ID взаимодействия","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Num", - "field": "Doc_Num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_num", + "field": "doc_num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Date", - "field": "Doc_Date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_date", + "field": "doc_date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true } , {"code": "pay_val", @@ -8565,12 +8494,12 @@ "type": 1,"name": "Идентификатор соответствующей записи из таблицы-источника","shortname": "Входящая запись","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Num", - "field": "Doc_Num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_num", + "field": "doc_num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Date", - "field": "Doc_Date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_date", + "field": "doc_date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true } , {"code": "pay_val", @@ -9252,6 +9181,10 @@ {"code": "inSDfId", "type": 1,"name": "Идентификатор соответствующей записи из таблицы-источника","shortname": "Входящая запись","searchable": true,"sortable": true,"visible": true } + , + {"code": "accType", + "type": 3,"name": "Признак счета","shortname": "Признак счета","searchable": true,"sortable": true,"visible": true + } ] } @@ -9439,24 +9372,24 @@ "type": 1,"name": "Идентификатор взаимодействия","shortname": "ID взаимодействия","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Num", - "field": "Doc_Num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_num", + "field": "doc_num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Date", - "field": "Doc_Date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_date", + "field": "doc_date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true } , - {"code": "Value_date", - "field": "Value_date","type": 2,"length": 8,"name": "Дата валютирования","shortname": "Дата валютирования","searchable": true,"sortable": true,"visible": true + {"code": "value_date", + "field": "value_date","type": 2,"length": 8,"name": "Дата валютирования","shortname": "Дата валютирования","searchable": true,"sortable": true,"visible": true } , - {"code": "Swift_ben", - "field": "Swift_ben","type": 2,"length": 11,"name": "Свифт банка бенефициара","shortname": "Свифт банка бенефициара","searchable": true,"sortable": true,"visible": true + {"code": "swift_ben", + "field": "swift_ben","type": 2,"length": 11,"name": "Свифт банка бенефициара","shortname": "Свифт банка бенефициара","searchable": true,"sortable": true,"visible": true } , - {"code": "Swift_int", - "field": "Swift_int","type": 2,"length": 11,"name": "Свифт банка посредника","shortname": "Свифт банка посредника","searchable": true,"sortable": true,"visible": true + {"code": "swift_int", + "field": "swift_int","type": 2,"length": 11,"name": "Свифт банка посредника","shortname": "Свифт банка посредника","searchable": true,"sortable": true,"visible": true } ] @@ -9649,24 +9582,24 @@ "type": 1,"name": "Идентификатор взаимодействия","shortname": "ID взаимодействия","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Num", - "field": "Doc_Num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_num", + "field": "doc_num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Date", - "field": "Doc_Date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_date", + "field": "doc_date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true } , - {"code": "Value_date", - "field": "Value_date","type": 2,"length": 8,"name": "Дата валютирования","shortname": "Дата валютирования","searchable": true,"sortable": true,"visible": true + {"code": "value_date", + "field": "value_date","type": 2,"length": 8,"name": "Дата валютирования","shortname": "Дата валютирования","searchable": true,"sortable": true,"visible": true } , - {"code": "Swift_ben", - "field": "Swift_ben","type": 2,"length": 11,"name": "Свифт банка бенефициара","shortname": "Свифт банка бенефициара","searchable": true,"sortable": true,"visible": true + {"code": "swift_ben", + "field": "swift_ben","type": 2,"length": 11,"name": "Свифт банка бенефициара","shortname": "Свифт банка бенефициара","searchable": true,"sortable": true,"visible": true } , - {"code": "Swift_int", - "field": "Swift_int","type": 2,"length": 11,"name": "Свифт банка посредника","shortname": "Свифт банка посредника","searchable": true,"sortable": true,"visible": true + {"code": "swift_int", + "field": "swift_int","type": 2,"length": 11,"name": "Свифт банка посредника","shortname": "Свифт банка посредника","searchable": true,"sortable": true,"visible": true } ] @@ -9893,12 +9826,12 @@ "type": 1,"name": "Идентификатор взаимодействия","shortname": "ID взаимодействия","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Num", - "field": "Doc_Num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_num", + "field": "doc_num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Date", - "field": "Doc_Date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_date", + "field": "doc_date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true } , {"code": "dt_in", diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.xml b/clearing-parent/backend-api/src/main/resources/meta/meta.xml index fb2a3a9fd..08a63081e 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.xml @@ -1,6 +1,6 @@ - + @@ -920,7 +920,7 @@ - + @@ -980,7 +980,7 @@ - + @@ -1055,6 +1055,7 @@ +
@@ -1068,11 +1069,12 @@ - + + @@ -1137,10 +1139,10 @@ - + - + @@ -1154,34 +1156,37 @@ + - + - + + - - + + - + - + + - - + + - + @@ -1361,9 +1366,10 @@ - + - + + @@ -1382,24 +1388,9 @@ - - - - - - - - - - - - - - - - - - + + + @@ -1411,10 +1402,10 @@ - - - + + + @@ -1508,7 +1499,7 @@ - + @@ -1547,7 +1538,7 @@ - + @@ -1575,7 +1566,7 @@ - + @@ -1668,8 +1659,8 @@ - - + + @@ -1705,8 +1696,8 @@ - - + + @@ -1775,7 +1766,7 @@ - + @@ -1955,8 +1946,8 @@ - - + + @@ -1976,8 +1967,8 @@ - - + + @@ -2130,6 +2121,7 @@ + @@ -2175,11 +2167,11 @@ - - - - - + + + + + @@ -2226,11 +2218,11 @@ - - - - - + + + + + @@ -2284,8 +2276,8 @@ - - + + diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.xsd b/clearing-parent/backend-api/src/main/resources/meta/meta.xsd index b8d175f40..8af543b18 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.xsd +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.xsd @@ -3623,7 +3623,7 @@ Проверить, что клиринговая сессия активна: session.sessionStatus=ACTV (см. справочник sessionStatus). Иначе вернуть ошибку (5210) "Клиринговая сессия неактивна" (пока актуально только для модуля balance-service). -* - подставляется цифра соответствующего модуля согласно кодам ошибок из data.xml +* - подставляется цифра соответствующего модуля согласно кодам ошибок из dictionaries.xml diff --git a/clearing-parent/backend-api/src/main/resources/meta/xsl/core.xsl b/clearing-parent/backend-api/src/main/resources/meta/xsl/core.xsl index b33dedd4e..13208924b 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/xsl/core.xsl +++ b/clearing-parent/backend-api/src/main/resources/meta/xsl/core.xsl @@ -2,7 +2,7 @@ - + diff --git a/clearing-parent/backend-api/src/main/resources/meta/xsl/db.xsl b/clearing-parent/backend-api/src/main/resources/meta/xsl/db.xsl index 1d610d880..01931574f 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/xsl/db.xsl +++ b/clearing-parent/backend-api/src/main/resources/meta/xsl/db.xsl @@ -2,7 +2,7 @@ - + abcdefghijklmnopqrstuvwxyz diff --git a/clearing-parent/backend-api/src/main/resources/meta/xsl/report.xsl b/clearing-parent/backend-api/src/main/resources/meta/xsl/report.xsl index 6916dbe7e..d49e845ff 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/xsl/report.xsl +++ b/clearing-parent/backend-api/src/main/resources/meta/xsl/report.xsl @@ -2,7 +2,7 @@ - + diff --git a/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/meta/DataXmlTest.java b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/meta/DataXmlTest.java new file mode 100644 index 000000000..bb299c3de --- /dev/null +++ b/clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/meta/DataXmlTest.java @@ -0,0 +1,175 @@ +package ru.spcex.clearing.backendapi.meta; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.util.*; + +/** + * Проверяет словари на опечатки: пустые значения, сочетание кириллицы и латиницы в одном слове. + * dictionaries.xml + * data_initial.xml + * data_register_code.xml + */ +public class DataXmlTest { + private Logger log = LoggerFactory.getLogger(getClass()); + + @Test + public void testMetaXml() throws IOException { + verifyXML(new File("src/main/resources/meta/meta.xml")); + } + + /** + * Проверка XML (data.xml aka dictionaries.xml) + * + * @throws IOException + */ + @Test + public void testDictionariesXml() throws IOException { + verifyXML(new File("src/main/resources/meta/dictionaries.xml")); + } + + @Test + public void testDataInitialXml() throws IOException { + verifyXML(new File("src/main/resources/meta/data_initial.xml")); + } + + @Test + public void testDataRegisterCodeXml() throws IOException { + verifyXML(new File("src/main/resources/meta/data_register_code.xml")); + } + + protected void verifyXML(File xmlFile) throws IOException { + XmlMapper xmlObjectMapper = new XmlMapper(); + xmlObjectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); + xmlObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + // Это юнит-тест с внутренними данными, парсинг DTD выключать не обязательно. + Map root = xmlObjectMapper.readValue(xmlFile, Map.class); + Assertions.assertNotNull(root, "Empty XML in file " + xmlFile); + + String errors = verifyNode(xmlFile.getName(), root); + Assertions.assertNull(errors, errors); + } + + private String verifyNode(String path, Map node) { + for (Map.Entry item : node.entrySet()) { + String name = item.getKey(); + if (!verifyText(name)) { + return path + "> node name \"" + name + "\" has error"; + } + String thisPath = path + "/" + name; + if (item.getValue() instanceof Map itemValue) { + String error = verifyNode(thisPath, itemValue); + if (error != null) + return error; + } else if (item.getValue() instanceof String text) { + if (!verifyText(text)) { + return thisPath + "> has error in content: \"" + text + "\""; + } + } else if (item.getValue() instanceof List values) { + for (Object o : values) { + if (o instanceof Map itemMap) { + String error = verifyNode(thisPath, itemMap); + if (error != null) + return error; + } else if (o instanceof String oVal) { + if (!verifyText(oVal)) { + return thisPath + "> one of values in node \"" + oVal + "\" has error"; + } + } else if (o == null) { + // nothing + } else { + throw new IllegalArgumentException(thisPath + "> Unsupported one of value type " + o.getClass().getSimpleName() + " for verification"); + } + } + } else if (item.getValue() == null) { + // nothing + } else { + throw new IllegalArgumentException(thisPath + "> Unsupported value type " + item.getValue().getClass().getSimpleName() + " for verification"); + } + } + return null; + } + + final char[] CYRILLICS; + final char[] LATINS; + + { + CYRILLICS = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя".toCharArray(); + LATINS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray(); + Arrays.sort(CYRILLICS); + Arrays.sort(LATINS); + } + + /** + * Проверяет смесь кириллицы и латиницы в одном слове + * + * @param text + * @return + */ + boolean verifyText(String text) { + boolean word = false, cyrillic = false, latin = false; + if (text != null) { + for (int i = 0; i < text.length(); i++) { + char c = text.charAt(i); + boolean isWhitespace = Character.isWhitespace(c); + boolean isCyrillic = Arrays.binarySearch(CYRILLICS, c) >= 0; + boolean isLatin = Arrays.binarySearch(LATINS, c) >= 0; + assert !(isCyrillic && isLatin); + assert !(isWhitespace && (isCyrillic || isLatin)); + if (word && isWhitespace) { + word = false; // слово закончилось + if (cyrillic && latin) + return false; // Смесь кириллицы и латиницы + } else if (!word && !isWhitespace) { + word = true; // новое слово + cyrillic = latin = false; + } + cyrillic |= isCyrillic; + latin |= isLatin; + } + if (cyrillic && latin) + return false; // Смесь кириллицы и латиницы + } + return true; + } + + @Test + public void selfTest() { + verifyText(null); + Assertions.assertTrue(verifyText("")); + Assertions.assertTrue(verifyText("A")); + Assertions.assertTrue(verifyText(" A ")); + Assertions.assertTrue(verifyText("A call of")); + Assertions.assertTrue(verifyText("The spring of spin winter.")); + Assertions.assertTrue(verifyText("Пользователь user текст обычный.")); + Assertions.assertTrue(verifyText("АККаунт mixED 102E333C")); + Assertions.assertTrue(verifyText("АКК_аунт mi_xED 10-+*/2E333C")); + Assertions.assertTrue(verifyText("XML")); + Assertions.assertTrue(verifyText("Same sample apple")); + Assertions.assertTrue(verifyText("По tExT кРАям")); + + Assertions.assertFalse(verifyText("Пользоватьель userтекст обычный.")); + Assertions.assertFalse(verifyText("ХML")); + Assertions.assertFalse(verifyText("XМL")); + Assertions.assertFalse(verifyText("XMЛ")); + Assertions.assertFalse(verifyText(" ХML")); + Assertions.assertFalse(verifyText(" XМL")); + Assertions.assertFalse(verifyText(" XMЛ")); + Assertions.assertFalse(verifyText("ХML ")); + Assertions.assertFalse(verifyText("XМL ")); + Assertions.assertFalse(verifyText("XMЛ ")); + Assertions.assertFalse(verifyText("12XM_Л34")); + Assertions.assertFalse(verifyText("Same sample аррlе")); + Assertions.assertFalse(verifyText("Same samplе apple")); + Assertions.assertFalse(verifyText("Same sample аpple")); + Assertions.assertFalse(verifyText("client_сode")); + } +} diff --git a/clearing-parent/backend-api/src/test/resources/meta.json b/clearing-parent/backend-api/src/test/resources/meta.json index 34aff80d4..19a53abc9 100644 --- a/clearing-parent/backend-api/src/test/resources/meta.json +++ b/clearing-parent/backend-api/src/test/resources/meta.json @@ -1,6 +1,6 @@ { - "version": "3.11.0.88", + "version": "3.12.4.97", "enums": { @@ -3977,7 +3977,7 @@ "logUpdates": "true", - "table": "client_сode", + "table": "client_code", "fields": [ {"code": "id", @@ -4231,7 +4231,7 @@ } , {"code": "depoAccountId", - "type": 1,"name": "Номер депозитарного счета","shortname": "Депозитарный счет","link": "account","linkCode": "account","enabled": false + "type": 1,"name": "Номер депозитарного счета","shortname": "Депозитарный счет","link": "account","linkCode": "account" } , {"code": "status", @@ -4539,6 +4539,10 @@ {"code": "securityId", "type": 1,"dbname": "Идентификатор инструмента","name": "Код инструмента","shortname": "Код инструмента","searchable": false,"sortable": true,"visible": false,"link": "security","linkCode": "shortName" } + , + {"code": "section", + "type": 12,"dbname": "Код секции","name": "Наименование секции","shortname": "Секция","searchable": true,"sortable": true,"visible": true,"link": "section" + } ] ,"actions":[ {"method":"post", @@ -4603,7 +4607,7 @@ "destination": "registries/identificationFunds", - "confirmation": "balance,tradingClearingRegistryId", + "confirmation": "securitySymbol,balance,tradingClearingRegistryId", "class": "ru.spcex.clearing.backendapi.controller.request.cud.registry.IdentificationFundsActionNew", @@ -4623,6 +4627,10 @@ {"code": "tradingClearingRegistryId", "type": 1,"name": "Торгово-клиринговый регистр","shortname": "Торгово-клиринговый регистр","link": "tradingClearingRegistry","linkCode": "code","required": true } + , + {"code": "securitySymbol", + "type": 2,"length": 255,"dbname": "Код инструмента","name": "Наименование инструмента/валюты","shortname": "Инструмент/валюта","searchable": false,"sortable": false,"visible": false + } ] } , @@ -4894,7 +4902,7 @@ , "bankAccount": { - "name": "Счета вывода средств из ПРЦ", + "name": "Счета вывода средств", "destination": "accounting/bank-accounts", @@ -4914,7 +4922,7 @@ } , {"code": "bankName", - "type": 2,"length": 255,"name": "Наименование банка","shortname": "Наименование","searchable": true,"sortable": true,"visible": true + "type": 2,"length": 255,"name": "Наименование компании в банке","shortname": "Наименование компании","searchable": true,"sortable": true,"visible": true } , {"code": "correspondentAccount", @@ -4968,11 +4976,15 @@ {"code": "id", "type": 1,"name": "Идентификатор записи","shortname": "ID","searchable": true,"sortable": true } + , + {"code": "intermediarySwiftCode", + "type": 2,"length": 255,"name": "Код SWIFT посредника","shortname": "SWIFT посредника","searchable": true,"sortable": true,"visible": true + } ] ,"actions":[ {"method":"post", - "name": "Добавление счета вывода средств из ПРЦ", + "name": "Добавление счета вывода средств", "confirmation": "currency,bankIdentificationCode,bankName,correspondentAccount,correspondentAccountName,taxpayerIdentificationNumber,taxRegistrationReasonCode,account", @@ -4988,7 +5000,7 @@ } , {"code": "bankName", - "type": 2,"length": 255,"name": "Наименование банка","shortname": "Наименование","required": true + "type": 2,"length": 255,"name": "Наименование компании в банке","shortname": "Наименование компании","required": true } , {"code": "correspondentAccount", @@ -4998,6 +5010,10 @@ {"code": "correspondentAccountName", "type": 2,"length": 255,"name": "Наименование корреспондентского счета","shortname": "Наименование корр. счета" } + , + {"code": "swiftCode", + "type": 2,"length": 255,"shortname": "SWIFT" + } , {"code": "taxpayerIdentificationNumber", "type": 2,"length": 255,"name": "Идентификационный номер налогоплательщика (ИНН)","shortname": "ИНН" @@ -5010,24 +5026,24 @@ {"code": "account", "type": 2,"length": 50,"name": "Номер счета","shortname": "Счет","required": true } - , - {"code": "destination", - "type": 2,"length": 255,"name": "Назначение платежа","shortname": "Назначение платежа","visible": false - } , {"code": "companyId", "type": 1,"name": "Компания","shortname": "Компания","link": "company","linkCode": "shortName","visible": false } , - {"code": "swiftCode", - "type": 2,"length": 255,"shortname": "SWIFT" + {"code": "destination", + "type": 2,"length": 255,"name": "Назначение платежа","shortname": "Назначение платежа","visible": true + } + , + {"code": "intermediarySwiftCode", + "type": 2,"length": 255,"name": "Код SWIFT посредника","shortname": "SWIFT посредника","searchable": true,"sortable": true,"visible": true } ] } , {"method":"put", - "name": "Изменение счета вывода средств из ПРЦ", + "name": "Изменение счета вывода средств", "confirmation": "currency,bankIdentificationCode,bankName,correspondentAccount,correspondentAccountName,taxpayerIdentificationNumber,taxRegistrationReasonCode,account", @@ -5047,7 +5063,7 @@ } , {"code": "bankName", - "type": 2,"length": 255,"name": "Наименование банка","shortname": "Наименование" + "type": 2,"length": 255,"name": "Наименование компании в банке","shortname": "Наименование компании" } , {"code": "correspondentAccount", @@ -5057,6 +5073,10 @@ {"code": "correspondentAccountName", "type": 2,"length": 255,"name": "Наименование корреспондентского счета","shortname": "Наименование корр. счета" } + , + {"code": "swiftCode", + "type": 2,"length": 255,"shortname": "SWIFT" + } , {"code": "taxpayerIdentificationNumber", "type": 2,"length": 255,"name": "Идентификационный номер налогоплательщика (ИНН)","shortname": "ИНН" @@ -5071,18 +5091,18 @@ } , {"code": "destination", - "type": 2,"length": 255,"name": "Назначение платежа","shortname": "Назначение платежа","visible": false + "type": 2,"length": 255,"name": "Назначение платежа","shortname": "Назначение платежа","visible": true } , - {"code": "swiftCode", - "type": 2,"length": 255,"shortname": "SWIFT" + {"code": "intermediarySwiftCode", + "type": 2,"length": 255,"name": "Код SWIFT посредника","shortname": "SWIFT посредника","searchable": true,"sortable": true,"visible": true } ] } , {"method":"delete", - "name": "Блокировка счета вывода средств из ПРЦ", + "name": "Блокировка счета вывода средств", "confirmation": "currency,bankIdentificationCode,correspondentAccount,taxpayerIdentificationNumber,taxRegistrationReasonCode,account", @@ -5863,15 +5883,19 @@ } , {"code": "creditLeg_accountId", - "type": 1,"group": "Отправитель","name": "Наименование счета отправителя","shortname": "Регистр списания","link": "account","linkCode": "account" + "type": 1,"group": "Отправитель","name": "Наименование счета отправителя","shortname": "Регистр списания","link": "account","linkCode": "account","required": true } , {"code": "addresseeId", "type": 1,"group": "Получатель","name": "Участник получатель","shortname": "Получатель","link": "company","linkCode": "shortName","required": true,"enabled": false } + , + {"code": "correspondentAccountId", + "type": 1,"group": "Получатель","name": "Корреспондентский счет","shortname": "Корр. счет","link": "bankAccount","linkCode": "correspondentAccountName","linkKeyCode": "id","required": true,"enabled": true + } , {"code": "debitLeg_accountId", - "type": 1,"group": "Получатель","name": "Наименование счета получателя","shortname": "Счет получателя","link": "bankAccount","linkCode": "correspondentAccount" + "type": 1,"group": "Получатель","name": "Наименование счета получателя","shortname": "Счет получателя","link": "bankAccount","linkCode": "account" } , {"code": "swiftCode", @@ -5964,111 +5988,27 @@ "fields": [] } , - {"method":"post", - - "destination": "GRRT", - - "group": "Формирование реестров", - - "name": "Формирование реестра остатков ценных бумаг", - - "fields": [] - } - , {"method":"post", "destination": "GBRR", "group": "Формирование реестров", - "name": "Формирование реестра остатков денежных средств", - - "fields": [] - } - , - {"method":"post", - - "destination": "ADLR", - - "group": "Формирование реестров", - - "name": "Формирование реестра обязательств, допущенных к клирингу", - - "fields": [] - } - , - {"method":"post", - - "destination": "CDLR", - - "group": "Формирование реестров", - - "name": "Формирование реестра обязательств, прошедших процедуру контроля обеспечения", - - "fields": [] - } - , - {"method":"post", - - "destination": "GORR", - - "group": "Формирование реестров", - - "name": "Формирование реестра распоряжений, направленных расчетной организации", - - "fields": [] - } - , - {"method":"post", - - "destination": "GORD", - - "group": "Формирование реестров", - - "name": "Формирование реестра распоряжений, направленных расчетному депозитарию", - - "fields": [] - } - , - {"method":"post", - - "destination": "EXLR", - - "group": "Формирование реестров", - - "name": "Формирование реестра обязательств, исключенных из клирингового пула", - - "fields": [] - } - , - {"method":"post", - - "destination": "LBSR", - - "group": "Формирование реестров", - - "name": "Формирование реестра учета обязательств", + "name": "Формирование реестров за период", "fields": [ - {"code": "settlementDate", - "type": 6,"name": "Дата","shortname": "Дата" + {"code": "fromDate", + "type": 6,"name": "С дата","shortname": "с" + } + , + {"code": "toDate", + "type": 6,"name": "По дату","shortname": "по" } ] } , {"method":"post", - "destination": "ECNR", - - "group": "Формирование реестров", - - "name": "Формирование реестра сделок", - - "fields": [] - } - , - {"method":"post", - "destination": "GRET", "group": "Формирование отчетности", @@ -6126,20 +6066,9 @@ "destination": "MTCR", - "group": "Формирование отчетности", + "group": "Обмен с интеграционными модулями", - "name": "Формирование файлов с МТКР", - - "fields": [] - } - , - {"method":"post", - - "destination": "LIMC", - - "group": "Обмен с Торговой системой", - - "name": "Выгрузка в Торговую систему остатков по валют (отправка lim)", + "name": "Выгрузка ТКР", "fields": [] } @@ -6536,7 +6465,7 @@ } , {"code": "coverageStatus", - "type": 12,"dbname": "Код статуса достаточности обеспечения","name": "Cтатус достаточности обеспечения","shortname": "Обеспеченность","searchable": true,"sortable": true,"link": "allowed" + "type": 12,"dbname": "Код статуса достаточности обеспечения","name": "Статус достаточности обеспечения","shortname": "Обеспеченность","searchable": true,"sortable": true,"link": "allowed" } , {"code": "sessionId", @@ -6702,7 +6631,7 @@ } , {"code": "coverageStatus", - "type": 12,"dbname": "Код статуса достаточности обеспечения","name": "Cтатус достаточности обеспечения","shortname": "Обеспеченность","searchable": true,"sortable": true,"link": "allowed" + "type": 12,"dbname": "Код статуса достаточности обеспечения","name": "Статус достаточности обеспечения","shortname": "Обеспеченность","searchable": true,"sortable": true,"link": "allowed" } , {"code": "sessionId", @@ -6822,7 +6751,7 @@ } , {"code": "coverageStatus", - "type": 12,"dbname": "Код статуса достаточности обеспечения","name": "Cтатус достаточности обеспечения","shortname": "Обеспеченность","searchable": true,"sortable": true,"link": "allowed" + "type": 12,"dbname": "Код статуса достаточности обеспечения","name": "Статус достаточности обеспечения","shortname": "Обеспеченность","searchable": true,"sortable": true,"link": "allowed" } , {"code": "sessionId", @@ -7250,11 +7179,11 @@ } , {"code": "validFromDate", - "type": 6,"name": "Дата начала cессии","shortname": "Дата начала cессии","searchable": true,"sortable": true + "type": 6,"name": "Дата начала сессии","shortname": "Дата начала сессии","searchable": true,"sortable": true } , {"code": "validToDate", - "type": 6,"name": "Дата окончания cессии","shortname": "Дата окончания cессии","searchable": true,"sortable": true + "type": 6,"name": "Дата окончания сессии","shortname": "Дата окончания сессии","searchable": true,"sortable": true } , {"code": "companyId", @@ -7418,11 +7347,11 @@ } , {"code": "validFromDate", - "type": 6,"name": "Дата начала cессии","shortname": "Дата начала cессии","searchable": true,"sortable": true + "type": 6,"name": "Дата начала сессии","shortname": "Дата начала сессии","searchable": true,"sortable": true } , {"code": "validToDate", - "type": 6,"name": "Дата окончания cессии","shortname": "Дата окончания cессии","searchable": true,"sortable": true + "type": 6,"name": "Дата окончания сессии","shortname": "Дата окончания сессии","searchable": true,"sortable": true } , {"code": "companyId", @@ -7718,7 +7647,7 @@ } , {"code": "creditLeg_accountId", - "type": 1,"dbname": "Идентификатор счета отправителя","name": "Cчет отправителя","shortname": "Счет отправителя","searchable": true,"sortable": true,"link": "account","ignore": true + "type": 1,"dbname": "Идентификатор счета отправителя","name": "Счет отправителя","shortname": "Счет отправителя","searchable": true,"sortable": true,"link": "account","ignore": true } , {"code": "credit_csAccount", @@ -8475,12 +8404,12 @@ "type": 1,"name": "Идентификатор взаимодействия","shortname": "ID взаимодействия","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Num", - "field": "Doc_Num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_num", + "field": "doc_num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Date", - "field": "Doc_Date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_date", + "field": "doc_date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true } , {"code": "pay_val", @@ -8565,12 +8494,12 @@ "type": 1,"name": "Идентификатор соответствующей записи из таблицы-источника","shortname": "Входящая запись","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Num", - "field": "Doc_Num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_num", + "field": "doc_num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Date", - "field": "Doc_Date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_date", + "field": "doc_date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true } , {"code": "pay_val", @@ -9252,6 +9181,10 @@ {"code": "inSDfId", "type": 1,"name": "Идентификатор соответствующей записи из таблицы-источника","shortname": "Входящая запись","searchable": true,"sortable": true,"visible": true } + , + {"code": "accType", + "type": 3,"name": "Признак счета","shortname": "Признак счета","searchable": true,"sortable": true,"visible": true + } ] } @@ -9439,24 +9372,24 @@ "type": 1,"name": "Идентификатор взаимодействия","shortname": "ID взаимодействия","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Num", - "field": "Doc_Num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_num", + "field": "doc_num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Date", - "field": "Doc_Date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_date", + "field": "doc_date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true } , - {"code": "Value_date", - "field": "Value_date","type": 2,"length": 8,"name": "Дата валютирования","shortname": "Дата валютирования","searchable": true,"sortable": true,"visible": true + {"code": "value_date", + "field": "value_date","type": 2,"length": 8,"name": "Дата валютирования","shortname": "Дата валютирования","searchable": true,"sortable": true,"visible": true } , - {"code": "Swift_ben", - "field": "Swift_ben","type": 2,"length": 11,"name": "Свифт банка бенефициара","shortname": "Свифт банка бенефициара","searchable": true,"sortable": true,"visible": true + {"code": "swift_ben", + "field": "swift_ben","type": 2,"length": 11,"name": "Свифт банка бенефициара","shortname": "Свифт банка бенефициара","searchable": true,"sortable": true,"visible": true } , - {"code": "Swift_int", - "field": "Swift_int","type": 2,"length": 11,"name": "Свифт банка посредника","shortname": "Свифт банка посредника","searchable": true,"sortable": true,"visible": true + {"code": "swift_int", + "field": "swift_int","type": 2,"length": 11,"name": "Свифт банка посредника","shortname": "Свифт банка посредника","searchable": true,"sortable": true,"visible": true } ] @@ -9649,24 +9582,24 @@ "type": 1,"name": "Идентификатор взаимодействия","shortname": "ID взаимодействия","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Num", - "field": "Doc_Num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_num", + "field": "doc_num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Date", - "field": "Doc_Date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_date", + "field": "doc_date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true } , - {"code": "Value_date", - "field": "Value_date","type": 2,"length": 8,"name": "Дата валютирования","shortname": "Дата валютирования","searchable": true,"sortable": true,"visible": true + {"code": "value_date", + "field": "value_date","type": 2,"length": 8,"name": "Дата валютирования","shortname": "Дата валютирования","searchable": true,"sortable": true,"visible": true } , - {"code": "Swift_ben", - "field": "Swift_ben","type": 2,"length": 11,"name": "Свифт банка бенефициара","shortname": "Свифт банка бенефициара","searchable": true,"sortable": true,"visible": true + {"code": "swift_ben", + "field": "swift_ben","type": 2,"length": 11,"name": "Свифт банка бенефициара","shortname": "Свифт банка бенефициара","searchable": true,"sortable": true,"visible": true } , - {"code": "Swift_int", - "field": "Swift_int","type": 2,"length": 11,"name": "Свифт банка посредника","shortname": "Свифт банка посредника","searchable": true,"sortable": true,"visible": true + {"code": "swift_int", + "field": "swift_int","type": 2,"length": 11,"name": "Свифт банка посредника","shortname": "Свифт банка посредника","searchable": true,"sortable": true,"visible": true } ] @@ -9893,12 +9826,12 @@ "type": 1,"name": "Идентификатор взаимодействия","shortname": "ID взаимодействия","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Num", - "field": "Doc_Num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_num", + "field": "doc_num","type": 2,"length": 3,"name": "Номер выгружаемого документа","shortname": "Номер выгружаемого документа","searchable": true,"sortable": true,"visible": true } , - {"code": "Doc_Date", - "field": "Doc_Date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true + {"code": "doc_date", + "field": "doc_date","type": 2,"length": 8,"name": "Дата выгружаемого документа","shortname": "Дата выгружаемого документа","searchable": true,"sortable": true,"visible": true } , {"code": "dt_in", diff --git a/clearing-parent/balance-service/pom.xml b/clearing-parent/balance-service/pom.xml index afdc0fed1..508d9d258 100644 --- a/clearing-parent/balance-service/pom.xml +++ b/clearing-parent/balance-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 4.0.0 diff --git a/clearing-parent/classes/pom.xml b/clearing-parent/classes/pom.xml index 87d4e23b8..e333fc642 100644 --- a/clearing-parent/classes/pom.xml +++ b/clearing-parent/classes/pom.xml @@ -12,7 +12,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/account/BankAccount.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/account/BankAccount.java index 57df0c509..78fbb69d5 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/account/BankAccount.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/account/BankAccount.java @@ -25,6 +25,7 @@ public class BankAccount extends SpcexObjectBase { private String taxRegistrationReasonCode; private String account; private Long companyId; + private String intermediarySwiftCode; public Long getAccountId() { return accountId; @@ -137,4 +138,12 @@ public class BankAccount extends SpcexObjectBase { public void setCompanyId(Long companyId) { this.companyId = companyId; } + + public String getIntermediarySwiftCode() { + return intermediarySwiftCode; + } + + public void setIntermediarySwiftCode(String intermediarySwiftCode) { + this.intermediarySwiftCode = intermediarySwiftCode; + } } \ No newline at end of file diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java index d4c92bbc2..fe5314dba 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/registry/Registry.java @@ -58,6 +58,7 @@ public class Registry extends BusinessObject implements Cloneable { private Long sessionId; private String sessionType; private Long paymentId; + private String section; public Long getCompanyId() { return companyId; @@ -417,6 +418,14 @@ public class Registry extends BusinessObject implements Cloneable { this.paymentId = paymentId; } + public String getSection() { + return section; + } + + public void setSection(String section) { + this.section = section; + } + @Override public Registry clone() { try { diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf06.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf06.java index dcc0c9bf0..610d5a2d3 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf06.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf06.java @@ -28,8 +28,8 @@ public class SDf06 extends SpcexObjectBase implements WithFileName, WithCurrency private String fileName; private Instant generationTime; private Long generationId; - private String Doc_Num; - private String Doc_Date; + private String doc_num; + private String doc_date; private String pay_val; public String getAccount() { @@ -84,16 +84,16 @@ public class SDf06 extends SpcexObjectBase implements WithFileName, WithCurrency return inn; } - public void setInn(String inn) { - this.inn = inn; + public void setInn(String value) { + this.inn = value; } public String getBic() { return bic; } - public void setBic(String bic) { - this.bic = bic; + public void setBic(String value) { + this.bic = value; } public String getSpec() { @@ -136,18 +136,20 @@ public class SDf06 extends SpcexObjectBase implements WithFileName, WithCurrency this.generationId = value; } - public String getDoc_Num() { - return Doc_Num; - } - public void setDoc_Num(String value) { - this.Doc_Num=value; + public String getDoc_num() { + return doc_num; } - public String getDoc_Date() { - return Doc_Date; + public void setDoc_num(String value) { + this.doc_num = value; } - public void setDoc_Date(String value) { - this.Doc_Date=value; + + public String getDoc_date() { + return doc_date; + } + + public void setDoc_date(String value) { + this.doc_date = value; } public String getPay_val() { diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf07.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf07.java index 83bca6896..23a7ebf55 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf07.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf07.java @@ -30,8 +30,8 @@ public class SDf07 extends SpcexObjectBase { private Instant generationTime; private Long generationId; private Long inSDfId; - private String Doc_Num; - private String Doc_Date; + private String doc_num; + private String doc_date; private String pay_val; public String getAccount() { @@ -86,16 +86,16 @@ public class SDf07 extends SpcexObjectBase { return inn; } - public void setInn(String inn) { - this.inn = inn; + public void setInn(String value) { + this.inn = value; } public String getBic() { return bic; } - public void setBic(String bic) { - this.bic = bic; + public void setBic(String value) { + this.bic = value; } public String getSpec() { @@ -126,8 +126,8 @@ public class SDf07 extends SpcexObjectBase { return fileName; } - public void setFileName(String fileName) { - this.fileName = fileName; + public void setFileName(String value) { + this.fileName = value; } public Instant getGenerationTime() { @@ -154,20 +154,20 @@ public class SDf07 extends SpcexObjectBase { this.inSDfId = value; } - public String getDoc_Num() { - return Doc_Num; + public String getDoc_num() { + return doc_num; } - public void setDoc_Num(String value) { - this.Doc_Num = value; + public void setDoc_num(String value) { + this.doc_num = value; } - public String getDoc_Date() { - return Doc_Date; + public String getDoc_date() { + return doc_date; } - public void setDoc_Date(String value) { - this.Doc_Date = value; + public void setDoc_date(String value) { + this.doc_date = value; } public String getPay_val() { diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf54.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf54.java index 96779e0c5..f8e5f287a 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf54.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf54.java @@ -56,11 +56,11 @@ public class SDf54 extends SpcexObjectBase { private String doc_result; private Instant generationTime; private Long generationId; - private String Doc_Num; - private String Doc_Date; - private String Value_date; - private String Swift_ben; - private String Swift_int; + private String doc_num; + private String doc_date; + private String value_date; + private String swift_ben; + private String swift_int; public String getSeg_type() { return seg_type; @@ -398,44 +398,44 @@ public class SDf54 extends SpcexObjectBase { this.generationId = value; } - public String getDoc_Num() { - return Doc_Num; + public String getDoc_num() { + return doc_num; } - public void setDoc_Num(String value) { - this.Doc_Num = value; + public void setDoc_num(String value) { + this.doc_num = value; } - public String getDoc_Date() { - return Doc_Date; + public String getDoc_date() { + return doc_date; } - public void setDoc_Date(String value) { - this.Doc_Date = value; + public void setDoc_date(String value) { + this.doc_date = value; } public String getValue_date() { - return Value_date; + return value_date; } public void setValue_date(String value) { - this.Value_date = value; + this.value_date = value; } public String getSwift_ben() { - return Swift_ben; + return swift_ben; } public void setSwift_ben(String value) { - this.Swift_ben = value; + this.swift_ben = value; } public String getSwift_int() { - return Swift_int; + return swift_int; } public void setSwift_int(String value) { - this.Swift_int = value; + this.swift_int = value; } } \ No newline at end of file diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf55.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf55.java index 999e5d434..e9bbbc102 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf55.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf55.java @@ -57,11 +57,11 @@ public class SDf55 extends SpcexObjectBase { private String fileName; private Instant generationTime; private Long generationId; - private String Doc_Num; - private String Doc_Date; - private String Value_date; - private String Swift_ben; - private String Swift_int; + private String doc_num; + private String doc_date; + private String value_date; + private String swift_ben; + private String swift_int; public String getSeg_type() { return seg_type; @@ -407,44 +407,44 @@ public class SDf55 extends SpcexObjectBase { this.generationId = value; } - public String getDoc_Num() { - return Doc_Num; + public String getDoc_num() { + return doc_num; } - public void setDoc_Num(String value) { - this.Doc_Num = value; + public void setDoc_num(String value) { + this.doc_num = value; } - public String getDoc_Date() { - return Doc_Date; + public String getDoc_date() { + return doc_date; } - public void setDoc_Date(String value) { - this.Doc_Date = value; + public void setDoc_date(String value) { + this.doc_date = value; } public String getValue_date() { - return Value_date; + return value_date; } public void setValue_date(String value) { - this.Value_date = value; + this.value_date = value; } public String getSwift_ben() { - return Swift_ben; + return swift_ben; } public void setSwift_ben(String value) { - this.Swift_ben = value; + this.swift_ben = value; } public String getSwift_int() { - return Swift_int; + return swift_int; } public void setSwift_int(String value) { - this.Swift_int = value; + this.swift_int = value; } } \ No newline at end of file diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf57.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf57.java index 43b412a2b..e96293521 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf57.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf57.java @@ -13,6 +13,7 @@ import ru.spcex.platform.classes.base.interfaces.WithCurrency; public class SDf57 extends SpcexObjectBase implements WithCurrency { private static final long serialVersionUID = ConstSerializable.serialVersionUID; + private Instant generationTime; private Long dbfId; private String deal_deb; private String deal_cred; @@ -51,15 +52,22 @@ public class SDf57 extends SpcexObjectBase implements WithCurrency { private String acc_kr; private String specif; private String fileName; - private Instant generationTime; private Long generationId; - private String Doc_Num; - private String Doc_Date; + private String doc_num; + private String doc_date; private String dt_in; private String kt_in; private String dt_out; private String kt_out; + public Instant getGenerationTime() { + return generationTime; + } + + public void setGenerationTime(Instant value) { + this.generationTime = value; + } + public Long getDbfId() { return dbfId; } @@ -364,14 +372,6 @@ public class SDf57 extends SpcexObjectBase implements WithCurrency { this.fileName = value; } - public Instant getGenerationTime() { - return generationTime; - } - - public void setGenerationTime(Instant value) { - this.generationTime = value; - } - public Long getGenerationId() { return generationId; } @@ -380,20 +380,20 @@ public class SDf57 extends SpcexObjectBase implements WithCurrency { this.generationId = value; } - public String getDoc_Num() { - return Doc_Num; + public String getDoc_num() { + return doc_num; } - public void setDoc_Num(String value) { - this.Doc_Num = value; + public void setDoc_num(String value) { + this.doc_num = value; } - public String getDoc_Date() { - return Doc_Date; + public String getDoc_date() { + return doc_date; } - public void setDoc_Date(String value) { - this.Doc_Date = value; + public void setDoc_date(String value) { + this.doc_date = value; } public String getDt_in() { diff --git a/clearing-parent/cleaning-builders/pom.xml b/clearing-parent/cleaning-builders/pom.xml index f609097c9..ad4afccf6 100644 --- a/clearing-parent/cleaning-builders/pom.xml +++ b/clearing-parent/cleaning-builders/pom.xml @@ -6,13 +6,13 @@ ru.spcex.clearing clearing-parent - SPCEX-3.11.0.0 + SPCEX-3.12.7 cleaning-builders cleaning-builders Cleaning builders module - SPCEX-3.11.0.0 + SPCEX-3.12.7 jar @@ -26,7 +26,7 @@ ru.spcex.clearing classes - SPCEX-3.11.0.0 + SPCEX-3.12.7 compile diff --git a/clearing-parent/clearing-service/pom.xml b/clearing-parent/clearing-service/pom.xml index 77e2ff628..e683341d9 100644 --- a/clearing-parent/clearing-service/pom.xml +++ b/clearing-parent/clearing-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 4.0.0 diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessagesConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessagesConfig.java index 38d52587e..26fdf82e1 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessagesConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessagesConfig.java @@ -1,19 +1,18 @@ package ru.spcex.clearing.config; +import java.util.Locale; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ResourceBundleMessageSource; -import ru.spcex.platform.utils.enumeration.IMessageResolver; -import ru.spcex.platform.utils.enumeration.SpringPropertiesMessageResolver; +import ru.spcex.platform.utils.localization.SpringPropertiesLocalizer; -import java.util.Locale; - -//@Configuration +@Configuration public class MessagesConfig { - @Bean("validation-error-messages") + @Bean("clearing-messages") public ResourceBundleMessageSource messages() { ResourceBundleMessageSource source = new ResourceBundleMessageSource(); - source.setBasenames("messages/error"); + source.setBasenames("messages/clearing"); source.setUseCodeAsDefaultMessage(true); source.setDefaultEncoding("utf8"); source.setDefaultLocale(Locale.ROOT); @@ -21,9 +20,12 @@ public class MessagesConfig { } @Bean - public IMessageResolver errorResolver(@Qualifier("validation-error-messages") ResourceBundleMessageSource messageBundle) { - SpringPropertiesMessageResolver resolver = new SpringPropertiesMessageResolver(messageBundle); - resolver.setLocale("ru"); + public SpringPropertiesLocalizer localizer( + @Qualifier("clearing-messages") + ResourceBundleMessageSource messageBundle + ) { + SpringPropertiesLocalizer resolver = new SpringPropertiesLocalizer(messageBundle); + resolver.setDefaultLocale("ru"); return resolver; } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/messages/ClearingMessage.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/messages/ClearingMessage.java new file mode 100644 index 000000000..cf150d1ff --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/messages/ClearingMessage.java @@ -0,0 +1,21 @@ +package ru.spcex.clearing.messages; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum ClearingMessage implements IEnumKey { + WithdrawalFreeFromTkr("payment-instruction.purpose.withdrawal.tcr"), + WithdrawalOfFunds("payment-instruction.purpose.withdrawal"), + urgent("sdf54.urgent"), + ; + private final String key; + + ClearingMessage(String key) { + this.key = key; + } + + + @Override + public String getKey() { + return key; + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java index f99423124..5cbac4d47 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/AnltSearcher.java @@ -116,7 +116,7 @@ public class AnltSearcher { return new AnltSearch(infoAcc, company, tcr, tcrList, currencyCode); } - private static final Pattern tcrPattern = Pattern.compile("ТКР.*?([0-9A-Z-]{12})"); + private static final Pattern tcrPattern = Pattern.compile("(?:ТКР|TKR|TCR).*?([0-9A-Z-]{12})"); private static String getTkrCodeFromComment(String comment) { if (TextUtil.isEmpty(comment)) { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java index 9c695355d..561d7b160 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java @@ -45,6 +45,7 @@ import ru.spcex.clearing.session.stage.SecondaryAuctionT0Session; import ru.spcex.clearing.session.stage.SessionManager; import ru.spcex.clearing.session.stage.SessionTerminator; import ru.spcex.clearing.session.stage.TaskType; +import ru.spcex.clearing.session.stage.UnitedSession; import ru.spcex.clearing.session.stage.impl.BalanceRevise; import ru.spcex.clearing.statement.StatementServiceV2; import ru.spcex.platform.enumeration.Task; @@ -65,6 +66,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean { private final PrimaryAuctionB0Session primaryAuctionB0Session; private final IntermediateMkrSession intermediateMkrSession; private final FinalMkrSession finalMkrSession; + private final UnitedSession unitedSession; private final ReturnDepositSession returnDepositSession; private final SessionManager sessionManager; private final Sdf06Executor sdf06Executor; @@ -83,7 +85,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean { PrimaryAuctionBnSession primaryAuctionBnSession, SecondaryAuctionT0Session secondaryAuctionT0Session, CurrencySession currencySession, - PrimaryAuctionB0Session primaryAuctionB0Session, PrimaryAuctionT0Session primaryAuctionT0Session, IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, ReturnDepositSession returnDepositSession, SessionManager sessionManager, + PrimaryAuctionB0Session primaryAuctionB0Session, PrimaryAuctionT0Session primaryAuctionT0Session, IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, UnitedSession unitedSession, ReturnDepositSession returnDepositSession, SessionManager sessionManager, Sdf06Executor sdf06Executor, Sdf10Executor sdf10Executor, BalanceRevise balanceRevise, Sdf05Sender sdf05Sender, StatementServiceV2 statementService, SessionTerminator sessionTerminator, PaymentInstructionOutboundService pmtOutboundService) { super(kafkaQueue, kafkaResponseQueue); @@ -98,6 +100,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean { this.primaryAuctionT0Session = primaryAuctionT0Session; this.intermediateMkrSession = intermediateMkrSession; this.finalMkrSession = finalMkrSession; + this.unitedSession = unitedSession; this.returnDepositSession = returnDepositSession; this.sessionManager = sessionManager; this.sdf06Executor = sdf06Executor; @@ -153,6 +156,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean { primaryAuctionB0Session.continueSession(req); intermediateMkrSession.continueSession(req); finalMkrSession.continueSession(req); + unitedSession.continueSession(req); returnDepositSession.continueSession(req); }) .forDestination(Consts.CONTINUE_SESSION_BN_FIRST_PART, callbacks::put); @@ -207,7 +211,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean { callback(LauncherCommandRequest.class) .setConsumer(task -> { - balanceRevise.submit(new ru.spcex.clearing.session.stage.Task<>(TaskType.StartRevise, null)); + balanceRevise.submit(new ru.spcex.clearing.session.stage.Task<>(TaskType.SDF51, null)); }) .forDestination(Task.getVerification.topic(), callbacks::put); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf54Creator.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf54Creator.java index 97a0f1365..8d25bccbb 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf54Creator.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Sdf54Creator.java @@ -3,6 +3,7 @@ package ru.spcex.clearing.service; import java.time.Instant; import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.util.Locale; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,6 +16,8 @@ import ru.clearing.classes.statics.data.payment.PaymentInstruction; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.sdf.SDf54; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.messages.ClearingMessage; +import ru.spcex.clearing.util.LocaleUtil; import ru.spcex.platform.enumeration.AccountStatus; import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.CompanySymbol; @@ -25,6 +28,7 @@ import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.utils.enumeration.IEnumKey; +import ru.spcex.platform.utils.localization.SpringPropertiesLocalizer; import ru.spcex.platform.utils.number.BigDecimalUtil; import ru.spcex.platform.utils.time.TimeUtil; @@ -38,9 +42,10 @@ public class Sdf54Creator { private final Imdg sdf54Imdg; private final Imdg bankAccountImdg; private final ImdgId idGenerator; + private final SpringPropertiesLocalizer resolver; private static DateTimeFormatter payDateFormatter = DateTimeFormatter.ofPattern("dd.MM.yy"); - public Sdf54Creator(ImdgProvider imdgProvider) { + public Sdf54Creator(ImdgProvider imdgProvider, SpringPropertiesLocalizer resolver) { this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); @@ -48,23 +53,25 @@ public class Sdf54Creator { this.bankAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_BankAccount, BankAccount.class); this.sdf54Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf54, SDf54.class); this.idGenerator = imdgProvider.getImdgIdGenerator(); + this.resolver = resolver; } private final static DateTimeFormatter docnmRefFormatter = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS"); - public SDf54 create(PaymentInstruction paymentInstruction) { + public SDf54 create(PaymentInstruction pmt) { Instant now = Instant.now(); String c_acc_cred = null; Account anltAcc = accountImdg.getFirstObjectBySQL("accountType = '%s' and status = '%s' and currency = '%s'" .formatted( AccountType.Anlt.getKey(), Status.Active.getKey(), - paymentInstruction.getCreditLeg_currencyCode() + pmt.getCreditLeg_currencyCode() )); // c_acc_deb = c_acc_deb == null ? paymentInstruction.getCreditLeg_account() : c_acc_deb; - c_acc_cred = c_acc_cred == null ? paymentInstruction.getDebitLeg_account() : c_acc_cred; + c_acc_cred = c_acc_cred == null ? pmt.getDebitLeg_account() : c_acc_cred; + Locale locale = LocaleUtil.locale(pmt.getCreditLeg_currencyCode(), pmt.getDebitLeg_currencyCode()); SDf54 sDf54 = new SDf54(); sDf54.setId(idGenerator.nextId()); sDf54.setSeg_type("V"); @@ -79,7 +86,13 @@ public class Sdf54Creator { Company prcCmp = companyImdg.getSingleObjectByID(Sender.Prc.getId()); String senderSbankName = ""; if (prcCmp != null) { - senderSbankName = prcCmp.getShortName(); + if (LocaleUtil.isRus(locale)) { + senderSbankName = prcCmp.getShortName(); + } else if (prcCmp.getProfile() != null) { + senderSbankName = prcCmp.getProfile().getShortNameEng(); + } else { + senderSbankName = ""; + } } SpecifUtil.fillSegmentsBy35Symbols(senderSbankName, sDf54::setSbanknam1, @@ -105,28 +118,27 @@ public class Sdf54Creator { if (anltAcc != null) { sDf54.setAcc_deb(anltAcc.getAccount()); } - Account accDebAcc = accountImdg.getSingleObjectByID(paymentInstruction.getDebitLeg_accountId()); + Account accDebAcc = accountImdg.getSingleObjectByID(pmt.getDebitLeg_accountId()); if (accDebAcc == null || !AccountStatus.ACTIVE.equalsByKey(accDebAcc.getStatus())) { - log.warn("paymentInstruction[{}].DebitLeg_accountId={} account not exist or not active.", paymentInstruction.getId(), paymentInstruction.getDebitLeg_accountId()); + log.warn("paymentInstruction[{}].DebitLeg_accountId={} account not exist or not active.", pmt.getId(), pmt.getDebitLeg_accountId()); } - BankAccount bnkAcc = bankAccountImdg.getFirstObjectBySQL("accountId = %d".formatted(paymentInstruction.getDebitLeg_accountId())); + BankAccount bnkAcc = bankAccountImdg.getFirstObjectBySQL("accountId = %d".formatted(pmt.getDebitLeg_accountId())); if (bnkAcc != null) { sDf54.setInn_cred(bnkAcc.getTaxpayerIdentificationNumber()); sDf54.setKpp_cred(bnkAcc.getTaxRegistrationReasonCode()); c_acc_cred = bnkAcc.getCorrespondentAccount(); - sDf54.setSwift_ben(bnkAcc.getSwiftCode()); + if (!LocaleUtil.isRus(locale)) { + sDf54.setSwift_ben(bnkAcc.getSwiftCode()); + sDf54.setSwift_int(bnkAcc.getIntermediarySwiftCode()); + } } else { - log.warn("Bank account not found for DebitLeg_accountId={}", paymentInstruction.getDebitLeg_accountId()); - } - sDf54.setDoc_Num(String.valueOf(nextDocNum())); - BankAccount prcBankAcc = bankAccountImdg.getFirstObjectBySQL("companyId = %d".formatted(Sender.Prc.getId())); - if (prcBankAcc != null) { - sDf54.setSwift_int(prcBankAcc.getSwiftCode()); + log.warn("Bank account not found for DebitLeg_accountId={}", pmt.getDebitLeg_accountId()); } + sDf54.setDoc_num(String.valueOf(nextDocNum())); String today = payDateFormatter.format(LocalDate.now()); - sDf54.setDoc_Date(today); + sDf54.setDoc_date(today); sDf54.setValue_date(today); - sDf54.setAcc_kr_1(paymentInstruction.getDebitLeg_account()); + sDf54.setAcc_kr_1(pmt.getDebitLeg_account()); { Account prcCorrAcc = accountImdg.getFirstObjectBySQL("companyId=%d and accountType = '%s' and status = '%s' and currency = '%s'" @@ -134,7 +146,7 @@ public class Sdf54Creator { Sender.Prc.getId(), AccountType.Bank.getKey(), Status.Active.getKey(), - paymentInstruction.getCreditLeg_currencyCode() + pmt.getCreditLeg_currencyCode() )); if (prcCorrAcc == null) { log.warn("Account for PRC CORR not found"); @@ -144,7 +156,7 @@ public class Sdf54Creator { } //********************** - sDf54.setSend_type("срочно"); + sDf54.setSend_type(resolver.resolve(ClearingMessage.urgent, locale)); sDf54.setDoc_type("002"); sDf54.setDocnm_ref(docnmRefFormatter.format(TimeUtil.toDateTime(now))); @@ -166,7 +178,15 @@ public class Sdf54Creator { { Company company1 = companyImdg.getSingleObjectByID(Sender.One.getId()); if (company1 != null) { // "АО СПВБ" company.shortName[id = 1] - SpecifUtil.fillSegmentsBy35Symbols(company1.getShortName(), + String sclientn; + if (LocaleUtil.isRus(locale)) { + sclientn = company1.getShortName(); + } else if (company1.getProfile() != null) { + sclientn = company1.getProfile().getShortNameEng(); + } else { + sclientn = ""; + } + SpecifUtil.fillSegmentsBy35Symbols(sclientn, sDf54::setSclientn1, sDf54::setSclientn2, sDf54::setSclientn3, @@ -185,13 +205,13 @@ public class Sdf54Creator { } } - sDf54.setPay_date(payDateFormatter.format(TimeUtil.toLocalDate(paymentInstruction.getPaymentDate()))); - sDf54.setPay_val(paymentInstruction.getCreditLeg_currencyCode()); - String sumDeb = paymentInstruction.getDebitLeg_amount() != null ? paymentInstruction.getDebitLeg_amount().toString() : ""; + sDf54.setPay_date(payDateFormatter.format(TimeUtil.toLocalDate(pmt.getPaymentDate()))); + sDf54.setPay_val(pmt.getCreditLeg_currencyCode()); + String sumDeb = pmt.getDebitLeg_amount() != null ? pmt.getDebitLeg_amount().toString() : ""; sDf54.setSum_deb(BigDecimalUtil.limitDecimalPlaces(sumDeb, 2)); - sDf54.setSpecif_1(paymentInstruction.getPaymentPurpose()); + sDf54.setSpecif_1(pmt.getPaymentPurpose()); sDf54.setGenerationTime(now); - log.debug("paymentInstruction.id={}, sdf54.id {}", paymentInstruction.getId(), sDf54.getId()); + log.debug("paymentInstruction.id={}, sdf54.id {}", pmt.getId(), sDf54.getId()); return sDf54; } @@ -205,15 +225,15 @@ public class Sdf54Creator { SDf54 sDf54 = sdf54Imdg.aggregateByMax( "id", pb.and( pb.greatEqual("generationTime", TimeUtil.today()), - pb.notNull("Doc_Num") + pb.notNull("doc_num") ) ); if (sDf54 != null) { try { - int num = Integer.parseInt(sDf54.getDoc_Num()); + int num = Integer.parseInt(sDf54.getDoc_num()); return ++num; } catch (Throwable e) { - log.error("couldn't parse sdf54.id={} doc_num {}", sDf54.getId(), sDf54.getDoc_Num()); + log.error("couldn't parse sdf54.id={} doc_num {}", sDf54.getId(), sDf54.getDoc_num()); return 1; } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/RegistrySecurityBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/RegistrySecurityBuilder.java index 8be4f2591..c00e5aced 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/RegistrySecurityBuilder.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/RegistrySecurityBuilder.java @@ -1,5 +1,10 @@ package ru.spcex.clearing.service.builder; +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; +import java.util.Collection; +import java.util.Map; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.ClearingAccount; import ru.clearing.classes.statics.data.company.Company; @@ -8,28 +13,31 @@ import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; import ru.clearing.classes.statics.data.misc.Currency; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; +import ru.clearing.classes.statics.data.sdf.SDf21; import ru.clearing.classes.statics.data.security.CurrencyPairSecurity; import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; import ru.clearing.classes.statics.data.security.Security; import ru.clearing.classes.statics.data.statement.Statement; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.session.stage.util.RegistryUtil; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryInstrumentType; +import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.enumeration.ServiceStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.IEnumKey; - -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.util.Collection; -import java.util.Map; +import ru.spcex.platform.utils.number.BigDecimalUtil; public class RegistrySecurityBuilder { private Statement statement; private Company company; private Account account; private RegistryDesignation designation; + private SDf21 sdf21; + private final ImdgProvider imdgProvider; private final Imdg clearingAccountImdg; @@ -92,19 +100,18 @@ public class RegistrySecurityBuilder { rgs.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); AccountType accType = IEnumKey.getEnumByKey(AccountType.class, account.getAccountType()); - if (AccountType.Clrn.equals(accType)) { - ClearingAccount accountForStatement = clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", statement.getAccountId())); - if (accountForStatement != null) { - rgs.setRegistryCapacity(accountForStatement.getClearingAccountType()); - } - } else if (AccountType.Info.equals(accType) || AccountType.Anlt.equals(accType)) { - rgs.setRegistryCapacity(RegistryCapacity.A.getKey()); - } + //if (AccountType.Clrn.equals(accType)) { + // ClearingAccount accountForStatement = clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", statement.getAccountId())); + // if (accountForStatement != null) { + // rgs.setRegistryCapacity(accountForStatement.getClearingAccountType()); + // } + //} else if (AccountType.Info.equals(accType) || AccountType.Anlt.equals(accType)) { + // rgs.setRegistryCapacity(RegistryCapacity.A.getKey()); + //} rgs.setRegistryUnit(RegistryUnit.T.getKey()); - rgs.setRegistryCode(RegistryUtil.clearingCode(rgs)); Collection tcrsByAccount = tradingClearingRegistryImdg.getCollectionObjectsByFieldValues(Map.of( - "moneyAccountId", account.getId(), + "depoAccountId", account.getId(), "companyId", company.getId(), "status", ServiceStatus.Active.getKey() )); @@ -112,7 +119,9 @@ public class RegistrySecurityBuilder { TradingClearingRegistry tcr = tcrsByAccount.iterator().next(); rgs.setTradingClearingRegistryId(tcr.getId()); rgs.setTradingClearingRegistry(tcr.getCode()); + rgs.setRegistryCapacity(tcr.getTradingClearingRegistryType()); } + rgs.setRegistryCode(RegistryUtil.clearingCode(rgs)); rgs.setRegistryStatus(RegistryStatus.PROC.getKey()); rgs.setSecurityId(statement.getSecurityId()); @@ -131,6 +140,7 @@ public class RegistrySecurityBuilder { rgs.setCreated(Instant.now()); //по дефолту создаем с балансом 0, а потом пересчитываем по необходимости + rgs.setPlanBalance(BigDecimalUtil.parse(sdf21.getCloseBalance())); rgs.setBalance(BigDecimal.ZERO); rgs.setDebit(BigDecimal.ZERO); rgs.setCredit(BigDecimal.ZERO); @@ -154,4 +164,9 @@ public class RegistrySecurityBuilder { if (currency != null) return currency.getCurrencyCode(); return null; } + + public RegistrySecurityBuilder sdf21(SDf21 sdf21) { + this.sdf21 = sdf21; + return this; + } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java index 10c68106d..f0200fa4a 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionCurrencyComponent.java @@ -180,7 +180,7 @@ public class ExecutionCurrencyComponent { eCurrency.setTradingDate(sTrades.getTradeDate()); eCurrency.setClearingDate(TimeUtil.toLocalDate(now)); eCurrency.setExchangeExecutionId(sTrades.getTradeNum()); - eCurrency.setExchangeExecutionTime(sTrades.getTradeDateTime()); + eCurrency.setExchangeExecutionTime(TimeUtil.instPlusMicros(sTrades.getTradeDateTime(), sTrades.getTradeTimeMs())); eCurrency.setExchangeExecutionMicroseconds(sTrades.getTradeDateTime()); // todo проверить это дата+время или нет eCurrency.setPartyTradingClearingRegistryId(rgstr.getId()); // setTradingClearingRegistryId eCurrency.setPartyTradingClearingRegistry(rgstr.getCode()); // todo уточнить rgstr.code/strades.account? diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java index e284bebac..0d1fa7746 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionDepositComponent.java @@ -183,7 +183,7 @@ public class ExecutionDepositComponent { eDeposit.setTradingDate(sTrades.getTradeDate()); eDeposit.setClearingDate(TimeUtil.toLocalDate(now)); eDeposit.setExchangeExecutionId(sTrades.getTradeNum()); - eDeposit.setExchangeExecutionTime(sTrades.getTradeDateTime()); + eDeposit.setExchangeExecutionTime(TimeUtil.instPlusMicros(sTrades.getTradeDateTime(), sTrades.getTradeTimeMs())); eDeposit.setTradingClearingRegistryId(rgstr.getId()); eDeposit.setMarket(sTrades.getClassCode()); eDeposit.setPrice(sTrades.getPrice()); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java index d962c27fe..70fb5a45b 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/execution/ExecutionFondComponent.java @@ -204,7 +204,7 @@ public class ExecutionFondComponent { eFond.setTradingDate(sTrades.getTradeDate()); eFond.setClearingDate(TimeUtil.toLocalDate(now)); eFond.setExchangeExecutionId(sTrades.getTradeNum()); - eFond.setExchangeExecutionTime(sTrades.getTradeDateTime()); + eFond.setExchangeExecutionTime(TimeUtil.instPlusMicros(sTrades.getTradeDateTime(), sTrades.getTradeTimeMs())); eFond.setTradingClearingRegistryId(rgstr.getId()); //todo можем ли просто переложить sTrades.getClassCode() или все такие искать, одно и тоже же diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java index fb495f785..9503b41ab 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf06Executor.java @@ -354,8 +354,8 @@ public class Sdf06Executor { sDf07.setNumber(sdf06.getNumber()); sDf07.setSpec(sdf06.getSpec()); sDf07.setResult(result); - sDf07.setDoc_Date(sdf06.getDoc_Date()); - sDf07.setDoc_Num(sdf06.getDoc_Num()); + sDf07.setDoc_date(sdf06.getDoc_date()); + sDf07.setDoc_num(sdf06.getDoc_num()); sDf07.setPay_val(sdf06.getPay_val()); return sDf07; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf21Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf21Executor.java index 040862e1b..a08ab39e8 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf21Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf21Executor.java @@ -1,5 +1,13 @@ package ru.spcex.clearing.service.executors; +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Collection; +import java.util.Optional; +import java.util.function.Function; +import java.util.regex.Pattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; @@ -26,7 +34,21 @@ import ru.spcex.clearing.service.model.Result; import ru.spcex.clearing.service.registry.AssetTBFProcessing; import ru.spcex.clearing.service.validation.ValidationStored; import ru.spcex.clearing.session.stage.util.RegistryUtil; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.BalanceDimension; +import ru.spcex.platform.enumeration.InOutDirection; +import ru.spcex.platform.enumeration.InOutSDfType; +import ru.spcex.platform.enumeration.OperationCode; +import ru.spcex.platform.enumeration.OperationStatus; +import ru.spcex.platform.enumeration.RegistryCapacity; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryInstrumentType; +import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.enumeration.RegistryTradingParams; +import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.enumeration.Sender; +import ru.spcex.platform.enumeration.StatementType; +import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; @@ -36,20 +58,10 @@ import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IMessageResolver; +import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.validation.IValidator; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.Collection; -import java.util.Optional; -import java.util.function.Function; -import java.util.regex.Pattern; - -import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; - @Service public class Sdf21Executor extends AbstractExecutor { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -193,6 +205,7 @@ public class Sdf21Executor extends AbstractExecutor { rgs.getCredit()); }, () -> { Registry registry = RegistrySecurityBuilder.builder(imdgProvider) + .sdf21(sdf21) .statement(stmt) .company(company) .account(account) @@ -428,19 +441,6 @@ public class Sdf21Executor extends AbstractExecutor { } } - private static String getTkrCodeFromComment(String comment) { - if (comment == null) { - return null; - } - comment = comment.toUpperCase(); - int tcrIndex = comment.indexOf("ТКР"); - if (tcrIndex == -1) { - return null; - } - comment = comment.substring(tcrIndex + 3); - return comment.replaceAll("\\s+", ""); - } - private static String getContractFromSpecif(String specif) { if (specif == null) { return null; diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java index 2674e9f35..2a5badb39 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/executors/Sdf57Executor.java @@ -193,6 +193,11 @@ public class Sdf57Executor extends AbstractExecutor { boolean sessionIsPresent = sessionImdg.getFirstObjectByFieldValues(Map.of( "workflowStatus", SessionStatus.ACTV.getKey() )) != null; + boolean existActiveCurrSession = sessionImdg.getFirstObjectByFieldValues( + Map.of( + "workflowStatus", SessionStatus.ACTV.getKey(), + "sessionType", SessionType.CURR.getKey() + )) != null; sdf = sdf.stream().sorted(Comparator.comparing(SpcexObjectBase::getId)).toList(); for (SDf57 sdf57 : sdf) { IValidator validator = sDf57Validator.apply(sdf57); @@ -396,12 +401,15 @@ public class Sdf57Executor extends AbstractExecutor { log.trace("stmt.id={} {}.id={} TCR is empty, skipping gateway request", stmt.getId(), asts.a__t().getRegistryCode(), asts.a__t().getId()); } else { - log.trace("sending gateway request for stmt.id={}", stmt.getId()); Optional gtwReq = gatewayRequest(stmt, company, account, - asts.a__t().getTradingClearingRegistry()); - gtwReq.ifPresent(r -> kafka.sendRequestToQueue(Consts.ASSET_OPERATION, r)); + asts.a__t().getTradingClearingRegistry(), + existActiveCurrSession); + gtwReq.ifPresent(r -> { + log.trace("sending gateway request for stmt.id={}", stmt.getId()); + kafka.sendRequestToQueue(Consts.ASSET_OPERATION, r); + }); } } return Optional.of(asts); @@ -790,19 +798,6 @@ public class Sdf57Executor extends AbstractExecutor { return LocalDate.parse(payDate, payDateFormatter); } - private static String getTkrCodeFromComment(String comment) { - if (comment == null) { - return null; - } - comment = comment.toUpperCase(); - int tcrIndex = comment.indexOf("ТКР"); - if (tcrIndex == -1) { - return null; - } - comment = comment.substring(tcrIndex + 3); - return comment.replaceAll("\\s+", ""); - } - private String getContractFromSpecif(String specif) { if (TextUtil.isEmpty(specif)) { return null; @@ -839,11 +834,18 @@ public class Sdf57Executor extends AbstractExecutor { } private static final Pattern csBlkd = Pattern.compile(SpecifFlag.CS_BLKD.getKey() + "_(\\d+).*"); + private static final String COMMENT_FOR_SKIPPING_SEND_ASSETS_CURR_SESSION = "ПО ИТОГУ КЛИРИНГА"; - private Optional gatewayRequest(Statement stmt, Company company, Account account, String tcrCode) { + private Optional gatewayRequest(Statement stmt, Company company, Account account, + String tcrCode, boolean existActiveCurrSession) { if (AccountType.Anlt.equalsByKey(account.getAccountType())) { return Optional.empty(); } + String specif = stmt.getComment(); + if (existActiveCurrSession && !TextUtil.isEmpty(specif) && + specif.toUpperCase().contains(COMMENT_FOR_SKIPPING_SEND_ASSETS_CURR_SESSION)) { + return Optional.empty(); + } String tradingCode = company.getTradingCode(); AssetOperationListRequest gatewayRequest = new AssetOperationListRequest(); Currency currency = currencyImdg.getSingleObjectByID(stmt.getSecurityId()); @@ -852,7 +854,6 @@ public class Sdf57Executor extends AbstractExecutor { tradingCode, tcrCode, currency != null ? currency.getCurrencyCode() : CurrencyCode.RUB.getKey()); - String specif = stmt.getComment(); Matcher m; if (!TextUtil.isEmpty(specif) && (m = csBlkd.matcher(specif)).find()) { try { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java index 72cf231a4..ee1e59243 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/payment/PaymentInstructionOutboundService.java @@ -2,6 +2,7 @@ package ru.spcex.clearing.service.payment; import java.math.BigDecimal; import java.time.Instant; +import java.util.Locale; import java.util.Optional; import java.util.function.Function; import java.util.function.Supplier; @@ -19,6 +20,7 @@ import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.sdf.SDf54; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.messages.ClearingMessage; import ru.spcex.clearing.notification.NotificationSender; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -39,6 +41,7 @@ import ru.spcex.clearing.service.schedule.TradingTimeService; import ru.spcex.clearing.service.validation.ValidationStored; import ru.spcex.clearing.session.stage.impl.GatewayRequester; import static ru.spcex.clearing.session.stage.impl.GatewayRequester.mapError; +import ru.spcex.clearing.util.LocaleUtil; import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.ObjectType; @@ -51,6 +54,7 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IEnumId; import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.localization.SpringPropertiesLocalizer; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; import ru.spcex.platform.utils.text.TextUtil; import ru.spcex.platform.utils.validation.IValidator; @@ -78,12 +82,14 @@ public class PaymentInstructionOutboundService { private final TradingTimeService time; private final GatewayRequester gateway; private final NotificationSender notification; + private final SpringPropertiesLocalizer resolver; @Autowired public PaymentInstructionOutboundService(UserRoleVerification rights, IMessageResolver msgs, ImdgProvider imdgProvider, - Function validation, RegistryManager rgsMng, KafkaSender kafkaSender, AssetTBFProcessing assetsMng, DmiService dmiService, TradingTimeService time, GatewayRequester gateway, NotificationSender notification) { + Function validation, RegistryManager rgsMng, KafkaSender kafkaSender, AssetTBFProcessing assetsMng, DmiService dmiService, TradingTimeService time, GatewayRequester gateway, NotificationSender notification, + SpringPropertiesLocalizer resolver) { this.imdgProvider = imdgProvider; this.rights = rights; this.msgs = msgs; @@ -95,7 +101,7 @@ public class PaymentInstructionOutboundService { this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); this.currImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class); this.sdf54Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf54, SDf54.class); - this.sdf54Creator = new Sdf54Creator(imdgProvider); + this.sdf54Creator = new Sdf54Creator(imdgProvider, resolver); this.idGenerator = imdgProvider.getImdgIdGenerator(); this.rgsMng = rgsMng; this.kafkaSender = kafkaSender; @@ -103,6 +109,7 @@ public class PaymentInstructionOutboundService { this.dmiService = dmiService; this.time = time; this.gateway = gateway; + this.resolver = resolver; this.gateway.setName("PaymentInstructionOutboundService|PI"); this.notification = notification; } @@ -128,7 +135,10 @@ public class PaymentInstructionOutboundService { log.debug("all checks passed, accCred.id={}, accDeb.id={}, addressee.id={}, sender.id={}, amount: {}", accCred.getId(), accDeb.getId(), addressee.getId(), sender.getId(), amount); - String purpose = tcr != null ? "Возврат денежных средств, свободных от обязательств с ТКР " + tcr.getCode() + " ." : "Вывод средств."; + Locale locale = LocaleUtil.locale(accDeb); + String purpose = tcr != null ? + resolver.resolve(ClearingMessage.WithdrawalFreeFromTkr, locale, tcr.getCode()) : + resolver.resolve(ClearingMessage.WithdrawalOfFunds, locale); if (payload.getPaymentPurpose() != null) { String reqPmtPrpse = payload.getPaymentPurpose(); if (!(reqPmtPrpse.endsWith(".") || reqPmtPrpse.endsWith("!") || reqPmtPrpse.endsWith("?") || reqPmtPrpse.endsWith(";"))) { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/PaymentStateMarkService.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/PaymentStateMarkService.java index 85e3dd690..60b60b7e5 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/PaymentStateMarkService.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/registry/PaymentStateMarkService.java @@ -1,5 +1,12 @@ package ru.spcex.clearing.service.registry; +import java.math.BigDecimal; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -10,24 +17,20 @@ import ru.clearing.classes.statics.data.registry.Registry; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.service.AssetTrio; import ru.spcex.clearing.session.stage.util.RegistryUtil; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.CompanyRole; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryStatus; +import static ru.spcex.platform.enumeration.RegistryTradingParams.CM_T; +import static ru.spcex.platform.enumeration.RegistryTradingParams.LM_T; +import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.enumeration.Section; +import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; -import java.math.BigDecimal; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; - -import static ru.spcex.platform.enumeration.RegistryTradingParams.CM_T; -import static ru.spcex.platform.enumeration.RegistryTradingParams.LM_T; - @Component public class PaymentStateMarkService { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -49,6 +52,7 @@ public class PaymentStateMarkService { ImdgPredicate prdct = pb.and( pb.sql(RegistryCodeSqlBuilder.getInstance(CM_T, LM_T).build()), pb.equals("sessionId", sessionId), + pb.equals("section", Section.MKR.getKey()), pb.equals("registryStatus", RegistryStatus.OK.getKey()) ); Collection claimsAndLiabilities = rgsImdg.getCollectionObjectsByPredicate(prdct); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RegistryStep3ValidationRule.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RegistryStep3ValidationRule.java index 51d3a4982..c60eb806a 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RegistryStep3ValidationRule.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/validation/RegistryStep3ValidationRule.java @@ -2,16 +2,14 @@ package ru.spcex.clearing.service.validation; import java.util.Map; import java.util.Optional; -import java.util.function.Supplier; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.relation.Relation; -import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; -import ru.clearing.platform.dictionary.SectionDictionary; import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.platform.enumeration.Section; import ru.spcex.platform.enumeration.ServiceStatus; import ru.spcex.platform.enumeration.WorkflowStatus; import ru.spcex.platform.imdg.api.Imdg; @@ -25,32 +23,35 @@ public enum RegistryStep3ValidationRule implements IValidationRule validate(ImdgValidationContext context) { Registry validatedObject = context.getValidatedObject(); - Supplier sectionFind = () -> { - Imdg sessionImdg = context.obtainMap(IMDGDistributedNames.Map_Session, Session.class); - Imdg sectionDictionaryImdg = context.obtainMap(IMDGDistributedNames.Map_SectionDictionary, SectionDictionary.class); - Session session = sessionImdg.getSingleObjectByID(validatedObject.getSessionId()); - if (session == null) { - return "null"; - } else { - SectionDictionary section = sectionDictionaryImdg.getFirstObjectBySQL("code ='" + session.getSection() + "'"); - if (section == null) { - return "null"; - } else { - return section.getName(); - } - } - }; +// Supplier sectionFind = () -> { +// Imdg sessionImdg = context.obtainMap(IMDGDistributedNames.Map_Session, Session.class); +// Imdg sectionDictionaryImdg = context.obtainMap(IMDGDistributedNames.Map_SectionDictionary, SectionDictionary.class); +// Session session = sessionImdg.getSingleObjectByID(validatedObject.getSessionId()); +// if (session == null) { +// return "null"; +// } else { +// SectionDictionary section = sectionDictionaryImdg.getFirstObjectBySQL("code ='" + session.getSection() + "'"); +// if (section == null) { +// return "null"; +// } else { +// return section.getName(); +// } +// } +// }; if (validatedObject.getCompanyId() == null) { - return of(ClearingError.ClearingUnavailableForCompany, sectionFind.get()); + return of(ClearingError.ClearingUnavailableForCompany, validatedObject.getSection()); } Imdg relationImdg = context.obtainMap(IMDGDistributedNames.Map_Relation, Relation.class); - Imdg sessionImdg = context.obtainMap(IMDGDistributedNames.Map_Session, Session.class); - Session activeSession = sessionImdg.getSingleObjectByID(validatedObject.getSessionId()); + String section = validatedObject.getSection(); + Section sctn = IEnumKey.getEnumByKey(Section.class, validatedObject.getSection()); + if (Section.CURR.equals(sctn)) { + section = Section.MKR.getKey(); + } Relation relation = relationImdg.getFirstObjectByFieldValues(Map.of( "consumerId", validatedObject.getCompanyId(), - "service", activeSession.getSection())); + "service", section)); if (relation == null || (!ServiceStatus.Active.equalsByKey(relation.getServiceStatus()) && !ServiceStatus.Reopened.equalsByKey(relation.getServiceStatus()))) { - return of(ClearingError.ClearingUnavailableForCompany, sectionFind.get(), validatedObject.getCompanyId()); + return of(ClearingError.ClearingUnavailableForCompany, validatedObject.getSection(), validatedObject.getCompanyId()); } context.storeObject(RegistryValidationStored.Relation, relation); return empty(); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java index c342ddee4..d18415d74 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java @@ -38,6 +38,7 @@ public class SessionManager { private final IntermediateMkrSession intermediateMkrSession; private final FinalMkrSession finalMkrSession; private final ReturnDepositSession returnDepositSession; + private final UnitedSession unitedSession; private final TradingTimeService time; public SessionManager(ImdgProvider imdgProvider, @@ -45,7 +46,7 @@ public class SessionManager { PrimaryAuctionBnSession primaryAuctionBnSession, PrimaryAuctionB0Session primaryAuctionB0Session, SecondaryAuctionT0Session secondaryAuctionT0Session, CurrencySession currencySession, - IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, ReturnDepositSession returnDepositSession, TradingTimeService time) { + IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, ReturnDepositSession returnDepositSession, UnitedSession unitedSession, TradingTimeService time) { this.notification = notification; this.msgs = msgs; this.primaryAuctionT0Session = primaryAuctionT0Session; @@ -58,6 +59,7 @@ public class SessionManager { this.returnDepositSession = returnDepositSession; sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); + this.unitedSession = unitedSession; this.time = time; } @@ -118,6 +120,7 @@ public class SessionManager { case MEDM -> session = intermediateMkrSession; case FINL -> session = finalMkrSession; case XDEP -> session = returnDepositSession; + case UNIT -> session = unitedSession; } return session; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java index bf683b8d8..da90680de 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/TaskType.java @@ -9,6 +9,7 @@ public enum TaskType implements IEnumKey { StartRevise("CLR0"), ContinueRevise("CLR 0_0"), StartRevisePart1("С0_1"), + SDF51("SDF51"), /** * step 1 diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/UnitedSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/UnitedSession.java new file mode 100644 index 000000000..a6372e482 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/UnitedSession.java @@ -0,0 +1,338 @@ +package ru.spcex.clearing.session.stage; + +import java.time.Instant; +import java.time.LocalDate; +import java.util.List; +import java.util.function.Supplier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.ObjectFactory; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.execution.ExecutionFond; +import ru.clearing.classes.statics.data.misc.Session; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.session.stage.impl.BalanceRevise; +import ru.spcex.clearing.session.stage.impl.DealsPrepare; +import ru.spcex.clearing.session.stage.impl.EndStageNotification; +import ru.spcex.clearing.session.stage.impl.FinishingSession; +import ru.spcex.clearing.session.stage.impl.FormingPaymentInstructionAssets; +import ru.spcex.clearing.session.stage.impl.FormingRegistersOnOS; +import ru.spcex.clearing.session.stage.impl.InclusionObligations; +import ru.spcex.clearing.session.stage.impl.InspectionObligations; +import ru.spcex.clearing.session.stage.impl.InspectionObligationsDepositReturn; +import ru.spcex.clearing.session.stage.impl.ObligationAdmission; +import ru.spcex.clearing.session.stage.impl.PaymentInfo; +import ru.spcex.clearing.session.stage.impl.RequirementsAndObligationCreationCompound; +import ru.spcex.clearing.session.stage.impl.UnlockResources; +import ru.spcex.clearing.session.stage.impl.compound.CompoundStageDealsPrepare; +import ru.spcex.clearing.session.stage.monitor.SessionMonitor; +import ru.spcex.clearing.session.stage.monitor.SessionMonitorFactory; +import ru.spcex.clearing.session.stage.task.DealsPreparePayload; +import ru.spcex.clearing.session.stage.task.FinishingSessionPayload; +import ru.spcex.clearing.session.stage.task.FormingPaymentInstructionPayload; +import ru.spcex.clearing.session.stage.task.FormingRegistersOnOSPayload; +import ru.spcex.clearing.session.stage.task.InclusionToPoolPayload; +import ru.spcex.clearing.session.stage.task.InspectionPoolPayload; +import ru.spcex.clearing.session.stage.task.RequirementsAndObligationCreationCompoundPayload; +import ru.spcex.clearing.session.stage.task.result.DealsPrepareCompoundResult; +import ru.spcex.platform.classes.base.interfaces.ExecutionType; +import ru.spcex.platform.enumeration.Section; +import ru.spcex.platform.enumeration.SessionStatus; +import ru.spcex.platform.enumeration.SessionType; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; +import ru.spcex.platform.utils.enumeration.IMessageResolver; + +@Service +//todo эта сессия +public class UnitedSession extends AbstractSession implements InitializingBean { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final BalanceRevise balanceRevise; + private final DealsPrepare dealsPrepareCurrency; + private final DealsPrepare dealsPrepareTRDT; + private final DealsPrepare dealsPrepareFinal; + private final RequirementsAndObligationCreationCompound requirementsAndObligationCreation; + private final ObligationAdmission obligationsAdmission; + + private final InclusionObligations inclusionObligations; + private final InspectionObligationsDepositReturn inspectionObligationsReturn; + private final InspectionObligations inspectionObligations; + + private final FormingRegistersOnOS formingRegistersOnOS; + private final FormingPaymentInstructionAssets formingPaymentInstructionAssets; + private final UnlockResources unlockResources; + private final FinishingSession finishingSession; + private final EndStageNotification endStageNotification; + + private final Imdg executionFondImdg; + private final Supplier> marketCodesTrdt; + private final Supplier> marketCodesCurr; + private SessionMonitor firstReviseMonitor; + private SessionMonitor afterPaymentsSdf4And13Monitor; + private SessionMonitor afterPaymentsReviseMonitor; + private SessionMonitor afterReviseErrorMonitor; + + + public UnitedSession( + ImdgProvider imdgProvider, + BalanceRevise balanceRevise, + ObjectFactory deals, + RequirementsAndObligationCreationCompound requirementsAndObligationCreation, + ObligationAdmission obligationsAdmission, + InclusionObligations inclusionObligations, InspectionObligationsDepositReturn inspectionObligationsReturn, + FormingRegistersOnOS formingRegistersOnOS, + FormingPaymentInstructionAssets formingPaymentInstructionAssets, + UnlockResources unlockResources, + FinishingSession finishingSession, + EndStageNotification endStageNotification, + IMessageResolver messageResolver, + InspectionObligations inspectionObligations, + @Qualifier("marketCodesForCurr") Supplier> marketCodesCurr, + @Qualifier("marketCodesForT0") Supplier> marketCodesTrdt) { + super(imdgProvider, messageResolver); + this.balanceRevise = balanceRevise; + this.dealsPrepareCurrency = deals.getObject(); + this.dealsPrepareTRDT = deals.getObject(); + this.dealsPrepareFinal = deals.getObject(); + this.requirementsAndObligationCreation = requirementsAndObligationCreation; + this.obligationsAdmission = obligationsAdmission; + this.inclusionObligations = inclusionObligations; + this.inspectionObligationsReturn = inspectionObligationsReturn; + this.formingRegistersOnOS = formingRegistersOnOS; + this.formingPaymentInstructionAssets = formingPaymentInstructionAssets; + this.unlockResources = unlockResources; + this.finishingSession = finishingSession; + this.endStageNotification = endStageNotification; + this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class); + this.inspectionObligations = inspectionObligations; + this.marketCodesTrdt = marketCodesTrdt; + this.marketCodesCurr = marketCodesCurr; + } + + @Override + public void afterPropertiesSet() throws Exception { + { + dealsPrepareCurrency.searchForExecutions(ExecutionType.ExecutionCurrency); + ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder(); + dealsPrepareCurrency.addExecutionFondCondition(pb.regex("settlementCode", "^T0.*$")); + dealsPrepareCurrency.addExecutionFondCondition(pb.in("market", marketCodesCurr.get().toArray(new String[0]))); + + dealsPrepareTRDT.searchForExecutions(ExecutionType.ExecutionFond); + ImdgPredicateBuilder execFondPb = executionFondImdg.predicateBuilder(); + dealsPrepareTRDT.addExecutionFondCondition(execFondPb.regex("settlementCode", "^T0.*$")); + dealsPrepareTRDT.addExecutionFondCondition(execFondPb.in("market", marketCodesTrdt.get().toArray(new String[0]))); + + dealsPrepareFinal.searchForExecutions(ExecutionType.ExecutionDeposit); + dealsPrepareFinal.addExecutionDepositCondition(pb.regex("firstLegSettlementCode", "^T0.*$")); + } + //1 шаг deals prepare вызываем 3 раза с разными параметрами объединяемых сессий + inclusionObligations.setSessionType(sessionType()); + inspectionObligationsReturn.setSessionType(sessionType()); + inspectionObligations.setSection(section()); + inspectionObligations.setSessionType(sessionType()); + formingPaymentInstructionAssets.setSessionType(sessionType()); + finishingSession.setSection(section()); + finishingSession.setSessionType(sessionType()); + imdgProvider.waitAvailable(); + initSessionIfPresent(); + } + + @Override + public void runSession(BaseRequest req) { + if (!startSession()) { + return; + } + StageResult submit = balanceRevise.submit(new Task<>(TaskType.StartRevise, null)); + if (!submit.success) { + log.error("stage {} error={}", balanceRevise.getClass().getSimpleName(), messageResolver.resolve(submit.error)); + endSession(); + } else { + log.info("stage BalanceRevise success, waiting for a response from kafka"); + this.firstReviseMonitor = SessionMonitorFactory.waitRevise(); + } + } + + public void continueSession(BaseRequest req) { + try { + if (!isRunning()) { + return; + } + log.info("session is running, stage {}, monitors: {}", + currStage.get(), + logMonitors(firstReviseMonitor, afterPaymentsSdf4And13Monitor, afterPaymentsReviseMonitor)); + if (firstReviseMonitor != null && isMonitorPassed(firstReviseMonitor, req.getRequestPayload())) { + firstReviseMonitor = null; + firstPart(); + return; + } + if (afterPaymentsSdf4And13Monitor != null && isMonitorPassed(afterPaymentsSdf4And13Monitor, req.getRequestPayload())) { + afterPaymentsSdf4And13Monitor = null; + checkStageAndThrow(TaskType.FormingPaymentInstruction); + finishPart(); + return; + } + if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) { + afterReviseErrorMonitor = null; + finishPart(); + return; + } + //if (afterPaymentsReviseMonitor != null && isMonitorPassed(afterPaymentsReviseMonitor, req.getRequestPayload())) { + // afterPaymentsReviseMonitor = null; + // finishPart(); + //} + } catch (StageException e) { + //already logged + } + } + + private void firstPart() { + try { + if (!checkStage(TaskType.StartRevise)) { + log.error("cannot continue session, current stage is {}", currStage.get()); + throw new StageException(); + } + runStage(TaskType.StartRevisePart1, currSession.getId(), balanceRevise); + //stage 1 + StageResult dealsPreparationResult; + { + DealsPreparePayload payload = new DealsPreparePayload(); + payload.setSessionId(currSession.getId()); + dealsPreparationResult = runStage(TaskType.DealsPrepare, payload, new CompoundStageDealsPrepare( + dealsPrepareTRDT, dealsPrepareCurrency, dealsPrepareFinal + )); + } + + //stage 2 + { + RequirementsAndObligationCreationCompoundPayload p; + p = RequirementsAndObligationCreationCompoundPayload.create(dealsPreparationResult.getStageResult()); + runStage(TaskType.RequirementsAndObligationsCreate, p, requirementsAndObligationCreation); + } + + //stage 3 + runStage(TaskType.ObligationsAdmission, currSession.getId(), obligationsAdmission); + //stage 4 + { + InclusionToPoolPayload inclusionToPoolPayload = new InclusionToPoolPayload(); + inclusionToPoolPayload.setSessionType(currSession.getSessionType()); + inclusionToPoolPayload.setSessionId(currSession.getId()); + runStage(TaskType.InclusionToPool, inclusionToPoolPayload, inclusionObligations); + } + { + InspectionPoolPayload companyIdPayload = new InspectionPoolPayload(); + companyIdPayload.setSessionId(currSession.getId()); + companyIdPayload.setProcessedCompanyId(currSession.getCompanyId()); + //fixme checks inside the stages + //runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligationsReturn); + runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligations); + } + + //stage 6 + { + FormingRegistersOnOSPayload payload = new FormingRegistersOnOSPayload(); + payload.setSessionId(currSession.getId()); + runStage(TaskType.FormingRegistersOnOS, payload, formingRegistersOnOS); //returns Collection + } + //stage 7 + StageResult paymentResult = null; + { + FormingPaymentInstructionPayload payload = new FormingPaymentInstructionPayload(); + payload.setSessionId(currSession.getId()); + paymentResult = runStage(TaskType.FormingPaymentInstruction, payload, formingPaymentInstructionAssets); + } + if (paymentResult.getStageResult().getPaymentInstructions().isEmpty()) { + log.info("no payment instructions were created"); + finishPart(); + } else { + this.afterPaymentsSdf4And13Monitor = SessionMonitorFactory.waitStep7Unit( + paymentResult.getStageResult().getSdfTypes() + ); + log.info("created {} PaymentInstructions, waiting for {}", + paymentResult.getStageResult().getPaymentInstructions().size(), + this.afterPaymentsSdf4And13Monitor.allConditions()); + } + } catch (StageException e) { + //already logged + } + } + + public void finishPart() { + try { + //stage 9 continue revision + { + StageResult reviseRes = runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise, false); + if (!reviseRes.isSuccess()) { + this.afterReviseErrorMonitor = SessionMonitorFactory.waitReviseError(section()); + log.warn("{} stage error, created monitor for {}", + TaskType.AgainRevise, + afterReviseErrorMonitor.allConditions()); + return; + } + } + //stage 10 + { + FinishingSessionPayload payload = new FinishingSessionPayload(); + payload.setSessionId(currSession.getId()); + payload.setPr("1"); + runStage(TaskType.FinishingSession, payload, finishingSession); + } + //stage 11 + { + //Убрал этот шаг по требованию Насти, 18.06.2024 + //выпадало на строчке EndStageNotification:101 + // throw new IllegalArgumentException("Unsupported section " + section); +// EndStageNotificationPayload payload = new EndStageNotificationPayload(); +// payload.setSection(currSession.getSection()); +// payload.setSessionId(currSession.getId()); +// runStage(TaskType.EndStageNotification, payload, endStageNotification); + endSession(); + } + } catch (StageException e) { + //already logged + } + } + + private void sendSdf56() { + runStage(TaskType.FormingPaymentInstruction, balanceRevise); + this.afterPaymentsReviseMonitor = SessionMonitorFactory.waitRevise(); + } + + private boolean startSession() { + synchronized (this.currStage) { + if (this.currStage.get() != null) { + log.info("already running session.id={}", this.currSession.getId()); + return false; + } else { + TaskType startStatus = TaskType.StartRevise; + Session newSession = new Session(); + newSession.setSection(section().getKey()); + newSession.setSessionType(sessionType().getKey()); + newSession.setSessionStatus(startStatus.getKey()); + newSession.setWorkflowStatus(SessionStatus.ACTV.getKey()); + newSession.setClearingDate(LocalDate.now()); + newSession.setCreated(Instant.now()); + + //todo companyId/securityId/userId передается из сообщения очереди + sessionImdg.insert(newSession); + currSession = newSession; + log.info("started new session.id={}", this.currSession.getId()); + currStage.set(TaskType.StartRevise); + return true; + } + } + } + + @Override + protected Section section() { + return Section.MULT; + } + + @Override + protected SessionType sessionType() { + return SessionType.UNIT; + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java index e8b96a180..00ef7bc5b 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/BalanceRevise.java @@ -77,6 +77,9 @@ public class BalanceRevise implements ISessionStage { @Override public StageResult submit(Task task) { switch (task.getTaskType()) { + case SDF51 -> { + return sendSdfs51(); + } case StartRevise, FormingPaymentInstruction -> { LocalTime fromTime = null; if (task.getData() instanceof LocalTime) { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java index 8f9a4ba56..e703eddfd 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FinishingSession.java @@ -2,7 +2,9 @@ package ru.spcex.clearing.session.stage.impl; import java.time.Instant; import java.time.LocalDate; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -33,6 +35,7 @@ import ru.spcex.clearing.session.stage.ISessionStage; import ru.spcex.clearing.session.stage.StageResult; import ru.spcex.clearing.session.stage.Task; import ru.spcex.clearing.session.stage.task.FinishingSessionPayload; +import ru.spcex.platform.classes.base.interfaces.ExecutionType; import ru.spcex.platform.enumeration.CoverageStatus; import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryStatus; @@ -146,7 +149,7 @@ public class FinishingSession implements ISessionStage { int allowed = 0; int notAllowed = 0; SessionType sessionType = getEnumByKey(SessionType.class, session.getSessionType()); - if (IEnumKey.contains(sessionType, SessionType.FINL, SessionType.MEDM)) { + if (IEnumKey.contains(sessionType, SessionType.FINL, SessionType.MEDM, SessionType.UNIT)) { Collection executions = findExecutionDepositBySessionId(sessionId); log.trace("loaded {} ExecutionDeposits for sessionId {}", executions.size(), sessionId); for (ExecutionDeposit execution : executions) { @@ -171,7 +174,8 @@ public class FinishingSession implements ISessionStage { allowed, notAllowed, executions.size() - (allowed + notAllowed)); - } else if (IEnumKey.contains(sessionType, SessionType.CURR, SessionType.TRDT, SessionType.IPOB, SessionType.IPO0, SessionType.IPOT)) { + } + if (IEnumKey.contains(sessionType, SessionType.CURR, SessionType.TRDT, SessionType.IPOB, SessionType.IPO0, SessionType.IPOT, SessionType.UNIT)) { Collection executions = findExecutionFondBySessionId(sessionId, sessionType); log.trace("loaded {} Executions for sessionId {}", executions.size(), sessionId); for (ExecutionCommon execution : executions) { @@ -188,7 +192,7 @@ public class FinishingSession implements ISessionStage { } execution.setCoverageStatus(toStatus.getKey()); execution.setUpdated(Instant.now()); - if (sessionType.equals(SessionType.CURR)) { + if (execution.type().equals(ExecutionType.ExecutionCurrency)) { executionCurrencyImdg.update((ExecutionCurrency) execution); } else { executionFondImdg.update((ExecutionFond) execution); @@ -226,7 +230,7 @@ public class FinishingSession implements ISessionStage { } } sdf05Sender.sendSdf05(pr); - if (Section.FOND.equals(section)) { + if (Section.FOND.equals(section) || Section.MULT.equals(section)) { sdf14Sender.sendSdf14(sessionId); } StageResult> res = new StageResult<>(null, true); @@ -310,16 +314,29 @@ public class FinishingSession implements ISessionStage { } protected Collection findExecutionFondBySessionId(Long sessionId, SessionType sessionType) { - Imdg excImdg; - if (sessionType.equals(SessionType.CURR)) { - excImdg = executionCurrencyImdg; + if (sessionType.equals(SessionType.UNIT)) { + List res = new ArrayList<>(); + res.addAll(findExecutionFondBySessionId(sessionId, executionCurrencyImdg)); + res.addAll(findExecutionFondBySessionId(sessionId, executionFondImdg)); + return res; } else { - excImdg = executionFondImdg; + Imdg excImdg; + if (sessionType.equals(SessionType.CURR)) { + excImdg = executionCurrencyImdg; + } else { + excImdg = executionFondImdg; + } + return findExecutionFondBySessionId(sessionId, excImdg); } + } + + protected Collection findExecutionFondBySessionId( + Long sessionId, + Imdg excImdg) { ImdgPredicateBuilder pb = excImdg.predicateBuilder(); ImdgPredicate prdct = pb.or( - pb.equals("sessionId", sessionId), - pb.equals("settlementDate", LocalDate.now()) + pb.equals("sessionId", sessionId), + pb.equals("settlementDate", LocalDate.now()) ); Collection result = excImdg.getCollectionObjectsByPredicate(prdct) .stream() diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java index e59bdab46..efa48f3cd 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java @@ -47,9 +47,11 @@ import ru.spcex.clearing.session.stage.util.RegistryUtil; import ru.spcex.platform.enumeration.AccountStatus; import ru.spcex.platform.enumeration.AccountType; import ru.spcex.platform.enumeration.Allowed; +import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.enumeration.InstrumentType; import ru.spcex.platform.enumeration.OperationStatus; import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryStatus; import static ru.spcex.platform.enumeration.RegistryTradingParams.*; import ru.spcex.platform.enumeration.RegistryUnit; @@ -161,7 +163,7 @@ public class FormingPaymentInstructionAssets implements ISessionStage { private StageResult formingPaymentInstructions(FormingPaymentInstructionPayload payload) { Long sessionId = payload.getSessionId(); - if (SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType)) { + if (SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType) || SessionType.UNIT.equals(sessionType)) { dmvSrv.createDmv(sessionId); } Collection AMBregistries = selectAMBRegistries(sessionId); @@ -252,7 +254,7 @@ public class FormingPaymentInstructionAssets implements ISessionStage { .debitLegAccount(debitLegAccount) .creditLegAccount(creditLegAccount) .amount(amount) - .currency(SessionType.CURR.equals(sessionType) ? registry.getSecuritySymbol() : null) + .currency(registry.getSecuritySymbol()) .sessionId(sessionId) .checkBLKD((SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType)) && !isPositiveBalance ? registry : null) @@ -325,7 +327,8 @@ public class FormingPaymentInstructionAssets implements ISessionStage { .creditLegAccount(creditLegAccount) .amount(amount) .sessionId(sessionId) - .currency(SessionType.CURR.equals(sessionType) ? registry.getSecuritySymbol() : null) + .currency(SessionType.CURR.equals(sessionType) || Section.CURR.equalsByKey(registry.getSection()) + ? registry.getSecuritySymbol() : null) .purpose(String.format("Перевод по итогу клиринга по ТКР %s", registry.getTradingClearingRegistry())); PaymentInstruction paymentInstruction = paymentInstructionBuilder.build(); log.debug("Created paymentInstruction by registry.id: {}", registry.getId()); @@ -353,6 +356,7 @@ public class FormingPaymentInstructionAssets implements ISessionStage { } private BigDecimal adjustAmountByReturns(Registry amb, Long sessionId) {//companyid, tcr/account, sessionId, RUB + if (SessionType.UNIT.equals(sessionType)) return BigDecimal.ZERO; Long companyId = amb.getCompanyId(); Long tradingClearingRegistryId = amb.getTradingClearingRegistryId(); ImdgPredicateBuilder pb = registryImdg.predicateBuilder(); @@ -399,10 +403,13 @@ public class FormingPaymentInstructionAssets implements ISessionStage { List sDf12Created = new ArrayList<>(); for (Pair pair : formedPaymentInstructions) { PaymentInstruction paymentInstruction = pair.getFirst(); + Registry rgs = pair.getSecond(); Account account = accountImdg.getSingleObjectByID(paymentInstruction.getCreditLeg_accountId()); Security security = securityImdg.getSingleObjectByID(paymentInstruction.getCreditLeg_securityId()); - if (SessionType.CURR.equals(sessionType)) { - boolean madeStatements = createStatementsIfNeeded(paymentInstruction, pair.getSecond()); + if (SessionType.CURR.equals(sessionType) || (rgs != null + && RegistryInstrumentType.M.equalsByKey(rgs.getRegistryInstrumentType()) + && !CurrencyCode.isRub(rgs.getSecuritySymbol()))) { + boolean madeStatements = statementsWereMade(paymentInstruction, rgs); if (madeStatements) { continue; } @@ -485,16 +492,20 @@ public class FormingPaymentInstructionAssets implements ISessionStage { return sDf12; } - private boolean createStatementsIfNeeded(PaymentInstruction pmt, Registry am_b) { + private boolean statementsWereMade(PaymentInstruction pmt, Registry am_b) { ImdgPredicateBuilder pb = stlmHPropsImdg.predicateBuilder(); String curCode = pmt.getCreditLeg_currencyCode(); - boolean noNeedForStatements = stlmHPropsImdg.getFirstObjectByPredicate( - pb.and( - pb.in("currencyCode", curCode), - pb.equals("companyId", Sender.Prc.getId()) - ) - ) != null; - if (noNeedForStatements) return false; + { + SettlementHouseProperties sttHs = stlmHPropsImdg.getFirstObjectByPredicate( + pb.and( + pb.in("currencyCode", curCode), + pb.equals("companyId", Sender.Prc.getId()) + ) + ); + if (sttHs != null) { + return false; + } + } Supplier stmtBldr = () -> { Statement stmt = new Statement(); stmt.setSenderId(Sender.One.getId()); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java index 2c9085cef..c2714baa9 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionDepositReturn.java @@ -171,8 +171,8 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { .cm_t(cm_t) .tranAcc(tranAcc) .sessionId(sessionId) - .paymentPurposeLmt("Возврат депозита " + lm_t.getContract() + " по ТКР " + lm_t.getTradingClearingRegistry()) - .paymentPurpose("Возврат депозита " + cm_t.getContract() + " по ТКР " + cm_t.getTradingClearingRegistry()) + .paymentPurposeLmt("Возврат депозита " + lm_t.getContract() + " по ТКР " + lm_t.getTradingClearingRegistry() + " по итогу клиринга") + .paymentPurpose("Возврат депозита " + cm_t.getContract() + " по ТКР " + cm_t.getTradingClearingRegistry() + " по итогу клиринга") .currency(lm_t.getSecuritySymbol()) .build(); Pair.forEach(pmts, paymentInstructionImdg::insert); @@ -231,8 +231,8 @@ public class FormingPaymentInstructionDepositReturn implements ISessionStage { .cm_t(cm_t) .tranAcc(tranAcc) .sessionId(sessionId) - .paymentPurpose("Возврат депозита " + cm_t.getContract() + " по ТКР " + cm_t.getTradingClearingRegistry()) - .paymentPurposeLmt("Возврат депозита " + lm_t.getContract() + " по ТКР " + lm_t.getTradingClearingRegistry()) + .paymentPurpose("Возврат депозита " + cm_t.getContract() + " по ТКР " + cm_t.getTradingClearingRegistry() + " по итогу клиринга") + .paymentPurposeLmt("Возврат депозита " + lm_t.getContract() + " по ТКР " + lm_t.getTradingClearingRegistry() + " по итогу клиринга") .currency(lm_t.getSecuritySymbol()) .build(); Pair.forEach(pmts, paymentInstructionImdg::insert); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java index 75b40ceee..7ed8bec5f 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionReturnMkr.java @@ -204,8 +204,8 @@ public class FormingPaymentInstructionReturnMkr implements ISessionStage { .cm_t(cm_t) .tranAcc(tranAcc) .sessionId(sessionId) - .paymentPurpose("Возврат депозита " + cm_t.getContract() + " по ТКР " + cm_t.getTradingClearingRegistry()) - .paymentPurposeLmt("Возврат депозита " + lm_t.getContract() + " по ТКР " + lm_t.getTradingClearingRegistry()) + .paymentPurpose("Возврат депозита " + cm_t.getContract() + " по ТКР " + cm_t.getTradingClearingRegistry() + " по итогу клиринга") + .paymentPurposeLmt("Возврат депозита " + lm_t.getContract() + " по ТКР " + lm_t.getTradingClearingRegistry() + " по итогу клиринга") .currency(lm_t.getSecuritySymbol()) .build(); Pair.forEach(pmts, paymentInstructionImdg::insert); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java index 1d6eba81d..877044b98 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InclusionObligations.java @@ -30,6 +30,7 @@ import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryStatus; import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.enumeration.Section; import ru.spcex.platform.enumeration.SessionType; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; @@ -37,6 +38,7 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.utils.enumeration.IEnumKey; +import ru.spcex.platform.utils.text.TextUtil; @Service @@ -115,6 +117,7 @@ public class InclusionObligations implements ISessionStage { } else { registryPredicate = prdctBuilder.and( defaultCondition, + SessionType.UNIT.equals(sessionType) ? prdctBuilder.equals("sessionId", sessionId) : prdctBuilder.alwaysTrue(), prdctBuilder.equals("registryStatus", RegistryStatus.PROC.getKey()) ); } @@ -126,33 +129,46 @@ public class InclusionObligations implements ISessionStage { for (Map.Entry> entrySet : registryByGroupId.entrySet()) { log.debug("Processing set of registry with groupId: {}", entrySet.getKey()); + String rgsSection = null; for (Registry registry : entrySet.getValue()) { registry.setRegistryStatus(RegistryStatus.POOL.getKey()); registry.setClearingDate(LocalDate.now()); registry.setSessionId(sessionId); obtainSessionType(sessionId).ifPresent(st -> registry.setSessionType(st.getKey())); registryImdg.update(registry); - updateExecutions(sessionId, entrySet.getKey()); + if (TextUtil.isEmpty(rgsSection)) { + rgsSection = registry.getSection(); + } } + updateExecutions(sessionId, entrySet.getKey(), rgsSection); } return new StageResult(null, true); } @SuppressWarnings("unchecked") - private void updateExecutions(Long sessionId, Long rgsGroupId) { + private void updateExecutions(Long sessionId, Long rgsGroupId, String rgsSection) { Instant now = Instant.now(); SessionType ssnTpe = obtainSessionType(sessionId).orElse(null); if (ssnTpe == null || sessionId == null) { log.debug("will not update executions#sessionId - couldn't determine session type"); return; } - Imdg execImdg; + Imdg execImdg = null; switch (ssnTpe) { case MEDM, FINL, XDEP -> execImdg = (Imdg) executionDepositImdg; case IPO0, IPOB, TRDT, IPOT -> execImdg = (Imdg) executionFondImdg; case CURR -> execImdg = (Imdg) executionCurrImdg; - default -> execImdg = null; + default -> { + //кейс для "общих" сессий (напр. UNIT) в которых сочетаются разные сделки + //смотрим на секцию регистра. + Section section; + if ((section = IEnumKey.getEnumByKey(Section.class, rgsSection)) != null) { + if (section.equals(Section.MKR)) execImdg = (Imdg) executionDepositImdg; + else if (section.equals(Section.FOND)) execImdg = (Imdg) executionFondImdg; + else if (section.equals(Section.CURR)) execImdg = (Imdg) executionCurrImdg; + } + } } if (execImdg == null) { log.warn("couldn't define Execution Type for session {}. Will not update executions#sessionId", @@ -162,10 +178,11 @@ public class InclusionObligations implements ISessionStage { ImdgPredicateBuilder pb = execImdg.predicateBuilder(); ImdgPredicate prdct = pb.equals("exchangeExecutionId", rgsGroupId); Collection execs = execImdg.getCollectionObjectsByPredicate(prdct); + Imdg finalExecImdg = execImdg; execs.forEach(e -> { e.setUpdated(now); e.setSessionId(sessionId); - execImdg.update(e); + finalExecImdg.update(e); }); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java index f919c7773..81d73d088 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligations.java @@ -107,7 +107,19 @@ public class InspectionObligations implements ISessionStage { collect(Collectors.groupingBy(Registry::getGroupId)) .entrySet() .stream() - .sorted(Map.Entry.comparingByKey()) + .sorted((entry1, entry2) -> { + long minId1 = entry1.getValue().stream() + .mapToLong(Registry::getId) + .min() + .orElse(Long.MIN_VALUE); + + long minId2 = entry2.getValue().stream() + .mapToLong(Registry::getId) + .min() + .orElse(Long.MIN_VALUE); + + return Long.compare(minId1, minId2); + }) .toList(); log.info("found {} ({} groups) registries by sql: {}", registriesToProcess.size(), registriesByGroupSorted.size(), sqlCondition); @@ -123,7 +135,7 @@ public class InspectionObligations implements ISessionStage { boolean isUncovered = false; List checkResults = new ArrayList<>(); for (Registry obligation : obligationsInGroup) { - if ((SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType)) && RegistryInstrumentType.S.equalsByKey(obligation.getRegistryInstrumentType())) { + if ((SessionType.FINL.equals(sessionType) || SessionType.UNIT.equals(sessionType) || SessionType.MEDM.equals(sessionType)) && RegistryInstrumentType.S.equalsByKey(obligation.getRegistryInstrumentType())) { checkResults.add(new CheckResult(obligation, false)); continue; } @@ -156,7 +168,7 @@ public class InspectionObligations implements ISessionStage { failGroup.run(); continue; } - if (Section.MKR.equals(section) && mOrS.equals(RegistryInstrumentType.S)) { + if (Section.MKR.equalsByKey(rgs.getSection()) && mOrS.equals(RegistryInstrumentType.S)) { continue; } Optional a__t = assets.searchByTcrCompanyAccount(rgs, A__T.type(mOrS)); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java index e1f7f8c7f..511a7400c 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/InspectionObligationsDepositReturn.java @@ -1,5 +1,12 @@ package ru.spcex.clearing.session.stage.impl; +import java.math.BigDecimal; +import java.time.Instant; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.BiConsumer; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -18,21 +25,19 @@ import ru.spcex.clearing.session.stage.ISessionStage; import ru.spcex.clearing.session.stage.StageResult; import ru.spcex.clearing.session.stage.Task; import ru.spcex.clearing.session.stage.task.InspectionPoolPayload; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.ClearingCategory; +import ru.spcex.platform.enumeration.RegistryCapacity; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryInstrumentType; +import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.enumeration.RegistryTradingParams; +import static ru.spcex.platform.enumeration.RegistryTradingParams.*; +import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.enumeration.SessionType; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.utils.enumeration.IEnumKey; - -import java.math.BigDecimal; -import java.time.Instant; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.BiConsumer; -import java.util.stream.Collectors; - -import static ru.spcex.platform.enumeration.RegistryTradingParams.*; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; @@ -205,7 +210,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage { } } - if (SessionType.FINL.equals(sessionType) + if ((SessionType.FINL.equals(sessionType) || SessionType.UNIT.equals(sessionType)) && amfBalance.compareTo(omtBalance) >= 0 && initiatorV(omtRgs) && gatewayIfNeeded(omtRgs)) { log.debug("OM*T.id={} -> no DM*X/DM*T(INFO/CLRN) registry found. " + @@ -244,10 +249,12 @@ public class InspectionObligationsDepositReturn implements ISessionStage { private Optional searchAssetByOMT(Registry obligation) { String sqlCondition = String.format("%s and " + "tradingClearingRegistryId = '%s' and " + - "companyId = '%s'", + "companyId = '%s' and "+ + "securitySymbol = '%s'", RegistryCodeSqlBuilder.getInstance(AM_F).build(), obligation.getTradingClearingRegistryId(), - obligation.getCompanyId()); + obligation.getCompanyId(), + obligation.getSecuritySymbol()); Registry amf = registryImdg.getFirstObjectBySQL(sqlCondition); return Optional.ofNullable(amf); } @@ -262,7 +269,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage { } private RegistryStatus registryStatusFailed() { - if (SessionType.FINL.equals(sessionType)) { + if (SessionType.FINL.equals(sessionType) || SessionType.UNIT.equals(sessionType)) { return RegistryStatus.FAIL; } else { return RegistryStatus.MNG; @@ -270,7 +277,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage { } private RegistryStatus registryStatusFailed(Registry registry) { - if (SessionType.FINL.equals(sessionType)) { + if (SessionType.FINL.equals(sessionType) || SessionType.UNIT.equals(sessionType)) { if (equalByRgs(OM_T, registry)) { return RegistryStatus.UNCV; } else { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryCurrBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryCurrBuilder.java index 1110d082d..0707a10ff 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryCurrBuilder.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryCurrBuilder.java @@ -33,6 +33,7 @@ import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryStatus; import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.enumeration.Section; import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -195,6 +196,7 @@ public class RegistryCurrBuilder implements IRegistryBuilder { reg.setGroupId(groupId()); reg.setSessionId(exec.getSessionId()); reg.setSessionType(sessionType()); + reg.setSection(Section.CURR.getKey()); return reg; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryDepoBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryDepoBuilder.java index 64900073b..ee02d74da 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryDepoBuilder.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryDepoBuilder.java @@ -1,5 +1,8 @@ package ru.spcex.clearing.session.stage.impl; +import java.time.Instant; +import java.time.LocalDate; +import java.util.Map; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.ClearingAccount; import ru.clearing.classes.statics.data.account.DepoAccount; @@ -15,14 +18,20 @@ import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.session.stage.util.RegistryUtil; import ru.spcex.platform.classes.base.interfaces.ExecutionType; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.BalanceDimension; +import ru.spcex.platform.enumeration.ISide; +import ru.spcex.platform.enumeration.MoneyFlowSide; +import ru.spcex.platform.enumeration.RegistryCapacity; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryInstrumentType; +import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.enumeration.Section; +import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import java.time.Instant; -import java.time.LocalDate; -import java.util.Map; - public class RegistryDepoBuilder implements IRegistryBuilder { private Imdg companyImdg; private Imdg tradingClearingRegistryImdg; @@ -148,6 +157,7 @@ public class RegistryDepoBuilder implements IRegistryBuilder { reg.setGroupId(groupId()); reg.setSessionId(exec.getSessionId()); reg.setSessionType(sessionType()); + reg.setSection(Section.MKR.getKey()); return reg; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryFondBuilder.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryFondBuilder.java index 4703321b4..9a62c75f6 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryFondBuilder.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RegistryFondBuilder.java @@ -1,5 +1,10 @@ package ru.spcex.clearing.session.stage.impl; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.Instant; +import java.time.LocalDate; +import java.util.Map; import ru.clearing.classes.statics.data.account.Account; import ru.clearing.classes.statics.data.account.ClearingAccount; import ru.clearing.classes.statics.data.account.DepoAccount; @@ -16,17 +21,21 @@ import ru.clearing.classes.statics.data.security.Security; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.session.stage.util.RegistryUtil; import ru.spcex.platform.classes.base.interfaces.ExecutionType; -import ru.spcex.platform.enumeration.*; +import ru.spcex.platform.enumeration.AccountType; +import ru.spcex.platform.enumeration.BalanceDimension; +import ru.spcex.platform.enumeration.ISide; +import ru.spcex.platform.enumeration.InstrumentType; +import ru.spcex.platform.enumeration.MoneyFlowSide; +import ru.spcex.platform.enumeration.RegistryCapacity; +import ru.spcex.platform.enumeration.RegistryDesignation; +import ru.spcex.platform.enumeration.RegistryInstrumentType; +import ru.spcex.platform.enumeration.RegistryStatus; +import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.enumeration.Section; +import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.time.Instant; -import java.time.LocalDate; -import java.util.Map; - import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; public class RegistryFondBuilder implements IRegistryBuilder { @@ -103,19 +112,24 @@ public class RegistryFondBuilder implements IRegistryBuilder { if ((regDsgn.equals(RegistryDesignation.O) && side.isBuy()) || (regDsgn.equals(RegistryDesignation.T) && side.isSell())) { isMoney = true; reg.setAccountId(tcr.getMoneyAccountId()); - account = accountImdg.getSingleObjectByID(tcr.getMoneyAccountId()); + if (tcr.getMoneyAccountId() != null) { + account = accountImdg.getSingleObjectByID(tcr.getMoneyAccountId()); + capacityByAccount = defineCapacityByAccountType(account.getAccountType(), tcr.getMoneyAccountId()); + } reg.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); reg.setBalanceDimension(BalanceDimension.MONY.getKey()); //fixme add second leg code branch Currency currency = currencyImdg.getFirstObjectByFieldValues(Map.of("currencyCode", exec.getSettlementCurrency())); reg.setSecurityId(currency.getId()); reg.setSecuritySymbol(currency.getCurrencyCode()); - capacityByAccount = defineCapacityByAccountType(account.getAccountType(), tcr.getMoneyAccountId()); } else if ((regDsgn.equals(RegistryDesignation.T) && side.isBuy()) || (regDsgn.equals(RegistryDesignation.O) && side.isSell())) { isMoney = false; - account = accountImdg.getSingleObjectByID(tcr.getDepoAccountId()); reg.setAccountId(tcr.getDepoAccountId()); - DepoAccount depoAccount = depoAccountImdg.getFirstObjectByFieldValues( + DepoAccount depoAccount = null; + if (tcr.getDepoAccountId() != null) { + account = accountImdg.getSingleObjectByID(tcr.getDepoAccountId()); + depoAccount = depoAccountImdg.getFirstObjectByFieldValues( Map.of("accountId", tcr.getDepoAccountId())); + } if (depoAccount != null) { capacityByAccount = depoAccount.getDepoAccountType(); } @@ -162,6 +176,7 @@ public class RegistryFondBuilder implements IRegistryBuilder { reg.setGroupId(groupId()); reg.setSessionId(exec.getSessionId()); reg.setSessionType(sessionType()); + reg.setSection(Section.FOND.getKey()); return reg; } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java index ee0a51ae4..b84fd9561 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreation.java @@ -1,7 +1,6 @@ package ru.spcex.clearing.session.stage.impl; import java.time.LocalDate; -import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -23,6 +22,8 @@ import ru.spcex.clearing.session.stage.ISessionStage; import ru.spcex.clearing.session.stage.StageResult; import ru.spcex.clearing.session.stage.Task; import ru.spcex.clearing.session.stage.TaskType; +import static ru.spcex.clearing.util.ComparatorUtil.execIdComparator; +import static ru.spcex.clearing.util.ComparatorUtil.tradeTimeComparator; import ru.spcex.platform.classes.base.interfaces.ExecutionType; import ru.spcex.platform.enumeration.ISide; import ru.spcex.platform.enumeration.MoneyFlowSide; @@ -65,8 +66,8 @@ public class RequirementsAndObligationCreation implements ISessionStage { throw new IllegalStateException("Unknown task type: " + task.getTaskType()); } - private StageResult createRegisters(List data) { - data.sort(Comparator.comparing(ExecutionCommon::getExchangeExecutionId)); + protected StageResult createRegisters(List data) { + data.sort(tradeTimeComparator.thenComparing(execIdComparator)); //см. описание к #matchExecutions for (int i = 0; i < data.size(); ) { Pair matched = matchExecutions(data, i); @@ -219,7 +220,7 @@ public class RequirementsAndObligationCreation implements ISessionStage { * если это не так, передалать на коллекцию Long executionId в правильном порядке * и для каждого искать мэтч отдельно в Imdg, с сохранением уже обработанных для избежания дублирования */ - private Pair matchExecutions(List data, int i) { + protected Pair matchExecutions(List data, int i) { //if the last execution, then no match if (i >= data.size() - 1) { return null; diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreationCompound.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreationCompound.java new file mode 100644 index 000000000..af826fb1d --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/RequirementsAndObligationCreationCompound.java @@ -0,0 +1,96 @@ +package ru.spcex.clearing.session.stage.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Stream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.execution.ExecutionCommon; +import ru.spcex.clearing.session.stage.StageResult; +import ru.spcex.clearing.session.stage.Task; +import ru.spcex.clearing.session.stage.TaskType; +import ru.spcex.clearing.session.stage.task.RequirementsAndObligationCreationCompoundPayload; +import static ru.spcex.clearing.util.ComparatorUtil.execIdComparator; +import static ru.spcex.clearing.util.ComparatorUtil.tradeTimeComparator; +import ru.spcex.platform.classes.base.interfaces.ExecutionType; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.collection.Pair; + +/** + * LiabilitiesAndClaims + */ +@Service +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class RequirementsAndObligationCreationCompound extends RequirementsAndObligationCreation { + private final Logger log = LoggerFactory.getLogger(getClass()); + + @Autowired + public RequirementsAndObligationCreationCompound(ImdgProvider imdgProvider) { + super(imdgProvider); + } + + @SuppressWarnings("unchecked") + @Override + public StageResult submit(Task task) { + if (task.getTaskType() == TaskType.RequirementsAndObligationsCreate) { + return mergeReqsAndClaims((RequirementsAndObligationCreationCompoundPayload) task.getData()); + } + throw new IllegalStateException("Unknown task type: " + task.getTaskType()); + } + + + private StageResult mergeReqsAndClaims(RequirementsAndObligationCreationCompoundPayload data) { + List tmpList = new ArrayList<>(Arrays.asList(new ExecutionCommon[2])); + List executionFond = data.getExecutionsTrdt(); + List executionCurrency = data.getExecutionsCurrency(); + List executionDeposit = data.getExecutionsFinal(); + Stream.of(executionFond, executionCurrency, executionDeposit).forEach(c -> c.sort(tradeTimeComparator.thenComparing(execIdComparator))); + + int efs = executionFond.size(); + int eds = executionDeposit.size(); + int ecs = executionCurrency.size(); + + int[] ief= {0}, ied= {0}, iec= {0}; + while (ief[0] < efs || ied[0] < eds || iec[0] < ecs) { + Pair pair = getMinTimeExecutions( + safeMatch(executionFond, ief), + safeMatch(executionDeposit, ied), + safeMatch(executionCurrency, iec) + ); + if (pair == null) continue; + if (pair.getFirst().type().equals(ExecutionType.ExecutionFond)) ief[0] += 2; + if (pair.getFirst().type().equals(ExecutionType.ExecutionDeposit)) ied[0] += 2; + if (pair.getFirst().type().equals(ExecutionType.ExecutionCurrency)) iec[0] += 2; + pair.map(f -> tmpList.set(0, f), s -> tmpList.set(1, s)); + createRegisters(tmpList); + } + + return new StageResult<>(null, true); + } + + private Pair safeMatch(List l, int[] i) { + Pair pair = matchExecutions(l, i[0]); + if (pair == null) { + i[0]++; + return null; + } +// i[0] += 2; + return pair; + } + + private Pair getMinTimeExecutions( + Pair fond, + Pair deposit, + Pair currency) { + + return Stream.of(fond, deposit, currency) + .filter(Objects::nonNull) + .min((p1, p2) -> tradeTimeComparator.compare(p1.getFirst(), p2.getFirst())).orElse(null); + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/compound/CompoundStage.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/compound/CompoundStage.java new file mode 100644 index 000000000..2689066a8 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/compound/CompoundStage.java @@ -0,0 +1,34 @@ +package ru.spcex.clearing.session.stage.impl.compound; + +import java.util.ArrayList; +import java.util.List; +import ru.spcex.clearing.session.stage.ISessionStage; +import ru.spcex.clearing.session.stage.StageResult; +import ru.spcex.clearing.session.stage.Task; + +public abstract class CompoundStage implements ISessionStage { + + private final List stages; + + public CompoundStage(ISessionStage... stages) { + this.stages = new ArrayList<>(); + this.stages.addAll(List.of(stages)); + } + + protected abstract Object mapper(List results); + + @Override + public StageResult submit(Task task) { + List innerResults = new ArrayList<>(); + for (ISessionStage stage : stages) { + StageResult submit = stage.submit(task); + if (!submit.isSuccess()) { + return submit; + } + innerResults.add(submit.getStageResult()); + } + StageResult result = new StageResult<>(null, true); + result.setStageResult(mapper((List) innerResults)); + return result; + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/compound/CompoundStageDealsPrepare.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/compound/CompoundStageDealsPrepare.java new file mode 100644 index 000000000..2ac84dc36 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/compound/CompoundStageDealsPrepare.java @@ -0,0 +1,22 @@ +package ru.spcex.clearing.session.stage.impl.compound; + +import java.util.List; +import ru.clearing.classes.statics.data.execution.ExecutionCommon; +import ru.spcex.clearing.session.stage.impl.DealsPrepare; +import ru.spcex.clearing.session.stage.task.result.DealsPrepareCompoundResult; + +public class CompoundStageDealsPrepare extends CompoundStage> { + + public CompoundStageDealsPrepare(DealsPrepare... stages) { + super(stages); + } + + @Override + protected Object mapper(List> results) { + DealsPrepareCompoundResult res = new DealsPrepareCompoundResult(); + res.setExecutionsTrdt(results.get(0)); + res.setExecutionsCurrency(results.get(1)); + res.setExecutionsFinal(results.get(2)); + return res; + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/monitor/SessionMonitorFactory.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/monitor/SessionMonitorFactory.java index 16ac67947..86d1f5c67 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/monitor/SessionMonitorFactory.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/monitor/SessionMonitorFactory.java @@ -1,5 +1,6 @@ package ru.spcex.clearing.session.stage.monitor; +import java.util.Collection; import ru.spcex.platform.enumeration.SdfTable; import ru.spcex.platform.enumeration.Section; @@ -29,7 +30,7 @@ public class SessionMonitorFactory { .addCondition(new SdfCondition(SdfTable.SDF_01)) .addCondition(new SdfCondition(SdfTable.SDF_57)); } - case FOND -> { + case FOND, MULT -> { return SessionMonitor.create() .addCondition(new SdfCondition(SdfTable.SDF_04)) .addCondition(new SdfCondition(SdfTable.SDF_13)) @@ -42,6 +43,19 @@ public class SessionMonitorFactory { } } + public static SessionMonitor waitStep7Unit(Collection sdfTypes) { + SessionMonitor monitor = SessionMonitor.create() + .addCondition(new SdfCondition(SdfTable.SDF_04)) + .addCondition(new SdfCondition(SdfTable.SDF_01)) + .addCondition(new SdfCondition(SdfTable.SDF_57)); + if (sdfTypes.stream().anyMatch(t -> t.equals(SdfTable.SDF_12))) { + monitor.addCondition(new SdfCondition(SdfTable.SDF_13)); + monitor.addCondition(new SdfCondition(SdfTable.SDF_08)); + monitor.addCondition(new SdfCondition(SdfTable.SDF_21)); + } + return monitor; + } + public static SessionMonitor waitRevise() { return SessionMonitor.create() .addCondition(new SdfCondition(SdfTable.SDF_01)) @@ -56,7 +70,7 @@ public class SessionMonitorFactory { .addCondition(new SdfCondition(SdfTable.SDF_01)) .addCondition(new SdfCondition(SdfTable.SDF_57)); } - case FOND -> { + case FOND, MULT -> { return SessionMonitor.create() .addCondition(new SdfCondition(SdfTable.SDF_08)) .addCondition(new SdfCondition(SdfTable.SDF_21)) diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RequirementsAndObligationCreationCompoundPayload.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RequirementsAndObligationCreationCompoundPayload.java new file mode 100644 index 000000000..184ffab5b --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/RequirementsAndObligationCreationCompoundPayload.java @@ -0,0 +1,43 @@ +package ru.spcex.clearing.session.stage.task; + +import java.util.List; +import ru.clearing.classes.statics.data.execution.ExecutionCommon; +import ru.spcex.clearing.session.stage.task.result.DealsPrepareCompoundResult; + +public class RequirementsAndObligationCreationCompoundPayload { + private List executionsTrdt; + private List executionsCurrency; + private List executionsFinal; + + public static RequirementsAndObligationCreationCompoundPayload create(DealsPrepareCompoundResult stageResult) { + RequirementsAndObligationCreationCompoundPayload p = new RequirementsAndObligationCreationCompoundPayload(); + p.setExecutionsTrdt(stageResult.getExecutionsTrdt()); + p.setExecutionsCurrency(stageResult.getExecutionsCurrency()); + p.setExecutionsFinal(stageResult.getExecutionsFinal()); + return p; + } + + public List getExecutionsTrdt() { + return executionsTrdt; + } + + public void setExecutionsTrdt(List executionsTrdt) { + this.executionsTrdt = executionsTrdt; + } + + public List getExecutionsCurrency() { + return executionsCurrency; + } + + public void setExecutionsCurrency(List executionsCurrency) { + this.executionsCurrency = executionsCurrency; + } + + public List getExecutionsFinal() { + return executionsFinal; + } + + public void setExecutionsFinal(List executionsFinal) { + this.executionsFinal = executionsFinal; + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/result/DealsPrepareCompoundResult.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/result/DealsPrepareCompoundResult.java new file mode 100644 index 000000000..967ee31d5 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/task/result/DealsPrepareCompoundResult.java @@ -0,0 +1,34 @@ +package ru.spcex.clearing.session.stage.task.result; + +import java.util.List; +import ru.clearing.classes.statics.data.execution.ExecutionCommon; + +public class DealsPrepareCompoundResult { + private List executionsTrdt; + private List executionsCurrency; + private List executionsFinal; + + public List getExecutionsTrdt() { + return executionsTrdt; + } + + public void setExecutionsTrdt(List executionsTrdt) { + this.executionsTrdt = executionsTrdt; + } + + public List getExecutionsCurrency() { + return executionsCurrency; + } + + public void setExecutionsCurrency(List executionsCurrency) { + this.executionsCurrency = executionsCurrency; + } + + public List getExecutionsFinal() { + return executionsFinal; + } + + public void setExecutionsFinal(List executionsFinal) { + this.executionsFinal = executionsFinal; + } +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/SdfGroup.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/SdfGroup.java index c189a6cf4..d86ee9624 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/SdfGroup.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/SdfGroup.java @@ -8,7 +8,7 @@ import ru.spcex.platform.enumeration.SdfTable; public enum SdfGroup { // Sdf01And57(SdfTable.SDF_01, SdfTable.SDF_57), - Sdf08And21(SdfTable.SDF_08, SdfTable.SDF_21), +// Sdf08And21(SdfTable.SDF_08, SdfTable.SDF_21), //------ session groups ------ (4), (1 57), (13), (8 21) //session_Triple(SdfTable.SDF_04, SdfTable.SDF_01, SdfTable.SDF_57), diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/StatementServiceV2.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/StatementServiceV2.java index d36107498..a91caf613 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/StatementServiceV2.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/statement/StatementServiceV2.java @@ -118,9 +118,11 @@ public class StatementServiceV2 { switch (table) { case SDF_01 -> processSdf01(systemRequest.getRequestPayload()); case SDF_04 -> processSdf04(systemRequest.getRequestPayload()); + case SDF_08 -> processSdf08(systemRequest.getRequestPayload()); case SDF_10 -> sdf10Executor.execute(systemRequest); case SDF_13 -> processSdf13(systemRequest.getRequestPayload()); case SDF_20 -> sdf20Executor.execute(systemRequest); + case SDF_21 -> processSdf21(systemRequest.getRequestPayload()); case SDF_55 -> sdf55Executor.execute(systemRequest); case SDF_57 -> processSdf57(systemRequest.getRequestPayload()); default -> log.error("unknown table {}", table); @@ -148,9 +150,9 @@ public class StatementServiceV2 { log.debug("find full set of SDF requests: {}", fullGroup.stream() .map(stReq -> stReq.getTable().getKey() + " generationId=" + stReq.getGroupId()) .collect(TextUtil.join)); - if (sdfGroup.get() == SdfGroup.Sdf08And21) { - processSdf08And21(find(SdfTable.SDF_08, fullGroup), find(SdfTable.SDF_21, fullGroup)); - } +// if (sdfGroup.get() == SdfGroup.Sdf08And21) { +// processSdf08And21(find(SdfTable.SDF_08, fullGroup), find(SdfTable.SDF_21, fullGroup)); +// } // else if (sdfGroup.get() == SdfGroup.Sdf01And57) { // processSdf01Parent(find(SdfTable.SDF_01, fullGroup), find(SdfTable.SDF_57, fullGroup)); // } @@ -164,9 +166,9 @@ public class StatementServiceV2 { // processSdf08And21(find(SdfTable.SDF_08, fullGroup), find(SdfTable.SDF_21, fullGroup)); // processSdf01And57(find(SdfTable.SDF_01, fullGroup), find(SdfTable.SDF_57, fullGroup)); //} - else { - throw new IllegalStateException("not implemented"); - } +// else { + throw new IllegalStateException("not implemented"); +// } } private static StatementRequest find(SdfTable table, Collection reqs) { @@ -177,27 +179,6 @@ public class StatementServiceV2 { return first.get(); } - /** - * fromAccService передается когда пришел ответ от account-service - * в этом случае: по key находим пару в которой сохранен sdf57 запрос и частично выполненный sdf01 - * вместо старого sdf01 запроса выполняем новый пришедший от account-service - */ - private void processSdf08And21(StatementRequest sdf08, StatementRequest sdf21) { - Result sdf08Res = processSdf08(sdf08); - removeFirstWithSameTableAndGroupId(sdf08); - if (sdf08Res.getAccountRequests().size() > 0) { - log.info("sdf08 execution wasn't complete, waiting for an answer from account-service"); - return; - } - //затем sdf21 - processSdf21(sdf21); - removeFirstWithSameTableAndGroupId(sdf21); - //fixme ревизия для бумаг reviser.doRevise(pair.getFirst().getGroupId()); - SessionContinueEvent continueSessionBn = new SessionContinueEvent(SdfTable.SDF_08, SdfTable.SDF_21); - kafkaSender.sendRequestToQueue(Consts.CONTINUE_SESSION_BN_FIRST_PART, continueSessionBn); - log.info("pair sdf08/sdf21 processed successfully"); - } - private void processSdf04(StatementRequest statementRequest) { Imdg sdfImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf04, SDf04.class); Collection sdfGroup = sdfImdg.getCollectionObjectsByFieldValues(Map.of( @@ -304,36 +285,45 @@ public class StatementServiceV2 { } - private Result processSdf08(StatementRequest statementRequest) { + private void processSdf08(StatementRequest sdf08) { Imdg sdfImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf08, SDf08.class); Collection sdfGroup; - if (statementRequest.getAccountCreationResults().size() == 0) { + if (sdf08.getAccountCreationResults().isEmpty()) { sdfGroup = sdfImdg.getCollectionObjectsByFieldValues(Map.of( - "generationId", statementRequest.getGroupId())); + "generationId", sdf08.getGroupId())); } else { - sdfGroup = statementRequest.getAccountCreationResults() + sdfGroup = sdf08.getAccountCreationResults() .stream() .filter(part -> part.getErrorCode() == null) .map(part -> sdfImdg.getSingleObjectByID(part.getSdfId())) .collect(Collectors.toList()); } - Result res = sdf08Executor.execute(sdfGroup, statementRequest); - if (res.getAccountRequests().size() != 0) { - AccountSdf01Request createAccsReq = StatementService.createAccountsRequest(statementRequest.getGroupId(), - res.getAccountRequests(), - res.getChildGenerationId()); + Result sdf08Res = sdf08Executor.execute(sdfGroup, sdf08); + if (!sdf08Res.getAccountRequests().isEmpty()) { + AccountSdf01Request createAccsReq = StatementService.createAccountsRequest(sdf08.getGroupId(), + sdf08Res.getAccountRequests(), + sdf08Res.getChildGenerationId()); kafkaSender.sendRequestToQueue(Consts.ACCOUNT_NEW_SDF08, createAccsReq); } else if (sdf08Executor.isNeedToSendCommand()) { - sdf08Executor.sendCommand(kafkaSender, res); + sdf08Executor.sendCommand(kafkaSender, sdf08Res); + } + removeFirstWithSameTableAndGroupId(sdf08); + if (!sdf08Res.getAccountRequests().isEmpty()) { + log.info("sdf08 execution wasn't complete, waiting for an answer from account-service"); + } else { + log.info("sdf08 execution was complete."); } - return res; } - private void processSdf21(StatementRequest statementRequest) { + private void processSdf21(StatementRequest sdf21) { Imdg sdfImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf21, SDf21.class); Collection sdfGroup = sdfImdg.getCollectionObjectsByFieldValues(Map.of( - "generationId", statementRequest.getGroupId())); - Result res = sdf21Executor.execute(sdfGroup, statementRequest); + "generationId", sdf21.getGroupId())); + Result res = sdf21Executor.execute(sdfGroup, sdf21); + removeFirstWithSameTableAndGroupId(sdf21); + SessionContinueEvent continueSessionBn = new SessionContinueEvent(SdfTable.SDF_08, SdfTable.SDF_21); + kafkaSender.sendRequestToQueue(Consts.CONTINUE_SESSION_BN_FIRST_PART, continueSessionBn); + log.info("sdf21 processed successfully"); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/util/ComparatorUtil.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/util/ComparatorUtil.java new file mode 100644 index 000000000..a681d542f --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/util/ComparatorUtil.java @@ -0,0 +1,13 @@ +package ru.spcex.clearing.util; + +import java.util.Comparator; +import ru.clearing.classes.statics.data.execution.ExecutionCommon; + +public class ComparatorUtil { + public static final Comparator tradeTimeComparator + = Comparator.comparing(ExecutionCommon::getExchangeExecutionTime); + + public static final Comparator execIdComparator + = Comparator.comparing(ExecutionCommon::getExchangeExecutionId); + +} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/util/LocaleUtil.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/util/LocaleUtil.java new file mode 100644 index 000000000..864b5a36d --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/util/LocaleUtil.java @@ -0,0 +1,31 @@ +package ru.spcex.clearing.util; + +import java.util.Locale; +import ru.clearing.classes.statics.data.account.Account; +import ru.spcex.platform.enumeration.CurrencyCode; + +public class LocaleUtil { + private static final Locale ru = new Locale("ru"); + private static final Locale eng = new Locale("eng"); + + public static boolean isRus(Locale locale) { + return ru.equals(locale); + } + + public static Locale locale(Account acc) { + if (CurrencyCode.isRubDefault(acc.getCurrency())) { + return ru; + } else { + return eng; + } + } + + public static Locale locale(String... currencyCode) { + for (String s : currencyCode) { + if (!CurrencyCode.isRubDefault(s)) { + return eng; + } + } + return ru; + } +} diff --git a/clearing-parent/clearing-service/src/main/resources/messages/clearing_eng.properties b/clearing-parent/clearing-service/src/main/resources/messages/clearing_eng.properties new file mode 100644 index 000000000..7ddb3cb64 --- /dev/null +++ b/clearing-parent/clearing-service/src/main/resources/messages/clearing_eng.properties @@ -0,0 +1,3 @@ +payment-instruction.purpose.withdrawal.tcr=Debt free cash withdrawal from TKR {0}. +payment-instruction.purpose.withdrawal=Debt free cash withdrawal. +sdf54.urgent=urgent \ No newline at end of file diff --git a/clearing-parent/clearing-service/src/main/resources/messages/clearing_ru.properties b/clearing-parent/clearing-service/src/main/resources/messages/clearing_ru.properties new file mode 100644 index 000000000..a411e49bb --- /dev/null +++ b/clearing-parent/clearing-service/src/main/resources/messages/clearing_ru.properties @@ -0,0 +1,3 @@ +payment-instruction.purpose.withdrawal.tcr=Возврат средств, свободных от обязательств с ТКР {0}. +payment-instruction.purpose.withdrawal=Вывод средств. +sdf54.urgent=срочно \ No newline at end of file diff --git a/clearing-parent/clearing-validation/pom.xml b/clearing-parent/clearing-validation/pom.xml index c08e3f801..89670cb64 100644 --- a/clearing-parent/clearing-validation/pom.xml +++ b/clearing-parent/clearing-validation/pom.xml @@ -8,12 +8,12 @@ clearing-validation Clearing-module, dependency version of platform-utils jar - SPCEX-3.11.0.0 + SPCEX-3.12.7 clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.11.0.0 + SPCEX-3.12.7 compile ru.spcex.clearing dictionary - SPCEX-3.11.0.0 + SPCEX-3.12.7 compile diff --git a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/ValidationHelper.java b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/ValidationHelper.java index e9bf4e4e9..5681e0780 100644 --- a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/ValidationHelper.java +++ b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/ValidationHelper.java @@ -1,5 +1,8 @@ package ru.spcex.clearing.validation.common; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Function; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; @@ -10,10 +13,6 @@ import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.error.ValidationException; import ru.spcex.platform.utils.validation.IValidator; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Function; - public class ValidationHelper { private final static Logger log = LoggerFactory.getLogger(ValidationHelper.class); diff --git a/clearing-parent/company-service/pom.xml b/clearing-parent/company-service/pom.xml index a534e9321..be56314dd 100644 --- a/clearing-parent/company-service/pom.xml +++ b/clearing-parent/company-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 4.0.0 diff --git a/clearing-parent/db-scripts/pom.xml b/clearing-parent/db-scripts/pom.xml index 8b90c70ed..aef512578 100644 --- a/clearing-parent/db-scripts/pom.xml +++ b/clearing-parent/db-scripts/pom.xml @@ -7,12 +7,12 @@ db-scripts db-scripts db-scripts for PostgreSQL - SPCEX-3.11.0.0 + SPCEX-3.12.7 clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 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 3adac2e71..cecb1626f 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/DDL.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/DDL.sql @@ -1,4 +1,4 @@ --- DB version: 3.11.0.83 +-- DB version: 3.12.0.91 /* Dictionaries */ -- allowed - Справочник признаков допустимости использования объектов @@ -2054,7 +2054,7 @@ GRANT ALL PRIVILEGES ON TABLE TRADING_CLEARING_REGISTRY_LIST_HISTORY TO clearing -- registry - Регистр активов, обязательств и требований УК DROP TABLE IF EXISTS REGISTRY; -CREATE TABLE REGISTRY(COMPANY_ID bigint, TRADING_CODE varchar(255), CLEARING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), ACCOUNT_ID bigint, ACCOUNT_TYPE varchar(4), ACCOUNT varchar(50), REGISTRY_DESIGNATION varchar(4), REGISTRY_INSTRUMENT_TYPE varchar(4), REGISTRY_CAPACITY varchar(4), REGISTRY_UNIT varchar(4), REGISTRY_CODE varchar(4), TRADING_CLEARING_REGISTRY_ID bigint, TRADING_CLEARING_REGISTRY varchar(50), REGISTRY_STATUS varchar(4), SECURITY_SYMBOL varchar(255), BALANCE numeric(72,18), OPEN_BALANCE numeric(72,18), CLOSE_BALANCE numeric(72,18), CREDIT numeric(72,18), DEBIT numeric(72,18), SETTLED_CREDIT numeric(72,18), SETTLED_DEBIT numeric(72,18), CHECK_BALANCE numeric(72,18), DIFF_BALANCE numeric(72,18), PLAN_BALANCE numeric(72,18), BALANCE_DIMENSION varchar(4), SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), TRADING_DATE date, CLEARING_DATE date, REFUND_DATE date, VALUE_DATE date, PRICE numeric(72,18), CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COMMENT varchar(255), PARENT_ID bigint, GROUP_ID bigint, SESSION_ID bigint, SESSION_TYPE varchar(4), PAYMENT_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SECURITY_ID bigint); +CREATE TABLE REGISTRY(COMPANY_ID bigint, TRADING_CODE varchar(255), CLEARING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), ACCOUNT_ID bigint, ACCOUNT_TYPE varchar(4), ACCOUNT varchar(50), REGISTRY_DESIGNATION varchar(4), REGISTRY_INSTRUMENT_TYPE varchar(4), REGISTRY_CAPACITY varchar(4), REGISTRY_UNIT varchar(4), REGISTRY_CODE varchar(4), TRADING_CLEARING_REGISTRY_ID bigint, TRADING_CLEARING_REGISTRY varchar(50), REGISTRY_STATUS varchar(4), SECURITY_SYMBOL varchar(255), BALANCE numeric(72,18), OPEN_BALANCE numeric(72,18), CLOSE_BALANCE numeric(72,18), CREDIT numeric(72,18), DEBIT numeric(72,18), SETTLED_CREDIT numeric(72,18), SETTLED_DEBIT numeric(72,18), CHECK_BALANCE numeric(72,18), DIFF_BALANCE numeric(72,18), PLAN_BALANCE numeric(72,18), BALANCE_DIMENSION varchar(4), SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), TRADING_DATE date, CLEARING_DATE date, REFUND_DATE date, VALUE_DATE date, PRICE numeric(72,18), CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COMMENT varchar(255), PARENT_ID bigint, GROUP_ID bigint, SESSION_ID bigint, SESSION_TYPE varchar(4), PAYMENT_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SECURITY_ID bigint, SECTION varchar(4)); COMMENT ON TABLE REGISTRY IS 'Регистр активов, обязательств и требований УК'; COMMENT ON COLUMN REGISTRY.COMPANY_ID IS 'Идентификатор участника (linked to company)'; @@ -2151,12 +2151,14 @@ COMMENT ON COLUMN REGISTRY.UPDATED_AT IS 'Дата и время изменен COMMENT ON COLUMN REGISTRY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; +COMMENT ON COLUMN REGISTRY.SECTION IS 'Код секции (linked to section)'; + GRANT ALL PRIVILEGES ON TABLE REGISTRY TO clearing; -- History log of registry - Регистр активов, обязательств и требований УК DROP TABLE IF EXISTS REGISTRY_HISTORY; -CREATE TABLE REGISTRY_HISTORY(REGISTRY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), COMPANY_ID bigint, TRADING_CODE varchar(255), CLEARING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), ACCOUNT_ID bigint, ACCOUNT_TYPE varchar(4), ACCOUNT varchar(50), REGISTRY_DESIGNATION varchar(4), REGISTRY_INSTRUMENT_TYPE varchar(4), REGISTRY_CAPACITY varchar(4), REGISTRY_UNIT varchar(4), REGISTRY_CODE varchar(4), TRADING_CLEARING_REGISTRY_ID bigint, TRADING_CLEARING_REGISTRY varchar(50), REGISTRY_STATUS varchar(4), SECURITY_SYMBOL varchar(255), BALANCE numeric(72,18), OPEN_BALANCE numeric(72,18), CLOSE_BALANCE numeric(72,18), CREDIT numeric(72,18), DEBIT numeric(72,18), SETTLED_CREDIT numeric(72,18), SETTLED_DEBIT numeric(72,18), CHECK_BALANCE numeric(72,18), DIFF_BALANCE numeric(72,18), PLAN_BALANCE numeric(72,18), BALANCE_DIMENSION varchar(4), SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), TRADING_DATE date, CLEARING_DATE date, REFUND_DATE date, VALUE_DATE date, PRICE numeric(72,18), CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COMMENT varchar(255), PARENT_ID bigint, GROUP_ID bigint, SESSION_ID bigint, SESSION_TYPE varchar(4), PAYMENT_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SECURITY_ID bigint); +CREATE TABLE REGISTRY_HISTORY(REGISTRY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), COMPANY_ID bigint, TRADING_CODE varchar(255), CLEARING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), ACCOUNT_ID bigint, ACCOUNT_TYPE varchar(4), ACCOUNT varchar(50), REGISTRY_DESIGNATION varchar(4), REGISTRY_INSTRUMENT_TYPE varchar(4), REGISTRY_CAPACITY varchar(4), REGISTRY_UNIT varchar(4), REGISTRY_CODE varchar(4), TRADING_CLEARING_REGISTRY_ID bigint, TRADING_CLEARING_REGISTRY varchar(50), REGISTRY_STATUS varchar(4), SECURITY_SYMBOL varchar(255), BALANCE numeric(72,18), OPEN_BALANCE numeric(72,18), CLOSE_BALANCE numeric(72,18), CREDIT numeric(72,18), DEBIT numeric(72,18), SETTLED_CREDIT numeric(72,18), SETTLED_DEBIT numeric(72,18), CHECK_BALANCE numeric(72,18), DIFF_BALANCE numeric(72,18), PLAN_BALANCE numeric(72,18), BALANCE_DIMENSION varchar(4), SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), TRADING_DATE date, CLEARING_DATE date, REFUND_DATE date, VALUE_DATE date, PRICE numeric(72,18), CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COMMENT varchar(255), PARENT_ID bigint, GROUP_ID bigint, SESSION_ID bigint, SESSION_TYPE varchar(4), PAYMENT_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SECURITY_ID bigint, SECTION varchar(4)); COMMENT ON TABLE REGISTRY_HISTORY IS 'История изменений таблицы registry'; COMMENT ON COLUMN REGISTRY_HISTORY.REGISTRY_ID IS 'Идентификатор записи в таблице REGISTRY'; COMMENT ON COLUMN REGISTRY_HISTORY.EVENT_TIME IS 'Дата и время изменения'; @@ -2257,6 +2259,8 @@ COMMENT ON COLUMN REGISTRY_HISTORY.UPDATED_AT IS 'Дата и время изм COMMENT ON COLUMN REGISTRY_HISTORY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; +COMMENT ON COLUMN REGISTRY_HISTORY.SECTION IS 'Код секции (linked to section)'; + GRANT ALL PRIVILEGES ON TABLE REGISTRY_HISTORY TO clearing; -- account - Счета @@ -2373,10 +2377,10 @@ COMMENT ON COLUMN RELATION_HISTORY.UPDATED_AT IS 'Дата-время измен GRANT ALL PRIVILEGES ON TABLE RELATION_HISTORY TO clearing; --- bankAccount - Счета вывода средств из ПРЦ +-- bankAccount - Счета вывода средств DROP TABLE IF EXISTS BANK_ACCOUNT; -CREATE TABLE BANK_ACCOUNT(ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY varchar(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN varchar(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), ACCOUNT varchar(50), COMPANY_ID bigint, ID bigint PRIMARY KEY); -COMMENT ON TABLE BANK_ACCOUNT IS 'Счета вывода средств из ПРЦ'; +CREATE TABLE BANK_ACCOUNT(ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY varchar(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN varchar(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), ACCOUNT varchar(50), COMPANY_ID bigint, ID bigint PRIMARY KEY, INTERMEDIARY_SWIFT_CODE varchar(255)); +COMMENT ON TABLE BANK_ACCOUNT IS 'Счета вывода средств'; COMMENT ON COLUMN BANK_ACCOUNT.ACCOUNT_ID IS 'Идентификатор счета (linked to account)'; @@ -2408,12 +2412,14 @@ COMMENT ON COLUMN BANK_ACCOUNT.COMPANY_ID IS 'Идентификатор ком COMMENT ON COLUMN BANK_ACCOUNT.ID IS 'Идентификатор записи'; +COMMENT ON COLUMN BANK_ACCOUNT.INTERMEDIARY_SWIFT_CODE IS 'Код SWIFT посредника'; + GRANT ALL PRIVILEGES ON TABLE BANK_ACCOUNT TO clearing; --- History log of bankAccount - Счета вывода средств из ПРЦ +-- History log of bankAccount - Счета вывода средств DROP TABLE IF EXISTS BANK_ACCOUNT_HISTORY; -CREATE TABLE BANK_ACCOUNT_HISTORY(BANK_ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY varchar(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN varchar(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), ACCOUNT varchar(50), COMPANY_ID bigint, ID bigint PRIMARY KEY); +CREATE TABLE BANK_ACCOUNT_HISTORY(BANK_ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY varchar(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN varchar(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), ACCOUNT varchar(50), COMPANY_ID bigint, ID bigint PRIMARY KEY, INTERMEDIARY_SWIFT_CODE varchar(255)); 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 'Дата и время изменения'; @@ -2450,6 +2456,8 @@ COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.COMPANY_ID IS 'Идентификатор COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.ID IS 'Идентификатор записи'; +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.INTERMEDIARY_SWIFT_CODE IS 'Код SWIFT посредника'; + GRANT ALL PRIVILEGES ON TABLE BANK_ACCOUNT_HISTORY TO clearing; -- informationAccount - Регистр КС @@ -4100,7 +4108,7 @@ GRANT ALL PRIVILEGES ON TABLE S_DF05 TO clearing; -- sDf06 - ДФ-06 Запрос на зачисление/списание денежных средств DROP TABLE IF EXISTS S_DF06; -CREATE TABLE S_DF06(ID bigint PRIMARY KEY, ACCOUNT varchar(20), SUM numeric(72,18), MARKET varchar(1), TYPE varchar(255), DEAL varchar(10), CLIENT_N varchar(255), INN varchar(255), BIC varchar(255), SPEC varchar(255), NUMBER numeric(72,18), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint, _DOC__NUM varchar(3), _DOC__DATE varchar(8), PAY_VAL varchar(12)); +CREATE TABLE S_DF06(ID bigint PRIMARY KEY, ACCOUNT varchar(20), SUM numeric(72,18), MARKET varchar(1), TYPE varchar(255), DEAL varchar(10), CLIENT_N varchar(255), INN varchar(255), BIC varchar(255), SPEC varchar(255), NUMBER numeric(72,18), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint, DOC_NUM varchar(3), DOC_DATE varchar(8), PAY_VAL varchar(12)); COMMENT ON TABLE S_DF06 IS 'ДФ-06 Запрос на зачисление/списание денежных средств'; COMMENT ON COLUMN S_DF06.ID IS 'Идентификатор записи'; @@ -4131,9 +4139,9 @@ COMMENT ON COLUMN S_DF06.GENERATION_TIME IS 'Дата и время обрабо COMMENT ON COLUMN S_DF06.GENERATION_ID IS 'Идентификатор взаимодействия'; -COMMENT ON COLUMN S_DF06._DOC__NUM IS 'Номер выгружаемого документа'; +COMMENT ON COLUMN S_DF06.DOC_NUM IS 'Номер выгружаемого документа'; -COMMENT ON COLUMN S_DF06._DOC__DATE IS 'Дата выгружаемого документа'; +COMMENT ON COLUMN S_DF06.DOC_DATE IS 'Дата выгружаемого документа'; COMMENT ON COLUMN S_DF06.PAY_VAL IS 'Валюта документа'; @@ -4141,7 +4149,7 @@ GRANT ALL PRIVILEGES ON TABLE S_DF06 TO clearing; -- sDf07 - ДФ-07 Ответ на запрос по зачислению/списанию денежных средств DROP TABLE IF EXISTS S_DF07; -CREATE TABLE S_DF07(ID bigint PRIMARY KEY, ACCOUNT varchar(20), SUM numeric(72,18), MARKET varchar(1), TYPE varchar(255), DEAL varchar(10), CLIENT_N varchar(255), INN varchar(255), BIC varchar(255), SPEC varchar(255), NUMBER numeric(72,18), RESULT numeric(72,18), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint, IN_S_DF_ID bigint, _DOC__NUM varchar(3), _DOC__DATE varchar(8), PAY_VAL varchar(12)); +CREATE TABLE S_DF07(ID bigint PRIMARY KEY, ACCOUNT varchar(20), SUM numeric(72,18), MARKET varchar(1), TYPE varchar(255), DEAL varchar(10), CLIENT_N varchar(255), INN varchar(255), BIC varchar(255), SPEC varchar(255), NUMBER numeric(72,18), RESULT numeric(72,18), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint, IN_S_DF_ID bigint, DOC_NUM varchar(3), DOC_DATE varchar(8), PAY_VAL varchar(12)); COMMENT ON TABLE S_DF07 IS 'ДФ-07 Ответ на запрос по зачислению/списанию денежных средств'; COMMENT ON COLUMN S_DF07.ID IS 'Идентификатор записи'; @@ -4176,9 +4184,9 @@ COMMENT ON COLUMN S_DF07.GENERATION_ID IS 'Идентификатор взаим COMMENT ON COLUMN S_DF07.IN_S_DF_ID IS 'Идентификатор соответствующей записи из таблицы-источника'; -COMMENT ON COLUMN S_DF07._DOC__NUM IS 'Номер выгружаемого документа'; +COMMENT ON COLUMN S_DF07.DOC_NUM IS 'Номер выгружаемого документа'; -COMMENT ON COLUMN S_DF07._DOC__DATE IS 'Дата выгружаемого документа'; +COMMENT ON COLUMN S_DF07.DOC_DATE IS 'Дата выгружаемого документа'; COMMENT ON COLUMN S_DF07.PAY_VAL IS 'Валюта документа'; @@ -4495,7 +4503,7 @@ GRANT ALL PRIVILEGES ON TABLE S_DF52 TO clearing; -- sDf53 - ДФ-53 Квитанция о получении информации о состоянии счета (блокировка/разблокировка/закрытие/открытие) DROP TABLE IF EXISTS S_DF53; -CREATE TABLE S_DF53(ID bigint PRIMARY KEY, ACC_NAME varchar(30), ACCOUNT varchar(25), DEAL varchar(4), DATE varchar(8), STATUS bigint, RESULT varchar(255), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint, IN_S_DF_ID bigint, ACC_TYPE varchar(3)); +CREATE TABLE S_DF53(ID bigint PRIMARY KEY, ACC_NAME varchar(30), ACCOUNT varchar(25), DEAL varchar(4), DATE varchar(8), STATUS bigint, RESULT varchar(255), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint, IN_S_DF_ID bigint, ACC_TYPE bigint); COMMENT ON TABLE S_DF53 IS 'ДФ-53 Квитанция о получении информации о состоянии счета (блокировка/разблокировка/закрытие/открытие)'; COMMENT ON COLUMN S_DF53.ID IS 'Идентификатор записи'; @@ -4526,7 +4534,7 @@ GRANT ALL PRIVILEGES ON TABLE S_DF53 TO clearing; -- sDf54 - ДФ-54 Вывод свободных средств для инициаторов категории В с клирингового счета 30414 DROP TABLE IF EXISTS S_DF54; -CREATE TABLE S_DF54(ID bigint PRIMARY KEY, SEG_TYPE varchar(1), DOC_TYPE varchar(4), DOCNM_REF varchar(16), DOCNMPREV varchar(16), 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), RBANKNAM2 varchar(35), RBANKNAM3 varchar(35), RBANKNAM4 varchar(35), RBANKNAM5 varchar(35), OP_TYPE varchar(2), OP_ORDER varchar(1), PAY_DATE varchar(8), PAY_VAL varchar(12), SUM_DEB varchar(22), SCLIENTN1 varchar(35), SCLIENTN2 varchar(35), SCLIENTN3 varchar(35), SCLIENTN4 varchar(35), INN_DEB varchar(12), KPP_DEB varchar(9), ACC_DEB varchar(35), RCLIENTN1 varchar(35), RCLIENTN2 varchar(35), RCLIENTN3 varchar(35), RCLIENTN4 varchar(35), INN_CRED varchar(12), KPP_CRED varchar(9), ACC_KR_1 varchar(35), SPECIF_1 varchar(255), SEND_TYPE varchar(10), DOC_RESULT varchar(2), GENERATION_TIME timestamp, GENERATION_ID bigint, _DOC__NUM varchar(3), _DOC__DATE varchar(8), _VALUE_DATE varchar(8), _SWIFT_BEN varchar(11), _SWIFT_INT varchar(11)); +CREATE TABLE S_DF54(ID bigint PRIMARY KEY, SEG_TYPE varchar(1), DOC_TYPE varchar(4), DOCNM_REF varchar(16), DOCNMPREV varchar(16), 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), RBANKNAM2 varchar(35), RBANKNAM3 varchar(35), RBANKNAM4 varchar(35), RBANKNAM5 varchar(35), OP_TYPE varchar(2), OP_ORDER varchar(1), PAY_DATE varchar(8), PAY_VAL varchar(12), SUM_DEB varchar(22), SCLIENTN1 varchar(35), SCLIENTN2 varchar(35), SCLIENTN3 varchar(35), SCLIENTN4 varchar(35), INN_DEB varchar(12), KPP_DEB varchar(9), ACC_DEB varchar(35), RCLIENTN1 varchar(35), RCLIENTN2 varchar(35), RCLIENTN3 varchar(35), RCLIENTN4 varchar(35), INN_CRED varchar(12), KPP_CRED varchar(9), ACC_KR_1 varchar(35), SPECIF_1 varchar(255), SEND_TYPE varchar(10), DOC_RESULT varchar(2), GENERATION_TIME timestamp, GENERATION_ID bigint, DOC_NUM varchar(3), DOC_DATE varchar(8), VALUE_DATE varchar(8), SWIFT_BEN varchar(11), SWIFT_INT varchar(11)); COMMENT ON TABLE S_DF54 IS 'ДФ-54 Вывод свободных средств для инициаторов категории В с клирингового счета 30414'; COMMENT ON COLUMN S_DF54.ID IS 'Идентификатор записи'; @@ -4615,21 +4623,21 @@ COMMENT ON COLUMN S_DF54.GENERATION_TIME IS 'Дата и время создан COMMENT ON COLUMN S_DF54.GENERATION_ID IS 'Идентификатор взаимодействия'; -COMMENT ON COLUMN S_DF54._DOC__NUM IS 'Номер выгружаемого документа'; +COMMENT ON COLUMN S_DF54.DOC_NUM IS 'Номер выгружаемого документа'; -COMMENT ON COLUMN S_DF54._DOC__DATE IS 'Дата выгружаемого документа'; +COMMENT ON COLUMN S_DF54.DOC_DATE IS 'Дата выгружаемого документа'; -COMMENT ON COLUMN S_DF54._VALUE_DATE IS 'Дата валютирования'; +COMMENT ON COLUMN S_DF54.VALUE_DATE IS 'Дата валютирования'; -COMMENT ON COLUMN S_DF54._SWIFT_BEN IS 'Свифт банка бенефициара'; +COMMENT ON COLUMN S_DF54.SWIFT_BEN IS 'Свифт банка бенефициара'; -COMMENT ON COLUMN S_DF54._SWIFT_INT IS 'Свифт банка посредника'; +COMMENT ON COLUMN S_DF54.SWIFT_INT IS 'Свифт банка посредника'; GRANT ALL PRIVILEGES ON TABLE S_DF54 TO clearing; -- sDf55 - ДФ-55 Квитанция об обработке ДФ-54 DROP TABLE IF EXISTS S_DF55; -CREATE TABLE S_DF55(ID bigint PRIMARY KEY, SEG_TYPE varchar(1), DOC_TYPE varchar(4), DOCNM_REF varchar(16), DOCNMPREV varchar(16), 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), RBANKNAM2 varchar(35), RBANKNAM3 varchar(35), RBANKNAM4 varchar(35), RBANKNAM5 varchar(35), OP_TYPE varchar(2), OP_ORDER varchar(1), PAY_DATE varchar(8), PAY_VAL varchar(12), SUM_DEB varchar(22), SCLIENTN1 varchar(35), SCLIENTN2 varchar(35), SCLIENTN3 varchar(35), SCLIENTN4 varchar(35), INN_DEB varchar(12), KPP_DEB varchar(9), ACC_DEB varchar(35), RCLIENTN1 varchar(35), RCLIENTN2 varchar(35), RCLIENTN3 varchar(35), RCLIENTN4 varchar(35), INN_CRED varchar(12), KPP_CRED varchar(9), ACC_KR_1 varchar(35), SPECIF_1 varchar(255), SEND_TYPE varchar(10), DOC_RESULT varchar(2), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint, _DOC__NUM varchar(3), _DOC__DATE varchar(8), _VALUE_DATE varchar(8), _SWIFT_BEN varchar(11), _SWIFT_INT varchar(11)); +CREATE TABLE S_DF55(ID bigint PRIMARY KEY, SEG_TYPE varchar(1), DOC_TYPE varchar(4), DOCNM_REF varchar(16), DOCNMPREV varchar(16), 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), RBANKNAM2 varchar(35), RBANKNAM3 varchar(35), RBANKNAM4 varchar(35), RBANKNAM5 varchar(35), OP_TYPE varchar(2), OP_ORDER varchar(1), PAY_DATE varchar(8), PAY_VAL varchar(12), SUM_DEB varchar(22), SCLIENTN1 varchar(35), SCLIENTN2 varchar(35), SCLIENTN3 varchar(35), SCLIENTN4 varchar(35), INN_DEB varchar(12), KPP_DEB varchar(9), ACC_DEB varchar(35), RCLIENTN1 varchar(35), RCLIENTN2 varchar(35), RCLIENTN3 varchar(35), RCLIENTN4 varchar(35), INN_CRED varchar(12), KPP_CRED varchar(9), ACC_KR_1 varchar(35), SPECIF_1 varchar(255), SEND_TYPE varchar(10), DOC_RESULT varchar(2), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint, DOC_NUM varchar(3), DOC_DATE varchar(8), VALUE_DATE varchar(8), SWIFT_BEN varchar(11), SWIFT_INT varchar(11)); COMMENT ON TABLE S_DF55 IS 'ДФ-55 Квитанция об обработке ДФ-54'; COMMENT ON COLUMN S_DF55.ID IS 'Идентификатор записи'; @@ -4720,15 +4728,15 @@ COMMENT ON COLUMN S_DF55.GENERATION_TIME IS 'Дата и время обрабо COMMENT ON COLUMN S_DF55.GENERATION_ID IS 'Идентификатор взаимодействия'; -COMMENT ON COLUMN S_DF55._DOC__NUM IS 'Номер выгружаемого документа'; +COMMENT ON COLUMN S_DF55.DOC_NUM IS 'Номер выгружаемого документа'; -COMMENT ON COLUMN S_DF55._DOC__DATE IS 'Дата выгружаемого документа'; +COMMENT ON COLUMN S_DF55.DOC_DATE IS 'Дата выгружаемого документа'; -COMMENT ON COLUMN S_DF55._VALUE_DATE IS 'Дата валютирования'; +COMMENT ON COLUMN S_DF55.VALUE_DATE IS 'Дата валютирования'; -COMMENT ON COLUMN S_DF55._SWIFT_BEN IS 'Свифт банка бенефициара'; +COMMENT ON COLUMN S_DF55.SWIFT_BEN IS 'Свифт банка бенефициара'; -COMMENT ON COLUMN S_DF55._SWIFT_INT IS 'Свифт банка посредника'; +COMMENT ON COLUMN S_DF55.SWIFT_INT IS 'Свифт банка посредника'; GRANT ALL PRIVILEGES ON TABLE S_DF55 TO clearing; @@ -4757,7 +4765,7 @@ GRANT ALL PRIVILEGES ON TABLE S_DF56 TO clearing; -- sDf57 - ДФ-57 Список транзакций о списании/зачислении за период по всем счетам (ТБС и КС) DROP TABLE IF EXISTS S_DF57; -CREATE TABLE S_DF57(GENERATION_TIME timestamp, ID bigint PRIMARY KEY, DBF_ID bigint, DEAL_DEB varchar(4), DEAL_CRED varchar(4), 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(35), C_ACC_CRED varchar(35), RBANKNAM1 varchar(35), RBANKNAM2 varchar(35), RBANKNAM3 varchar(35), RBANKNAM4 varchar(35), RBANKNAM5 varchar(35), OP_TYPE varchar(2), PAY_DATE varchar(8), EXT_DATE varchar(255), PAY_VAL varchar(12), SUM_DEB varchar(22), SCLIENTN1 varchar(35), SCLIENTN2 varchar(35), SCLIENTN3 varchar(35), SCLIENTN4 varchar(35), INN_DEB varchar(12), KPP_DEB varchar(9), ACC_DEB varchar(35), RCLIENTN1 varchar(35), RCLIENTN2 varchar(35), RCLIENTN3 varchar(35), RCLIENTN4 varchar(35), INN_CRED varchar(12), KPP_CRED varchar(9), ACC_KR varchar(35), SPECIF varchar(255), FILE_NAME varchar(255), GENERATION_ID bigint, _DOC__NUM varchar(3), _DOC__DATE varchar(8), DT_IN varchar(22), KT_IN varchar(22), DT_OUT varchar(22), KT_OUT varchar(22)); +CREATE TABLE S_DF57(GENERATION_TIME timestamp, ID bigint PRIMARY KEY, DBF_ID bigint, DEAL_DEB varchar(4), DEAL_CRED varchar(4), 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(35), C_ACC_CRED varchar(35), RBANKNAM1 varchar(35), RBANKNAM2 varchar(35), RBANKNAM3 varchar(35), RBANKNAM4 varchar(35), RBANKNAM5 varchar(35), OP_TYPE varchar(2), PAY_DATE varchar(8), EXT_DATE varchar(255), PAY_VAL varchar(12), SUM_DEB varchar(22), SCLIENTN1 varchar(35), SCLIENTN2 varchar(35), SCLIENTN3 varchar(35), SCLIENTN4 varchar(35), INN_DEB varchar(12), KPP_DEB varchar(9), ACC_DEB varchar(35), RCLIENTN1 varchar(35), RCLIENTN2 varchar(35), RCLIENTN3 varchar(35), RCLIENTN4 varchar(35), INN_CRED varchar(12), KPP_CRED varchar(9), ACC_KR varchar(35), SPECIF varchar(255), FILE_NAME varchar(255), GENERATION_ID bigint, DOC_NUM varchar(3), DOC_DATE varchar(8), DT_IN varchar(22), KT_IN varchar(22), DT_OUT varchar(22), KT_OUT varchar(22)); COMMENT ON TABLE S_DF57 IS 'ДФ-57 Список транзакций о списании/зачислении за период по всем счетам (ТБС и КС)'; COMMENT ON COLUMN S_DF57.GENERATION_TIME IS 'Дата и время создания записи'; @@ -4842,9 +4850,9 @@ COMMENT ON COLUMN S_DF57.FILE_NAME IS 'Наименование входящег COMMENT ON COLUMN S_DF57.GENERATION_ID IS 'Идентификатор взаимодействия'; -COMMENT ON COLUMN S_DF57._DOC__NUM IS 'Номер выгружаемого документа'; +COMMENT ON COLUMN S_DF57.DOC_NUM IS 'Номер выгружаемого документа'; -COMMENT ON COLUMN S_DF57._DOC__DATE IS 'Дата выгружаемого документа'; +COMMENT ON COLUMN S_DF57.DOC_DATE IS 'Дата выгружаемого документа'; COMMENT ON COLUMN S_DF57.DT_IN IS 'Входящий дебетовый остаток'; @@ -5098,4 +5106,4 @@ GRANT ALL PRIVILEGES ON TABLE S_CROSS_RATE TO clearing; -- Data types -INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.11') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION \ No newline at end of file +INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.12') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION \ No newline at end of file diff --git a/clearing-parent/db-scripts/src/main/resources/db/DDL_3.11.sql b/clearing-parent/db-scripts/src/main/resources/db/DDL_3.11.sql new file mode 100644 index 000000000..c57d57845 --- /dev/null +++ b/clearing-parent/db-scripts/src/main/resources/db/DDL_3.11.sql @@ -0,0 +1,5101 @@ +-- DB version: 3.11.0.87 +/* Dictionaries */ + +-- allowed - Справочник признаков допустимости использования объектов +DROP TABLE IF EXISTS ALLOWED_DICTIONARY; +CREATE TABLE ALLOWED_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE ALLOWED_DICTIONARY IS 'Справочник признаков допустимости использования объектов'; + +COMMENT ON COLUMN ALLOWED_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN ALLOWED_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN ALLOWED_DICTIONARY.NAME IS 'Признак допустимости'; + +GRANT ALL PRIVILEGES ON TABLE ALLOWED_DICTIONARY TO clearing; + +-- workflowStatus - Справочник статусов бизнес-процессов +DROP TABLE IF EXISTS WORKFLOW_STATUS_DICTIONARY; +CREATE TABLE WORKFLOW_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE WORKFLOW_STATUS_DICTIONARY IS 'Справочник статусов бизнес-процессов'; + +COMMENT ON COLUMN WORKFLOW_STATUS_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN WORKFLOW_STATUS_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN WORKFLOW_STATUS_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE WORKFLOW_STATUS_DICTIONARY TO clearing; + +-- errorCode - Коды ошибок +DROP TABLE IF EXISTS ERROR_CODE_DICTIONARY; +CREATE TABLE ERROR_CODE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE ERROR_CODE_DICTIONARY IS 'Коды ошибок'; + +COMMENT ON COLUMN ERROR_CODE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN ERROR_CODE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN ERROR_CODE_DICTIONARY.NAME IS 'Текст ошибки'; + +GRANT ALL PRIVILEGES ON TABLE ERROR_CODE_DICTIONARY TO clearing; + +-- countryCode - Справочник кодов стран +DROP TABLE IF EXISTS COUNTRY_CODE_DICTIONARY; +CREATE TABLE COUNTRY_CODE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE COUNTRY_CODE_DICTIONARY IS 'Справочник кодов стран'; + +COMMENT ON COLUMN COUNTRY_CODE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN COUNTRY_CODE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN COUNTRY_CODE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE COUNTRY_CODE_DICTIONARY TO clearing; + +-- section - Справочник секций +DROP TABLE IF EXISTS SECTION_DICTIONARY; +CREATE TABLE SECTION_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE SECTION_DICTIONARY IS 'Справочник секций'; + +COMMENT ON COLUMN SECTION_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN SECTION_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN SECTION_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE SECTION_DICTIONARY TO clearing; + +-- userRole - Роли пользователей +DROP TABLE IF EXISTS USER_ROLE_DICTIONARY; +CREATE TABLE USER_ROLE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE USER_ROLE_DICTIONARY IS 'Роли пользователей'; + +COMMENT ON COLUMN USER_ROLE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN USER_ROLE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN USER_ROLE_DICTIONARY.NAME IS 'Роль пользователя'; + +GRANT ALL PRIVILEGES ON TABLE USER_ROLE_DICTIONARY TO clearing; + +-- connectionState - Справочник состояний соединений +DROP TABLE IF EXISTS CONNECTION_STATE_DICTIONARY; +CREATE TABLE CONNECTION_STATE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE CONNECTION_STATE_DICTIONARY IS 'Справочник состояний соединений'; + +COMMENT ON COLUMN CONNECTION_STATE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN CONNECTION_STATE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN CONNECTION_STATE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE CONNECTION_STATE_DICTIONARY TO clearing; + +-- legalKind - Справочник видов субъекта +DROP TABLE IF EXISTS LEGAL_KIND_DICTIONARY; +CREATE TABLE LEGAL_KIND_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE LEGAL_KIND_DICTIONARY IS 'Справочник видов субъекта'; + +COMMENT ON COLUMN LEGAL_KIND_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN LEGAL_KIND_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN LEGAL_KIND_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE LEGAL_KIND_DICTIONARY TO clearing; + +-- organizationType - Справочник типов организаций +DROP TABLE IF EXISTS ORGANIZATION_TYPE_DICTIONARY; +CREATE TABLE ORGANIZATION_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE ORGANIZATION_TYPE_DICTIONARY IS 'Справочник типов организаций'; + +COMMENT ON COLUMN ORGANIZATION_TYPE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN ORGANIZATION_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN ORGANIZATION_TYPE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE ORGANIZATION_TYPE_DICTIONARY TO clearing; + +-- corporationSoleType - Справочник единоличных исполнительных органов +DROP TABLE IF EXISTS CORPORATION_SOLE_TYPE_DICTIONARY; +CREATE TABLE CORPORATION_SOLE_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE CORPORATION_SOLE_TYPE_DICTIONARY IS 'Справочник единоличных исполнительных органов'; + +COMMENT ON COLUMN CORPORATION_SOLE_TYPE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN CORPORATION_SOLE_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN CORPORATION_SOLE_TYPE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE CORPORATION_SOLE_TYPE_DICTIONARY TO clearing; + +-- clearingCategory - Справочник категорий участника клиринга +DROP TABLE IF EXISTS CLEARING_CATEGORY_DICTIONARY; +CREATE TABLE CLEARING_CATEGORY_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE CLEARING_CATEGORY_DICTIONARY IS 'Справочник категорий участника клиринга'; + +COMMENT ON COLUMN CLEARING_CATEGORY_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN CLEARING_CATEGORY_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN CLEARING_CATEGORY_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE CLEARING_CATEGORY_DICTIONARY TO clearing; + +-- contactType - Справочник типов контактов компании +DROP TABLE IF EXISTS CONTACT_TYPE_DICTIONARY; +CREATE TABLE CONTACT_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE CONTACT_TYPE_DICTIONARY IS 'Справочник типов контактов компании'; + +COMMENT ON COLUMN CONTACT_TYPE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN CONTACT_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN CONTACT_TYPE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE CONTACT_TYPE_DICTIONARY TO clearing; + +-- documentType - Справочник типов документов +DROP TABLE IF EXISTS DOCUMENT_TYPE_DICTIONARY; +CREATE TABLE DOCUMENT_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE DOCUMENT_TYPE_DICTIONARY IS 'Справочник типов документов'; + +COMMENT ON COLUMN DOCUMENT_TYPE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN DOCUMENT_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN DOCUMENT_TYPE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE DOCUMENT_TYPE_DICTIONARY TO clearing; + +-- companySymbol - Справочник имен компании +DROP TABLE IF EXISTS COMPANY_SYMBOL_DICTIONARY; +CREATE TABLE COMPANY_SYMBOL_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255), SHORTNAME varchar(255)); +COMMENT ON TABLE COMPANY_SYMBOL_DICTIONARY IS 'Справочник имен компании'; + +COMMENT ON COLUMN COMPANY_SYMBOL_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN COMPANY_SYMBOL_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN COMPANY_SYMBOL_DICTIONARY.NAME IS 'Наименование'; + +COMMENT ON COLUMN COMPANY_SYMBOL_DICTIONARY.SHORTNAME IS 'Краткое наименование'; + +GRANT ALL PRIVILEGES ON TABLE COMPANY_SYMBOL_DICTIONARY TO clearing; + +-- companyRole - Справочник ролей компаний +DROP TABLE IF EXISTS COMPANY_ROLE_DICTIONARY; +CREATE TABLE COMPANY_ROLE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE COMPANY_ROLE_DICTIONARY IS 'Справочник ролей компаний'; + +COMMENT ON COLUMN COMPANY_ROLE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN COMPANY_ROLE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN COMPANY_ROLE_DICTIONARY.NAME IS 'Роль Участника'; + +GRANT ALL PRIVILEGES ON TABLE COMPANY_ROLE_DICTIONARY TO clearing; + +-- currencyCode - Справочник кодов валют +DROP TABLE IF EXISTS CURRENCY_CODE_DICTIONARY; +CREATE TABLE CURRENCY_CODE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE CURRENCY_CODE_DICTIONARY IS 'Справочник кодов валют'; + +COMMENT ON COLUMN CURRENCY_CODE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN CURRENCY_CODE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN CURRENCY_CODE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE CURRENCY_CODE_DICTIONARY TO clearing; + +-- instrumentType - Справочник типов инструментов +DROP TABLE IF EXISTS INSTRUMENT_TYPE_DICTIONARY; +CREATE TABLE INSTRUMENT_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE INSTRUMENT_TYPE_DICTIONARY IS 'Справочник типов инструментов'; + +COMMENT ON COLUMN INSTRUMENT_TYPE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN INSTRUMENT_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN INSTRUMENT_TYPE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE INSTRUMENT_TYPE_DICTIONARY TO clearing; + +-- termType - Справочник видов инструментов Денежного рынка +DROP TABLE IF EXISTS TERM_TYPE_DICTIONARY; +CREATE TABLE TERM_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE TERM_TYPE_DICTIONARY IS 'Справочник видов инструментов Денежного рынка'; + +COMMENT ON COLUMN TERM_TYPE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN TERM_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN TERM_TYPE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE TERM_TYPE_DICTIONARY TO clearing; + +-- shareType - Справочник типов акций +DROP TABLE IF EXISTS SHARE_TYPE_DICTIONARY; +CREATE TABLE SHARE_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE SHARE_TYPE_DICTIONARY IS 'Справочник типов акций'; + +COMMENT ON COLUMN SHARE_TYPE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN SHARE_TYPE_DICTIONARY.CODE IS 'Код акции'; + +COMMENT ON COLUMN SHARE_TYPE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE SHARE_TYPE_DICTIONARY TO clearing; + +-- bondType - Справочник типов облигаций +DROP TABLE IF EXISTS BOND_TYPE_DICTIONARY; +CREATE TABLE BOND_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE BOND_TYPE_DICTIONARY IS 'Справочник типов облигаций'; + +COMMENT ON COLUMN BOND_TYPE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN BOND_TYPE_DICTIONARY.CODE IS 'Код облигации'; + +COMMENT ON COLUMN BOND_TYPE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE BOND_TYPE_DICTIONARY TO clearing; + +-- tradingClearingRegistryType - Справочник типов торгово-клиринговых регистров +DROP TABLE IF EXISTS TRADING_CLEARING_REGISTRY_TYPE_DICTIONARY; +CREATE TABLE TRADING_CLEARING_REGISTRY_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE TRADING_CLEARING_REGISTRY_TYPE_DICTIONARY IS 'Справочник типов торгово-клиринговых регистров'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_TYPE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_TYPE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE TRADING_CLEARING_REGISTRY_TYPE_DICTIONARY TO clearing; + +-- tradingClearingRegistryLevel - Справочник уровней торгово-клиринговых регистров +DROP TABLE IF EXISTS TRADING_CLEARING_REGISTRY_LEVEL_DICTIONARY; +CREATE TABLE TRADING_CLEARING_REGISTRY_LEVEL_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE TRADING_CLEARING_REGISTRY_LEVEL_DICTIONARY IS 'Справочник уровней торгово-клиринговых регистров'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LEVEL_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LEVEL_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LEVEL_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE TRADING_CLEARING_REGISTRY_LEVEL_DICTIONARY TO clearing; + +-- tradingClearingRegistryPurpose - Справочник областей применения +DROP TABLE IF EXISTS TRADING_CLEARING_REGISTRY_PURPOSE_DICTIONARY; +CREATE TABLE TRADING_CLEARING_REGISTRY_PURPOSE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE TRADING_CLEARING_REGISTRY_PURPOSE_DICTIONARY IS 'Справочник областей применения'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_PURPOSE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_PURPOSE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_PURPOSE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE TRADING_CLEARING_REGISTRY_PURPOSE_DICTIONARY TO clearing; + +-- service - Справочник услуг +DROP TABLE IF EXISTS SERVICE_DICTIONARY; +CREATE TABLE SERVICE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE SERVICE_DICTIONARY IS 'Справочник услуг'; + +COMMENT ON COLUMN SERVICE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN SERVICE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN SERVICE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE SERVICE_DICTIONARY TO clearing; + +-- serviceStatus - Справочник статусов услуг +DROP TABLE IF EXISTS SERVICE_STATUS_DICTIONARY; +CREATE TABLE SERVICE_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE SERVICE_STATUS_DICTIONARY IS 'Справочник статусов услуг'; + +COMMENT ON COLUMN SERVICE_STATUS_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN SERVICE_STATUS_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN SERVICE_STATUS_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE SERVICE_STATUS_DICTIONARY TO clearing; + +-- serviceProduct - Справочник продуктов для услуг +DROP TABLE IF EXISTS SERVICE_PRODUCT_DICTIONARY; +CREATE TABLE SERVICE_PRODUCT_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE SERVICE_PRODUCT_DICTIONARY IS 'Справочник продуктов для услуг'; + +COMMENT ON COLUMN SERVICE_PRODUCT_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN SERVICE_PRODUCT_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN SERVICE_PRODUCT_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE SERVICE_PRODUCT_DICTIONARY TO clearing; + +-- registryDesignation - Справочник символов регистров - назначения +DROP TABLE IF EXISTS REGISTRY_DESIGNATION_DICTIONARY; +CREATE TABLE REGISTRY_DESIGNATION_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE REGISTRY_DESIGNATION_DICTIONARY IS 'Справочник символов регистров - назначения'; + +COMMENT ON COLUMN REGISTRY_DESIGNATION_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN REGISTRY_DESIGNATION_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN REGISTRY_DESIGNATION_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE REGISTRY_DESIGNATION_DICTIONARY TO clearing; + +-- registryInstrumentType - Справочник символов регистров - инструменты +DROP TABLE IF EXISTS REGISTRY_INSTRUMENT_TYPE_DICTIONARY; +CREATE TABLE REGISTRY_INSTRUMENT_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE REGISTRY_INSTRUMENT_TYPE_DICTIONARY IS 'Справочник символов регистров - инструменты'; + +COMMENT ON COLUMN REGISTRY_INSTRUMENT_TYPE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN REGISTRY_INSTRUMENT_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN REGISTRY_INSTRUMENT_TYPE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE REGISTRY_INSTRUMENT_TYPE_DICTIONARY TO clearing; + +-- registryCapacity - Справочник символов регистров - источники средств +DROP TABLE IF EXISTS REGISTRY_CAPACITY_DICTIONARY; +CREATE TABLE REGISTRY_CAPACITY_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE REGISTRY_CAPACITY_DICTIONARY IS 'Справочник символов регистров - источники средств'; + +COMMENT ON COLUMN REGISTRY_CAPACITY_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN REGISTRY_CAPACITY_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN REGISTRY_CAPACITY_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE REGISTRY_CAPACITY_DICTIONARY TO clearing; + +-- registryUnit - Справочник символов регистров - части регистров +DROP TABLE IF EXISTS REGISTRY_UNIT_DICTIONARY; +CREATE TABLE REGISTRY_UNIT_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE REGISTRY_UNIT_DICTIONARY IS 'Справочник символов регистров - части регистров'; + +COMMENT ON COLUMN REGISTRY_UNIT_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN REGISTRY_UNIT_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN REGISTRY_UNIT_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE REGISTRY_UNIT_DICTIONARY TO clearing; + +-- registryCode - Справочник кодов регистров +DROP TABLE IF EXISTS REGISTRY_CODE_DICTIONARY; +CREATE TABLE REGISTRY_CODE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE REGISTRY_CODE_DICTIONARY IS 'Справочник кодов регистров'; + +COMMENT ON COLUMN REGISTRY_CODE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN REGISTRY_CODE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN REGISTRY_CODE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE REGISTRY_CODE_DICTIONARY TO clearing; + +-- registryStatus - Справочник статусов регистров +DROP TABLE IF EXISTS REGISTRY_STATUS_DICTIONARY; +CREATE TABLE REGISTRY_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE REGISTRY_STATUS_DICTIONARY IS 'Справочник статусов регистров'; + +COMMENT ON COLUMN REGISTRY_STATUS_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN REGISTRY_STATUS_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN REGISTRY_STATUS_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE REGISTRY_STATUS_DICTIONARY TO clearing; + +-- balanceDimension - Справочник размерностей балансов +DROP TABLE IF EXISTS BALANCE_DIMENSION_DICTIONARY; +CREATE TABLE BALANCE_DIMENSION_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE BALANCE_DIMENSION_DICTIONARY IS 'Справочник размерностей балансов'; + +COMMENT ON COLUMN BALANCE_DIMENSION_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN BALANCE_DIMENSION_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN BALANCE_DIMENSION_DICTIONARY.NAME IS 'Размерность баланса'; + +GRANT ALL PRIVILEGES ON TABLE BALANCE_DIMENSION_DICTIONARY TO clearing; + +-- accountType - Справочник типов счетов +DROP TABLE IF EXISTS ACCOUNT_TYPE_DICTIONARY; +CREATE TABLE ACCOUNT_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE ACCOUNT_TYPE_DICTIONARY IS 'Справочник типов счетов'; + +COMMENT ON COLUMN ACCOUNT_TYPE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN ACCOUNT_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN ACCOUNT_TYPE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE ACCOUNT_TYPE_DICTIONARY TO clearing; + +-- depoAccountType - Справочник типов депозитарных счетов +DROP TABLE IF EXISTS DEPO_ACCOUNT_TYPE_DICTIONARY; +CREATE TABLE DEPO_ACCOUNT_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE DEPO_ACCOUNT_TYPE_DICTIONARY IS 'Справочник типов депозитарных счетов'; + +COMMENT ON COLUMN DEPO_ACCOUNT_TYPE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN DEPO_ACCOUNT_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN DEPO_ACCOUNT_TYPE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE DEPO_ACCOUNT_TYPE_DICTIONARY TO clearing; + +-- clearingAccountType - Справочник типов клиринговых счетов +DROP TABLE IF EXISTS CLEARING_ACCOUNT_TYPE_DICTIONARY; +CREATE TABLE CLEARING_ACCOUNT_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE CLEARING_ACCOUNT_TYPE_DICTIONARY IS 'Справочник типов клиринговых счетов'; + +COMMENT ON COLUMN CLEARING_ACCOUNT_TYPE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN CLEARING_ACCOUNT_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN CLEARING_ACCOUNT_TYPE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE CLEARING_ACCOUNT_TYPE_DICTIONARY TO clearing; + +-- task - Справочник задач +DROP TABLE IF EXISTS TASK_DICTIONARY; +CREATE TABLE TASK_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(150)); +COMMENT ON TABLE TASK_DICTIONARY IS 'Справочник задач'; + +COMMENT ON COLUMN TASK_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN TASK_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN TASK_DICTIONARY.NAME IS 'Задача'; + +GRANT ALL PRIVILEGES ON TABLE TASK_DICTIONARY TO clearing; + +-- taskStatus - Справочник статусов задач +DROP TABLE IF EXISTS TASK_STATUS_DICTIONARY; +CREATE TABLE TASK_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE TASK_STATUS_DICTIONARY IS 'Справочник статусов задач'; + +COMMENT ON COLUMN TASK_STATUS_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN TASK_STATUS_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN TASK_STATUS_DICTIONARY.NAME IS 'Статус задачи'; + +GRANT ALL PRIVILEGES ON TABLE TASK_STATUS_DICTIONARY TO clearing; + +-- dayStatus - Справочник статусов дней +DROP TABLE IF EXISTS DAY_STATUS_DICTIONARY; +CREATE TABLE DAY_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE DAY_STATUS_DICTIONARY IS 'Справочник статусов дней'; + +COMMENT ON COLUMN DAY_STATUS_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN DAY_STATUS_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN DAY_STATUS_DICTIONARY.NAME IS 'Статус дня'; + +GRANT ALL PRIVILEGES ON TABLE DAY_STATUS_DICTIONARY TO clearing; + +-- parent - Справочник источников +DROP TABLE IF EXISTS PARENT_DICTIONARY; +CREATE TABLE PARENT_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE PARENT_DICTIONARY IS 'Справочник источников'; + +COMMENT ON COLUMN PARENT_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN PARENT_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN PARENT_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE PARENT_DICTIONARY TO clearing; + +-- sessionStatus - Справочник статусов клиринговых сессий +DROP TABLE IF EXISTS SESSION_STATUS_DICTIONARY; +CREATE TABLE SESSION_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +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 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE SESSION_STATUS_DICTIONARY TO clearing; + +-- sessionType - Справочник типов клиринговых сессий +DROP TABLE IF EXISTS SESSION_TYPE_DICTIONARY; +CREATE TABLE SESSION_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE SESSION_TYPE_DICTIONARY IS 'Справочник типов клиринговых сессий'; + +COMMENT ON COLUMN SESSION_TYPE_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN SESSION_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN SESSION_TYPE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE SESSION_TYPE_DICTIONARY TO clearing; + +-- moneyFlowSide - Справочник направлений денежного рынка +DROP TABLE IF EXISTS MONEY_FLOW_SIDE_DICTIONARY; +CREATE TABLE MONEY_FLOW_SIDE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE MONEY_FLOW_SIDE_DICTIONARY IS 'Справочник направлений денежного рынка'; + +COMMENT ON COLUMN MONEY_FLOW_SIDE_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN MONEY_FLOW_SIDE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN MONEY_FLOW_SIDE_DICTIONARY.NAME IS 'Значение'; + +GRANT ALL PRIVILEGES ON TABLE MONEY_FLOW_SIDE_DICTIONARY TO clearing; + +-- side - Справочник направлений +DROP TABLE IF EXISTS SIDE_DICTIONARY; +CREATE TABLE SIDE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE SIDE_DICTIONARY IS 'Справочник направлений'; + +COMMENT ON COLUMN SIDE_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN SIDE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN SIDE_DICTIONARY.NAME IS 'Значение'; + +GRANT ALL PRIVILEGES ON TABLE SIDE_DICTIONARY TO clearing; + +-- marketCode - Справочник кодов рынков +DROP TABLE IF EXISTS MARKET_CODE_DICTIONARY; +CREATE TABLE MARKET_CODE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE MARKET_CODE_DICTIONARY IS 'Справочник кодов рынков'; + +COMMENT ON COLUMN MARKET_CODE_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN MARKET_CODE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN MARKET_CODE_DICTIONARY.NAME IS 'Значение'; + +GRANT ALL PRIVILEGES ON TABLE MARKET_CODE_DICTIONARY TO clearing; + +-- marketType - Справочник типов торгов +DROP TABLE IF EXISTS MARKET_TYPE_DICTIONARY; +CREATE TABLE MARKET_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE MARKET_TYPE_DICTIONARY IS 'Справочник типов торгов'; + +COMMENT ON COLUMN MARKET_TYPE_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN MARKET_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN MARKET_TYPE_DICTIONARY.NAME IS 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE MARKET_TYPE_DICTIONARY TO clearing; + +-- statementType - Справочник типов поступлений/списаний от ПРЦ +DROP TABLE IF EXISTS STATEMENT_TYPE_DICTIONARY; +CREATE TABLE STATEMENT_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE STATEMENT_TYPE_DICTIONARY IS 'Справочник типов поступлений/списаний от ПРЦ'; + +COMMENT ON COLUMN STATEMENT_TYPE_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN STATEMENT_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN STATEMENT_TYPE_DICTIONARY.NAME IS 'Значение'; + +GRANT ALL PRIVILEGES ON TABLE STATEMENT_TYPE_DICTIONARY TO clearing; + +-- operationType - Справочник типов операций +DROP TABLE IF EXISTS OPERATION_TYPE_DICTIONARY; +CREATE TABLE OPERATION_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE OPERATION_TYPE_DICTIONARY IS 'Справочник типов операций'; + +COMMENT ON COLUMN OPERATION_TYPE_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN OPERATION_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN OPERATION_TYPE_DICTIONARY.NAME IS 'Значение'; + +GRANT ALL PRIVILEGES ON TABLE OPERATION_TYPE_DICTIONARY TO clearing; + +-- operationStatus - Справочник статусов операций +DROP TABLE IF EXISTS OPERATION_STATUS_DICTIONARY; +CREATE TABLE OPERATION_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE OPERATION_STATUS_DICTIONARY IS 'Справочник статусов операций'; + +COMMENT ON COLUMN OPERATION_STATUS_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN OPERATION_STATUS_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN OPERATION_STATUS_DICTIONARY.NAME IS 'Значение'; + +GRANT ALL PRIVILEGES ON TABLE OPERATION_STATUS_DICTIONARY TO clearing; + +-- inOutSDfType - Справочник типов входящих и исходящих записей +DROP TABLE IF EXISTS IN_OUT_S_DF_TYPE_DICTIONARY; +CREATE TABLE IN_OUT_S_DF_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE IN_OUT_S_DF_TYPE_DICTIONARY IS 'Справочник типов входящих и исходящих записей'; + +COMMENT ON COLUMN IN_OUT_S_DF_TYPE_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN IN_OUT_S_DF_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN IN_OUT_S_DF_TYPE_DICTIONARY.NAME IS 'Тип записи'; + +GRANT ALL PRIVILEGES ON TABLE IN_OUT_S_DF_TYPE_DICTIONARY TO clearing; + +-- inOutDirection - Справочник значений направлений денежного потока +DROP TABLE IF EXISTS IN_OUT_DIRECTION_DICTIONARY; +CREATE TABLE IN_OUT_DIRECTION_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE IN_OUT_DIRECTION_DICTIONARY IS 'Справочник значений направлений денежного потока'; + +COMMENT ON COLUMN IN_OUT_DIRECTION_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN IN_OUT_DIRECTION_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN IN_OUT_DIRECTION_DICTIONARY.NAME IS 'Значение'; + +GRANT ALL PRIVILEGES ON TABLE IN_OUT_DIRECTION_DICTIONARY TO clearing; + +-- transactionStatus - Справочник статусов транзакций +DROP TABLE IF EXISTS TRANSACTION_STATUS_DICTIONARY; +CREATE TABLE TRANSACTION_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(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 'Статус транзакции'; + +GRANT ALL PRIVILEGES ON TABLE TRANSACTION_STATUS_DICTIONARY TO clearing; + +-- objectType - Справочник типов объектов +DROP TABLE IF EXISTS OBJECT_TYPE_DICTIONARY; +CREATE TABLE OBJECT_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(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 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE OBJECT_TYPE_DICTIONARY TO clearing; + +-- notificationStatus - Справочник статусов сообщений +DROP TABLE IF EXISTS NOTIFICATION_STATUS_DICTIONARY; +CREATE TABLE NOTIFICATION_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(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 'Наименование'; + +GRANT ALL PRIVILEGES ON TABLE NOTIFICATION_STATUS_DICTIONARY TO clearing; + +-- managementJournalType - Справочник типов записей в журнале мониторинга и контроля +DROP TABLE IF EXISTS MANAGEMENT_JOURNAL_TYPE_DICTIONARY; +CREATE TABLE MANAGEMENT_JOURNAL_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE MANAGEMENT_JOURNAL_TYPE_DICTIONARY IS 'Справочник типов записей в журнале мониторинга и контроля'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL_TYPE_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL_TYPE_DICTIONARY.NAME IS 'Тип записи'; + +GRANT ALL PRIVILEGES ON TABLE MANAGEMENT_JOURNAL_TYPE_DICTIONARY TO clearing; + +-- managementJournalPurpose - Справочник целей записей в журнале мониторинга и контроля +DROP TABLE IF EXISTS MANAGEMENT_JOURNAL_PURPOSE_DICTIONARY; +CREATE TABLE MANAGEMENT_JOURNAL_PURPOSE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE MANAGEMENT_JOURNAL_PURPOSE_DICTIONARY IS 'Справочник целей записей в журнале мониторинга и контроля'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL_PURPOSE_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL_PURPOSE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL_PURPOSE_DICTIONARY.NAME IS 'Тип записи'; + +GRANT ALL PRIVILEGES ON TABLE MANAGEMENT_JOURNAL_PURPOSE_DICTIONARY TO clearing; + +-- managementJournalStatus - Справочник статусов журнала мониторинга и контроля +DROP TABLE IF EXISTS MANAGEMENT_JOURNAL_STATUS_DICTIONARY; +CREATE TABLE MANAGEMENT_JOURNAL_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE MANAGEMENT_JOURNAL_STATUS_DICTIONARY IS 'Справочник статусов журнала мониторинга и контроля'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL_STATUS_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL_STATUS_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL_STATUS_DICTIONARY.NAME IS 'Статус сообщения'; + +GRANT ALL PRIVILEGES ON TABLE MANAGEMENT_JOURNAL_STATUS_DICTIONARY TO clearing; + +-- majorSign - Справочник типов конвертируемости валюты +DROP TABLE IF EXISTS MAJOR_SIGN_DICTIONARY; +CREATE TABLE MAJOR_SIGN_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE MAJOR_SIGN_DICTIONARY IS 'Справочник типов конвертируемости валюты'; + +COMMENT ON COLUMN MAJOR_SIGN_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN MAJOR_SIGN_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN MAJOR_SIGN_DICTIONARY.NAME IS 'Наименование типа'; + +GRANT ALL PRIVILEGES ON TABLE MAJOR_SIGN_DICTIONARY TO clearing; + +-- courierType - Справочник способов доставки документа +DROP TABLE IF EXISTS COURIER_TYPE_DICTIONARY; +CREATE TABLE COURIER_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE COURIER_TYPE_DICTIONARY IS 'Справочник способов доставки документа'; + +COMMENT ON COLUMN COURIER_TYPE_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN COURIER_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN COURIER_TYPE_DICTIONARY.NAME IS 'Способ доставки'; + +GRANT ALL PRIVILEGES ON TABLE COURIER_TYPE_DICTIONARY TO clearing; + +-- currencySettlementType - Справочник типов расчетов валютных пар +DROP TABLE IF EXISTS CURRENCY_SETTLEMENT_TYPE_DICTIONARY; +CREATE TABLE CURRENCY_SETTLEMENT_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE CURRENCY_SETTLEMENT_TYPE_DICTIONARY IS 'Справочник типов расчетов валютных пар'; + +COMMENT ON COLUMN CURRENCY_SETTLEMENT_TYPE_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN CURRENCY_SETTLEMENT_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN CURRENCY_SETTLEMENT_TYPE_DICTIONARY.NAME IS 'Тип расчета'; + +GRANT ALL PRIVILEGES ON TABLE CURRENCY_SETTLEMENT_TYPE_DICTIONARY TO clearing; + +-- currencyPair - Справочник валютных пар +DROP TABLE IF EXISTS CURRENCY_PAIR_DICTIONARY; +CREATE TABLE CURRENCY_PAIR_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(25), BASE_CURRENCY varchar(4), QUOTE_CURRENCY varchar(4), MAJOR_SIGN varchar(4)); +COMMENT ON TABLE CURRENCY_PAIR_DICTIONARY IS 'Справочник валютных пар'; + +COMMENT ON COLUMN CURRENCY_PAIR_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN CURRENCY_PAIR_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN CURRENCY_PAIR_DICTIONARY.BASE_CURRENCY IS 'Код валюты лота (linked to currencyCode)'; + +COMMENT ON COLUMN CURRENCY_PAIR_DICTIONARY.QUOTE_CURRENCY IS 'Код сопряженной валюты (linked to currencyCode)'; + +COMMENT ON COLUMN CURRENCY_PAIR_DICTIONARY.MAJOR_SIGN IS 'Код признака конвертируемости валюты (linked to majorSign)'; + +GRANT ALL PRIVILEGES ON TABLE CURRENCY_PAIR_DICTIONARY TO clearing; + +-- gatewayResultStatus - Справочник статусов обработки +DROP TABLE IF EXISTS GATEWAY_RESULT_STATUS_DICTIONARY; +CREATE TABLE GATEWAY_RESULT_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE GATEWAY_RESULT_STATUS_DICTIONARY IS 'Справочник статусов обработки'; + +COMMENT ON COLUMN GATEWAY_RESULT_STATUS_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN GATEWAY_RESULT_STATUS_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN GATEWAY_RESULT_STATUS_DICTIONARY.NAME IS 'Статус обработки'; + +GRANT ALL PRIVILEGES ON TABLE GATEWAY_RESULT_STATUS_DICTIONARY TO clearing; + +-- resultStatus - Справочник статусов обработки +DROP TABLE IF EXISTS RESULT_STATUS_DICTIONARY; +CREATE TABLE RESULT_STATUS_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(255)); +COMMENT ON TABLE RESULT_STATUS_DICTIONARY IS 'Справочник статусов обработки'; + +COMMENT ON COLUMN RESULT_STATUS_DICTIONARY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN RESULT_STATUS_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN RESULT_STATUS_DICTIONARY.NAME IS 'Статус обработки'; + +GRANT ALL PRIVILEGES ON TABLE RESULT_STATUS_DICTIONARY TO clearing; + +-- eventType - Справочник типов изменений записей +DROP TABLE IF EXISTS EVENT_TYPE_DICTIONARY; +CREATE TABLE EVENT_TYPE_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE EVENT_TYPE_DICTIONARY IS 'Справочник типов изменений записей'; + +COMMENT ON COLUMN EVENT_TYPE_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN EVENT_TYPE_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN EVENT_TYPE_DICTIONARY.NAME IS 'Тип события'; + +GRANT ALL PRIVILEGES ON TABLE EVENT_TYPE_DICTIONARY TO clearing; + +-- priority - Справочник приоритетов отображения +DROP TABLE IF EXISTS PRIORITY_DICTIONARY; +CREATE TABLE PRIORITY_DICTIONARY(ID bigint PRIMARY KEY, CODE varchar(4), NAME varchar(50)); +COMMENT ON TABLE PRIORITY_DICTIONARY IS 'Справочник приоритетов отображения'; + +COMMENT ON COLUMN PRIORITY_DICTIONARY.ID IS 'Идентификатор'; + +COMMENT ON COLUMN PRIORITY_DICTIONARY.CODE IS 'Код'; + +COMMENT ON COLUMN PRIORITY_DICTIONARY.NAME IS 'Приоритет отображения'; + +GRANT ALL PRIVILEGES ON TABLE PRIORITY_DICTIONARY TO clearing; + +/* Business objects */ + +-- dbVersion - Версия базы данных +DROP TABLE IF EXISTS DB_VERSION; +CREATE TABLE DB_VERSION(ID bigint PRIMARY KEY, VERSION varchar(50)); +COMMENT ON TABLE DB_VERSION IS 'Версия базы данных'; + +COMMENT ON COLUMN DB_VERSION.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN DB_VERSION.VERSION IS 'Версия базы данных, привязанная к релизу'; + +GRANT ALL PRIVILEGES ON TABLE DB_VERSION TO clearing; + +-- userCls - Пользователь +DROP TABLE IF EXISTS USER_CLS; +CREATE TABLE USER_CLS(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, IDENTIFIER varchar(250), NAME varchar(250), FIRST_NAME varchar(250), LAST_NAME varchar(250), MIDDLE_NAME varchar(250), EMAIL varchar(250)); +COMMENT ON TABLE USER_CLS IS 'Пользователь'; + +COMMENT ON COLUMN USER_CLS.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN USER_CLS.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN USER_CLS.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN USER_CLS.IDENTIFIER IS 'Внешний идентификатор'; + +COMMENT ON COLUMN USER_CLS.NAME IS 'Имя и фамилия пользователя'; + +COMMENT ON COLUMN USER_CLS.FIRST_NAME IS 'Имя пользователя'; + +COMMENT ON COLUMN USER_CLS.LAST_NAME IS 'Фамилия пользователя'; + +COMMENT ON COLUMN USER_CLS.MIDDLE_NAME IS 'Отчество пользователя'; + +COMMENT ON COLUMN USER_CLS.EMAIL IS 'Email пользователя'; + +GRANT ALL PRIVILEGES ON TABLE USER_CLS TO clearing; + + +-- History log of userCls - Пользователь +DROP TABLE IF EXISTS USER_CLS_HISTORY; +CREATE TABLE USER_CLS_HISTORY(USER_CLS_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, IDENTIFIER varchar(250), NAME varchar(250), FIRST_NAME varchar(250), LAST_NAME varchar(250), MIDDLE_NAME varchar(250), EMAIL 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_CLS_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN USER_CLS_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN USER_CLS_HISTORY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN USER_CLS_HISTORY.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN USER_CLS_HISTORY.IDENTIFIER IS 'Внешний идентификатор'; + +COMMENT ON COLUMN USER_CLS_HISTORY.NAME IS 'Имя и фамилия пользователя'; + +COMMENT ON COLUMN USER_CLS_HISTORY.FIRST_NAME IS 'Имя пользователя'; + +COMMENT ON COLUMN USER_CLS_HISTORY.LAST_NAME IS 'Фамилия пользователя'; + +COMMENT ON COLUMN USER_CLS_HISTORY.MIDDLE_NAME IS 'Отчество пользователя'; + +COMMENT ON COLUMN USER_CLS_HISTORY.EMAIL IS 'Email пользователя'; + +GRANT ALL PRIVILEGES ON TABLE USER_CLS_HISTORY TO clearing; + +-- userRoleSession - Набор ролей +DROP TABLE IF EXISTS USER_ROLE_SESSION; +CREATE TABLE USER_ROLE_SESSION(ID bigint PRIMARY KEY, USER_ID bigint, USER_ROLE varchar(4), COMPANY_ID bigint, STATUS varchar(4)); +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 userCls)'; + +COMMENT ON COLUMN USER_ROLE_SESSION.USER_ROLE IS 'Код роли пользователя (linked to userRole)'; + +COMMENT ON COLUMN USER_ROLE_SESSION.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN USER_ROLE_SESSION.STATUS IS 'Код статуса (linked to workflowStatus)'; + +GRANT ALL PRIVILEGES ON TABLE USER_ROLE_SESSION TO clearing; + +-- userSettings - Настройки пользователя +DROP TABLE IF EXISTS USER_SETTINGS; +CREATE TABLE USER_SETTINGS(ID bigint PRIMARY KEY, USER_ID bigint, VERSION varchar(50), JSON varchar(200000)); +COMMENT ON TABLE USER_SETTINGS IS 'Настройки пользователя'; + +COMMENT ON COLUMN USER_SETTINGS.ID IS 'Идентификатор записи'; + +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 'Данные конфигурации'; + +GRANT ALL PRIVILEGES ON TABLE USER_SETTINGS TO clearing; + +-- userConnect - Активность пользователей в системе +DROP TABLE IF EXISTS USER_CONNECT; +CREATE TABLE USER_CONNECT(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, USER_ID bigint, CONNECTION_TIME timestamp, DISCONNECTION_TIME timestamp, SERVER_IP varchar(250), CLIENT_IP varchar(250), CONNECTION_STATE varchar(4), CLEARING_DATE date, ERROR_CODE_ID bigint, ERROR_TEXT_ID bigint); +COMMENT ON TABLE USER_CONNECT IS 'Активность пользователей в системе'; + +COMMENT ON COLUMN USER_CONNECT.ID IS 'Идентификатор записи'; + +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 userCls)'; + +COMMENT ON COLUMN USER_CONNECT.CONNECTION_TIME IS 'Последнее соединение'; + +COMMENT ON COLUMN USER_CONNECT.DISCONNECTION_TIME IS 'Разрыв соединения'; + +COMMENT ON COLUMN USER_CONNECT.SERVER_IP IS 'IP адрес сервера'; + +COMMENT ON COLUMN USER_CONNECT.CLIENT_IP IS 'IP адрес клиента'; + +COMMENT ON COLUMN USER_CONNECT.CONNECTION_STATE IS 'Код статуса соединения (linked to connectionState)'; + +COMMENT ON COLUMN USER_CONNECT.CLEARING_DATE IS 'Дата'; + +COMMENT ON COLUMN USER_CONNECT.ERROR_CODE_ID IS 'Идентификатор кода ошибки (linked to errorCode)'; + +COMMENT ON COLUMN USER_CONNECT.ERROR_TEXT_ID IS 'Идентификатор полного текста ошибки (linked to errorText)'; + +GRANT ALL PRIVILEGES ON TABLE USER_CONNECT TO clearing; + + +-- History log of userConnect - Активность пользователей в системе +DROP TABLE IF EXISTS USER_CONNECT_HISTORY; +CREATE TABLE USER_CONNECT_HISTORY(USER_CONNECT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, USER_ID bigint, CONNECTION_TIME timestamp, DISCONNECTION_TIME timestamp, SERVER_IP varchar(250), CLIENT_IP varchar(250), CONNECTION_STATE varchar(4), CLEARING_DATE date, ERROR_CODE_ID bigint, ERROR_TEXT_ID bigint); +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 'Дата и время изменения'; +COMMENT ON COLUMN USER_CONNECT_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN USER_CONNECT_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN USER_CONNECT_HISTORY.ID IS 'Идентификатор записи'; + +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 userCls)'; + +COMMENT ON COLUMN USER_CONNECT_HISTORY.CONNECTION_TIME IS 'Последнее соединение'; + +COMMENT ON COLUMN USER_CONNECT_HISTORY.DISCONNECTION_TIME IS 'Разрыв соединения'; + +COMMENT ON COLUMN USER_CONNECT_HISTORY.SERVER_IP IS 'IP адрес сервера'; + +COMMENT ON COLUMN USER_CONNECT_HISTORY.CLIENT_IP IS 'IP адрес клиента'; + +COMMENT ON COLUMN USER_CONNECT_HISTORY.CONNECTION_STATE IS 'Код статуса соединения (linked to connectionState)'; + +COMMENT ON COLUMN USER_CONNECT_HISTORY.CLEARING_DATE IS 'Дата'; + +COMMENT ON COLUMN USER_CONNECT_HISTORY.ERROR_CODE_ID IS 'Идентификатор кода ошибки (linked to errorCode)'; + +COMMENT ON COLUMN USER_CONNECT_HISTORY.ERROR_TEXT_ID IS 'Идентификатор полного текста ошибки (linked to errorText)'; + +GRANT ALL PRIVILEGES ON TABLE USER_CONNECT_HISTORY TO clearing; + +-- company - Компании +DROP TABLE IF EXISTS COMPANY; +CREATE TABLE COMPANY(SHORT_NAME varchar(255), FULL_NAME varchar(255), TRADING_CODE varchar(255), CLEARING_CODE varchar(255), REGISTRATION_CODE varchar(255), WORKFLOW_STATUS varchar(4), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE COMPANY IS 'Компании'; + +COMMENT ON COLUMN COMPANY.SHORT_NAME IS 'Краткое наименование компании'; + +COMMENT ON COLUMN COMPANY.FULL_NAME IS 'Полное наименование компании'; + +COMMENT ON COLUMN COMPANY.TRADING_CODE IS 'Код участника торгов'; + +COMMENT ON COLUMN COMPANY.CLEARING_CODE IS 'Код участника клиринга'; + +COMMENT ON COLUMN COMPANY.REGISTRATION_CODE IS 'Регистрационный код участника'; + +COMMENT ON COLUMN COMPANY.WORKFLOW_STATUS IS 'Код статуса (linked to workflowStatus)'; + +COMMENT ON COLUMN COMPANY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN COMPANY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN COMPANY.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE COMPANY TO clearing; + + +-- History log of company - Компании +DROP TABLE IF EXISTS COMPANY_HISTORY; +CREATE TABLE COMPANY_HISTORY(COMPANY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), SHORT_NAME varchar(255), FULL_NAME varchar(255), TRADING_CODE varchar(255), CLEARING_CODE varchar(255), REGISTRATION_CODE varchar(255), WORKFLOW_STATUS varchar(4), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE COMPANY_HISTORY IS 'История изменений таблицы company'; +COMMENT ON COLUMN COMPANY_HISTORY.COMPANY_ID IS 'Идентификатор записи в таблице COMPANY'; +COMMENT ON COLUMN COMPANY_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN COMPANY_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN COMPANY_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN COMPANY_HISTORY.SHORT_NAME IS 'Краткое наименование компании'; + +COMMENT ON COLUMN COMPANY_HISTORY.FULL_NAME IS 'Полное наименование компании'; + +COMMENT ON COLUMN COMPANY_HISTORY.TRADING_CODE IS 'Код участника торгов'; + +COMMENT ON COLUMN COMPANY_HISTORY.CLEARING_CODE IS 'Код участника клиринга'; + +COMMENT ON COLUMN COMPANY_HISTORY.REGISTRATION_CODE IS 'Регистрационный код участника'; + +COMMENT ON COLUMN COMPANY_HISTORY.WORKFLOW_STATUS IS 'Код статуса (linked to workflowStatus)'; + +COMMENT ON COLUMN COMPANY_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN COMPANY_HISTORY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN COMPANY_HISTORY.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE COMPANY_HISTORY TO clearing; + +-- companyInfo - Профили компаний +DROP TABLE IF EXISTS COMPANY_INFO; +CREATE TABLE COMPANY_INFO(COMPANY_ID bigint, CORPORATION_SOLE_TYPE varchar(4), COUNTRY_CODE varchar(4), DESCRIPTION varchar(255), PROFESSIONAL_SIGN varchar(4), LEGAL_KIND varchar(4), ORGANIZATION_TYPE varchar(4), RESIDENCE varchar(4), SHORT_NAME_ENG varchar(255), FULL_NAME_ENG varchar(255), ID bigint PRIMARY KEY); +COMMENT ON TABLE COMPANY_INFO IS 'Профили компаний'; + +COMMENT ON COLUMN COMPANY_INFO.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN COMPANY_INFO.CORPORATION_SOLE_TYPE IS 'Код единоличного исполнительного органа (linked to corporationSoleType)'; + +COMMENT ON COLUMN COMPANY_INFO.COUNTRY_CODE IS 'Код юрисдикции (linked to countryCode)'; + +COMMENT ON COLUMN COMPANY_INFO.DESCRIPTION IS 'Описание компании'; + +COMMENT ON COLUMN COMPANY_INFO.PROFESSIONAL_SIGN IS 'Код признака профессионального участника (linked to allowed)'; + +COMMENT ON COLUMN COMPANY_INFO.LEGAL_KIND IS 'Код вида субъекта (linked to legalKind)'; + +COMMENT ON COLUMN COMPANY_INFO.ORGANIZATION_TYPE IS 'Код типа организации (linked to organizationType)'; + +COMMENT ON COLUMN COMPANY_INFO.RESIDENCE IS 'Код резиденции (linked to countryCode)'; + +COMMENT ON COLUMN COMPANY_INFO.SHORT_NAME_ENG IS 'Краткое наименование компании на английском'; + +COMMENT ON COLUMN COMPANY_INFO.FULL_NAME_ENG IS 'Полное наименование компании на английском'; + +COMMENT ON COLUMN COMPANY_INFO.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE COMPANY_INFO TO clearing; + + +-- History log of companyInfo - Профили компаний +DROP TABLE IF EXISTS COMPANY_INFO_HISTORY; +CREATE TABLE COMPANY_INFO_HISTORY(COMPANY_INFO_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), COMPANY_ID bigint, CORPORATION_SOLE_TYPE varchar(4), COUNTRY_CODE varchar(4), DESCRIPTION varchar(255), PROFESSIONAL_SIGN varchar(4), LEGAL_KIND varchar(4), ORGANIZATION_TYPE varchar(4), RESIDENCE varchar(4), SHORT_NAME_ENG varchar(255), FULL_NAME_ENG varchar(255), ID bigint PRIMARY KEY); +COMMENT ON TABLE COMPANY_INFO_HISTORY IS 'История изменений таблицы companyInfo'; +COMMENT ON COLUMN COMPANY_INFO_HISTORY.COMPANY_INFO_ID IS 'Идентификатор записи в таблице COMPANY_INFO'; +COMMENT ON COLUMN COMPANY_INFO_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN COMPANY_INFO_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN COMPANY_INFO_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN COMPANY_INFO_HISTORY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN COMPANY_INFO_HISTORY.CORPORATION_SOLE_TYPE IS 'Код единоличного исполнительного органа (linked to corporationSoleType)'; + +COMMENT ON COLUMN COMPANY_INFO_HISTORY.COUNTRY_CODE IS 'Код юрисдикции (linked to countryCode)'; + +COMMENT ON COLUMN COMPANY_INFO_HISTORY.DESCRIPTION IS 'Описание компании'; + +COMMENT ON COLUMN COMPANY_INFO_HISTORY.PROFESSIONAL_SIGN IS 'Код признака профессионального участника (linked to allowed)'; + +COMMENT ON COLUMN COMPANY_INFO_HISTORY.LEGAL_KIND IS 'Код вида субъекта (linked to legalKind)'; + +COMMENT ON COLUMN COMPANY_INFO_HISTORY.ORGANIZATION_TYPE IS 'Код типа организации (linked to organizationType)'; + +COMMENT ON COLUMN COMPANY_INFO_HISTORY.RESIDENCE IS 'Код резиденции (linked to countryCode)'; + +COMMENT ON COLUMN COMPANY_INFO_HISTORY.SHORT_NAME_ENG IS 'Краткое наименование компании на английском'; + +COMMENT ON COLUMN COMPANY_INFO_HISTORY.FULL_NAME_ENG IS 'Полное наименование компании на английском'; + +COMMENT ON COLUMN COMPANY_INFO_HISTORY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE COMPANY_INFO_HISTORY TO clearing; + +-- clearingMemberCategory - Категории участника клиринга +DROP TABLE IF EXISTS CLEARING_MEMBER_CATEGORY; +CREATE TABLE CLEARING_MEMBER_CATEGORY(COMPANY_ID bigint, CLEARING_MEMBER_CATEGORY varchar(4), ID bigint PRIMARY KEY); +COMMENT ON TABLE CLEARING_MEMBER_CATEGORY 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.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE CLEARING_MEMBER_CATEGORY TO clearing; + + +-- History log of clearingMemberCategory - Категории участника клиринга +DROP TABLE IF EXISTS CLEARING_MEMBER_CATEGORY_HISTORY; +CREATE TABLE CLEARING_MEMBER_CATEGORY_HISTORY(CLEARING_MEMBER_CATEGORY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), COMPANY_ID bigint, CLEARING_MEMBER_CATEGORY varchar(4), ID bigint PRIMARY KEY); +COMMENT ON TABLE CLEARING_MEMBER_CATEGORY_HISTORY IS 'История изменений таблицы clearingMemberCategory'; +COMMENT ON COLUMN CLEARING_MEMBER_CATEGORY_HISTORY.CLEARING_MEMBER_CATEGORY_ID IS 'Идентификатор записи в таблице CLEARING_MEMBER_CATEGORY'; +COMMENT ON COLUMN CLEARING_MEMBER_CATEGORY_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN CLEARING_MEMBER_CATEGORY_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN CLEARING_MEMBER_CATEGORY_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN CLEARING_MEMBER_CATEGORY_HISTORY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN CLEARING_MEMBER_CATEGORY_HISTORY.CLEARING_MEMBER_CATEGORY IS 'Код категории участника клиринга (linked to clearingCategory)'; + +COMMENT ON COLUMN CLEARING_MEMBER_CATEGORY_HISTORY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE CLEARING_MEMBER_CATEGORY_HISTORY TO clearing; + +-- contact - Контакты компании +DROP TABLE IF EXISTS CONTACT; +CREATE TABLE CONTACT(COMPANY_ID bigint, CONTACT_TYPE varchar(4), CONTACT_VALUE varchar(255), ID bigint PRIMARY KEY); +COMMENT ON TABLE CONTACT IS 'Контакты компании'; + +COMMENT ON COLUMN CONTACT.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN CONTACT.CONTACT_TYPE IS 'Код типа контакта (linked to contactType)'; + +COMMENT ON COLUMN CONTACT.CONTACT_VALUE IS 'Значение контакта'; + +COMMENT ON COLUMN CONTACT.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE CONTACT TO clearing; + +-- profileDocument - Досье компании +DROP TABLE IF EXISTS PROFILE_DOCUMENT; +CREATE TABLE PROFILE_DOCUMENT(COMPANY_ID bigint, DOCUMENT_TYPE varchar(4), ISSUE_DATE date, ISSUE_PLACE varchar(255), ISSUER varchar(255), ISSUER_CODE varchar(255), NAME varchar(255), NUMBER varchar(255), PLACE varchar(255), VALID_FROM_DATE date, VALID_TO_DATE date, LINK varchar(255), ID bigint PRIMARY KEY); +COMMENT ON TABLE PROFILE_DOCUMENT IS 'Досье компании'; + +COMMENT ON COLUMN PROFILE_DOCUMENT.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN PROFILE_DOCUMENT.DOCUMENT_TYPE IS 'Код типа документа (linked to documentType)'; + +COMMENT ON COLUMN PROFILE_DOCUMENT.ISSUE_DATE IS 'Дата выдачи'; + +COMMENT ON COLUMN PROFILE_DOCUMENT.ISSUE_PLACE IS 'Место выдачи'; + +COMMENT ON COLUMN PROFILE_DOCUMENT.ISSUER IS 'Кем выдан'; + +COMMENT ON COLUMN PROFILE_DOCUMENT.ISSUER_CODE IS 'Код выдавшего органа'; + +COMMENT ON COLUMN PROFILE_DOCUMENT.NAME IS 'Наименование документа'; + +COMMENT ON COLUMN PROFILE_DOCUMENT.NUMBER IS 'Номер документа'; + +COMMENT ON COLUMN PROFILE_DOCUMENT.PLACE IS 'Место'; + +COMMENT ON COLUMN PROFILE_DOCUMENT.VALID_FROM_DATE IS 'Дата начала срока действия'; + +COMMENT ON COLUMN PROFILE_DOCUMENT.VALID_TO_DATE IS 'Дата окончания срока действия'; + +COMMENT ON COLUMN PROFILE_DOCUMENT.LINK IS 'Ссылка на документ'; + +COMMENT ON COLUMN PROFILE_DOCUMENT.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE PROFILE_DOCUMENT TO clearing; + + +-- History log of profileDocument - Досье компании +DROP TABLE IF EXISTS PROFILE_DOCUMENT_HISTORY; +CREATE TABLE PROFILE_DOCUMENT_HISTORY(PROFILE_DOCUMENT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), COMPANY_ID bigint, DOCUMENT_TYPE varchar(4), ISSUE_DATE date, ISSUE_PLACE varchar(255), ISSUER varchar(255), ISSUER_CODE varchar(255), NAME varchar(255), NUMBER varchar(255), PLACE varchar(255), VALID_FROM_DATE date, VALID_TO_DATE date, LINK varchar(255), ID bigint PRIMARY KEY); +COMMENT ON TABLE PROFILE_DOCUMENT_HISTORY IS 'История изменений таблицы profileDocument'; +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.PROFILE_DOCUMENT_ID IS 'Идентификатор записи в таблице PROFILE_DOCUMENT'; +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.DOCUMENT_TYPE IS 'Код типа документа (linked to documentType)'; + +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.ISSUE_DATE IS 'Дата выдачи'; + +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.ISSUE_PLACE IS 'Место выдачи'; + +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.ISSUER IS 'Кем выдан'; + +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.ISSUER_CODE IS 'Код выдавшего органа'; + +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.NAME IS 'Наименование документа'; + +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.NUMBER IS 'Номер документа'; + +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.PLACE IS 'Место'; + +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.VALID_FROM_DATE IS 'Дата начала срока действия'; + +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.VALID_TO_DATE IS 'Дата окончания срока действия'; + +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.LINK IS 'Ссылка на документ'; + +COMMENT ON COLUMN PROFILE_DOCUMENT_HISTORY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE PROFILE_DOCUMENT_HISTORY TO clearing; + +-- companySymbols - Реквизиты компании +DROP TABLE IF EXISTS COMPANY_SYMBOLS; +CREATE TABLE COMPANY_SYMBOLS(COMPANY_ID bigint, COMPANY_SYMBOL varchar(4), COMPANY_SYMBOL_VALUE varchar(255), ID bigint PRIMARY KEY); +COMMENT ON TABLE COMPANY_SYMBOLS IS 'Реквизиты компании'; + +COMMENT ON COLUMN COMPANY_SYMBOLS.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN COMPANY_SYMBOLS.COMPANY_SYMBOL IS 'Код типа реквизита (linked to companySymbol)'; + +COMMENT ON COLUMN COMPANY_SYMBOLS.COMPANY_SYMBOL_VALUE IS 'Значение реквизита'; + +COMMENT ON COLUMN COMPANY_SYMBOLS.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE COMPANY_SYMBOLS TO clearing; + + +-- History log of companySymbols - Реквизиты компании +DROP TABLE IF EXISTS COMPANY_SYMBOLS_HISTORY; +CREATE TABLE COMPANY_SYMBOLS_HISTORY(COMPANY_SYMBOLS_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), COMPANY_ID bigint, COMPANY_SYMBOL varchar(4), COMPANY_SYMBOL_VALUE varchar(255), ID bigint PRIMARY KEY); +COMMENT ON TABLE COMPANY_SYMBOLS_HISTORY IS 'История изменений таблицы companySymbols'; +COMMENT ON COLUMN COMPANY_SYMBOLS_HISTORY.COMPANY_SYMBOLS_ID IS 'Идентификатор записи в таблице COMPANY_SYMBOLS'; +COMMENT ON COLUMN COMPANY_SYMBOLS_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN COMPANY_SYMBOLS_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN COMPANY_SYMBOLS_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN COMPANY_SYMBOLS_HISTORY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN COMPANY_SYMBOLS_HISTORY.COMPANY_SYMBOL IS 'Код типа реквизита (linked to companySymbol)'; + +COMMENT ON COLUMN COMPANY_SYMBOLS_HISTORY.COMPANY_SYMBOL_VALUE IS 'Значение реквизита'; + +COMMENT ON COLUMN COMPANY_SYMBOLS_HISTORY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE COMPANY_SYMBOLS_HISTORY TO clearing; + +-- companyRoleSet - Таблица ролей компании +DROP TABLE IF EXISTS COMPANY_ROLE_SET; +CREATE TABLE COMPANY_ROLE_SET(COMPANY_ID bigint, COMPANY_ROLE varchar(4), WORKFLOW_STATUS varchar(4), ID bigint PRIMARY KEY); +COMMENT ON TABLE COMPANY_ROLE_SET IS 'Таблица ролей компании'; + +COMMENT ON COLUMN COMPANY_ROLE_SET.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN COMPANY_ROLE_SET.COMPANY_ROLE IS 'Код роли компании (linked to companyRole)'; + +COMMENT ON COLUMN COMPANY_ROLE_SET.WORKFLOW_STATUS IS 'Код статуса (linked to workflowStatus)'; + +COMMENT ON COLUMN COMPANY_ROLE_SET.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE COMPANY_ROLE_SET TO clearing; + +-- settlementHouseProperties - Параметры расчетной организации +DROP TABLE IF EXISTS SETTLEMENT_HOUSE_PROPERTIES; +CREATE TABLE SETTLEMENT_HOUSE_PROPERTIES(COMPANY_ID bigint, CURRENCY_CODE varchar(4), ID bigint PRIMARY KEY); +COMMENT ON TABLE SETTLEMENT_HOUSE_PROPERTIES IS 'Параметры расчетной организации'; + +COMMENT ON COLUMN SETTLEMENT_HOUSE_PROPERTIES.COMPANY_ID IS 'Наименование компании (linked to company)'; + +COMMENT ON COLUMN SETTLEMENT_HOUSE_PROPERTIES.CURRENCY_CODE IS 'Код валюты (linked to currencyCode)'; + +COMMENT ON COLUMN SETTLEMENT_HOUSE_PROPERTIES.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE SETTLEMENT_HOUSE_PROPERTIES TO clearing; + + +-- History log of settlementHouseProperties - Параметры расчетной организации +DROP TABLE IF EXISTS SETTLEMENT_HOUSE_PROPERTIES_HISTORY; +CREATE TABLE SETTLEMENT_HOUSE_PROPERTIES_HISTORY(SETTLEMENT_HOUSE_PROPERTIES_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), COMPANY_ID bigint, CURRENCY_CODE varchar(4), ID bigint PRIMARY KEY); +COMMENT ON TABLE SETTLEMENT_HOUSE_PROPERTIES_HISTORY IS 'История изменений таблицы settlementHouseProperties'; +COMMENT ON COLUMN SETTLEMENT_HOUSE_PROPERTIES_HISTORY.SETTLEMENT_HOUSE_PROPERTIES_ID IS 'Идентификатор записи в таблице SETTLEMENT_HOUSE_PROPERTIES'; +COMMENT ON COLUMN SETTLEMENT_HOUSE_PROPERTIES_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN SETTLEMENT_HOUSE_PROPERTIES_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN SETTLEMENT_HOUSE_PROPERTIES_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN SETTLEMENT_HOUSE_PROPERTIES_HISTORY.COMPANY_ID IS 'Наименование компании (linked to company)'; + +COMMENT ON COLUMN SETTLEMENT_HOUSE_PROPERTIES_HISTORY.CURRENCY_CODE IS 'Код валюты (linked to currencyCode)'; + +COMMENT ON COLUMN SETTLEMENT_HOUSE_PROPERTIES_HISTORY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE SETTLEMENT_HOUSE_PROPERTIES_HISTORY TO clearing; + +-- security - Инструменты +DROP TABLE IF EXISTS SECURITY; +CREATE TABLE SECURITY(ID bigint PRIMARY KEY, INSTRUMENT_TYPE varchar(4), ISSUER_ID bigint, SHORT_NAME varchar(255), FULL_NAME varchar(255), SHORT_NAME_ENG varchar(255), FULL_NAME_ENG varchar(255), SECURITY_SYMBOL varchar(255), ISIN varchar(50), WORKFLOW_STATUS varchar(4), UUID varchar(255), CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE SECURITY IS 'Инструменты'; + +COMMENT ON COLUMN SECURITY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN SECURITY.INSTRUMENT_TYPE IS 'Код типа инструмента (linked to instrumentType)'; + +COMMENT ON COLUMN SECURITY.ISSUER_ID IS 'Идентификатор эмитента (linked to company)'; + +COMMENT ON COLUMN SECURITY.SHORT_NAME IS 'Краткое наименование инструмента'; + +COMMENT ON COLUMN SECURITY.FULL_NAME IS 'Полное наименование инструмента'; + +COMMENT ON COLUMN SECURITY.SHORT_NAME_ENG IS 'Краткое наименование инструмента на английском'; + +COMMENT ON COLUMN SECURITY.FULL_NAME_ENG IS 'Полное наименование инструмента на английском'; + +COMMENT ON COLUMN SECURITY.SECURITY_SYMBOL IS 'Код инструмента'; + +COMMENT ON COLUMN SECURITY.ISIN IS 'Наименование инструмента ISIN'; + +COMMENT ON COLUMN SECURITY.WORKFLOW_STATUS IS 'Код статуса (linked to workflowStatus)'; + +COMMENT ON COLUMN SECURITY.UUID IS 'Идентификатор во внешней системе'; + +COMMENT ON COLUMN SECURITY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN SECURITY.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE SECURITY TO clearing; + + +-- History log of security - Инструменты +DROP TABLE IF EXISTS SECURITY_HISTORY; +CREATE TABLE SECURITY_HISTORY(SECURITY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ID bigint PRIMARY KEY, INSTRUMENT_TYPE varchar(4), ISSUER_ID bigint, SHORT_NAME varchar(255), FULL_NAME varchar(255), SHORT_NAME_ENG varchar(255), FULL_NAME_ENG varchar(255), SECURITY_SYMBOL varchar(255), ISIN varchar(50), WORKFLOW_STATUS varchar(4), UUID varchar(255), CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE SECURITY_HISTORY IS 'История изменений таблицы security'; +COMMENT ON COLUMN SECURITY_HISTORY.SECURITY_ID IS 'Идентификатор записи в таблице SECURITY'; +COMMENT ON COLUMN SECURITY_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN SECURITY_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN SECURITY_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN SECURITY_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN SECURITY_HISTORY.INSTRUMENT_TYPE IS 'Код типа инструмента (linked to instrumentType)'; + +COMMENT ON COLUMN SECURITY_HISTORY.ISSUER_ID IS 'Идентификатор эмитента (linked to company)'; + +COMMENT ON COLUMN SECURITY_HISTORY.SHORT_NAME IS 'Краткое наименование инструмента'; + +COMMENT ON COLUMN SECURITY_HISTORY.FULL_NAME IS 'Полное наименование инструмента'; + +COMMENT ON COLUMN SECURITY_HISTORY.SHORT_NAME_ENG IS 'Краткое наименование инструмента на английском'; + +COMMENT ON COLUMN SECURITY_HISTORY.FULL_NAME_ENG IS 'Полное наименование инструмента на английском'; + +COMMENT ON COLUMN SECURITY_HISTORY.SECURITY_SYMBOL IS 'Код инструмента'; + +COMMENT ON COLUMN SECURITY_HISTORY.ISIN IS 'Наименование инструмента ISIN'; + +COMMENT ON COLUMN SECURITY_HISTORY.WORKFLOW_STATUS IS 'Код статуса (linked to workflowStatus)'; + +COMMENT ON COLUMN SECURITY_HISTORY.UUID IS 'Идентификатор во внешней системе'; + +COMMENT ON COLUMN SECURITY_HISTORY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN SECURITY_HISTORY.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE SECURITY_HISTORY TO clearing; + +-- currency - Валюты +DROP TABLE IF EXISTS CURRENCY; +CREATE TABLE CURRENCY(COUNTRY_CODE varchar(4), CURRENCY_CODE varchar(4), ID bigint PRIMARY KEY); +COMMENT ON TABLE CURRENCY IS 'Валюты'; + +COMMENT ON COLUMN CURRENCY.COUNTRY_CODE IS 'Код страны (linked to countryCode)'; + +COMMENT ON COLUMN CURRENCY.CURRENCY_CODE IS 'Код валюты (linked to currencyCode)'; + +COMMENT ON COLUMN CURRENCY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE CURRENCY TO clearing; + + +-- History log of currency - Валюты +DROP TABLE IF EXISTS CURRENCY_HISTORY; +CREATE TABLE CURRENCY_HISTORY(CURRENCY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), COUNTRY_CODE varchar(4), CURRENCY_CODE varchar(4), ID bigint PRIMARY KEY); +COMMENT ON TABLE CURRENCY_HISTORY IS 'История изменений таблицы currency'; +COMMENT ON COLUMN CURRENCY_HISTORY.CURRENCY_ID IS 'Идентификатор записи в таблице CURRENCY'; +COMMENT ON COLUMN CURRENCY_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN CURRENCY_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN CURRENCY_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN CURRENCY_HISTORY.COUNTRY_CODE IS 'Код страны (linked to countryCode)'; + +COMMENT ON COLUMN CURRENCY_HISTORY.CURRENCY_CODE IS 'Код валюты (linked to currencyCode)'; + +COMMENT ON COLUMN CURRENCY_HISTORY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE CURRENCY_HISTORY TO clearing; + +-- moneyMarketSecurity - Спецификации Денежного рынка +DROP TABLE IF EXISTS MONEY_MARKET_SECURITY; +CREATE TABLE MONEY_MARKET_SECURITY(SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,18), NOMINAL_CURRENCY varchar(4), CONVENTION varchar(255), TERM_TYPE varchar(4), CLEARING_ORGANIZATION varchar(255), ID bigint PRIMARY KEY); +COMMENT ON TABLE MONEY_MARKET_SECURITY IS 'Спецификации Денежного рынка'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY.DESCRIPTION IS 'Описание'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY.START_DATE IS 'Дата начала действия'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY.END_DATE IS 'Дата окончания действия'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY.NOMINAL_VALUE IS 'Номинал'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY.NOMINAL_CURRENCY IS 'Код валюты номинала (linked to currencyCode)'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY.CONVENTION IS 'Нотация наименования инструмента'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY.TERM_TYPE IS 'Код вида инструмента (linked to termType)'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY.CLEARING_ORGANIZATION IS 'Клиринговая организация'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE MONEY_MARKET_SECURITY TO clearing; + + +-- History log of moneyMarketSecurity - Спецификации Денежного рынка +DROP TABLE IF EXISTS MONEY_MARKET_SECURITY_HISTORY; +CREATE TABLE MONEY_MARKET_SECURITY_HISTORY(MONEY_MARKET_SECURITY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,18), NOMINAL_CURRENCY varchar(4), CONVENTION varchar(255), TERM_TYPE varchar(4), CLEARING_ORGANIZATION varchar(255), ID bigint PRIMARY KEY); +COMMENT ON TABLE MONEY_MARKET_SECURITY_HISTORY IS 'История изменений таблицы moneyMarketSecurity'; +COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.MONEY_MARKET_SECURITY_ID IS 'Идентификатор записи в таблице MONEY_MARKET_SECURITY'; +COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.DESCRIPTION IS 'Описание'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.START_DATE IS 'Дата начала действия'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.END_DATE IS 'Дата окончания действия'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.NOMINAL_VALUE IS 'Номинал'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.NOMINAL_CURRENCY IS 'Код валюты номинала (linked to currencyCode)'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.CONVENTION IS 'Нотация наименования инструмента'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.TERM_TYPE IS 'Код вида инструмента (linked to termType)'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.CLEARING_ORGANIZATION IS 'Клиринговая организация'; + +COMMENT ON COLUMN MONEY_MARKET_SECURITY_HISTORY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE MONEY_MARKET_SECURITY_HISTORY TO clearing; + +-- tradedMoneyMarketSecurity - Спецификации денежного рынка, учавствующие в сделках +DROP TABLE IF EXISTS TRADED_MONEY_MARKET_SECURITY; +CREATE TABLE TRADED_MONEY_MARKET_SECURITY(SECURITY_ID bigint, SECURITY_CODE varchar(255), ID bigint PRIMARY KEY); +COMMENT ON TABLE TRADED_MONEY_MARKET_SECURITY IS 'Спецификации денежного рынка, учавствующие в сделках'; + +COMMENT ON COLUMN TRADED_MONEY_MARKET_SECURITY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN TRADED_MONEY_MARKET_SECURITY.SECURITY_CODE IS 'Полный код инструмента со сроком'; + +COMMENT ON COLUMN TRADED_MONEY_MARKET_SECURITY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE TRADED_MONEY_MARKET_SECURITY TO clearing; + +-- equitySecurity - Акции +DROP TABLE IF EXISTS EQUITY_SECURITY; +CREATE TABLE EQUITY_SECURITY(SECURITY_ID bigint, SHARE_TYPE varchar(4), ID bigint PRIMARY KEY); +COMMENT ON TABLE EQUITY_SECURITY IS 'Акции'; + +COMMENT ON COLUMN EQUITY_SECURITY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN EQUITY_SECURITY.SHARE_TYPE IS 'Код типа акции (linked to shareType)'; + +COMMENT ON COLUMN EQUITY_SECURITY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE EQUITY_SECURITY TO clearing; + + +-- History log of equitySecurity - Акции +DROP TABLE IF EXISTS EQUITY_SECURITY_HISTORY; +CREATE TABLE EQUITY_SECURITY_HISTORY(EQUITY_SECURITY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), SECURITY_ID bigint, SHARE_TYPE varchar(4), ID bigint PRIMARY KEY); +COMMENT ON TABLE EQUITY_SECURITY_HISTORY IS 'История изменений таблицы equitySecurity'; +COMMENT ON COLUMN EQUITY_SECURITY_HISTORY.EQUITY_SECURITY_ID IS 'Идентификатор записи в таблице EQUITY_SECURITY'; +COMMENT ON COLUMN EQUITY_SECURITY_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN EQUITY_SECURITY_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN EQUITY_SECURITY_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN EQUITY_SECURITY_HISTORY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN EQUITY_SECURITY_HISTORY.SHARE_TYPE IS 'Код типа акции (linked to shareType)'; + +COMMENT ON COLUMN EQUITY_SECURITY_HISTORY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE EQUITY_SECURITY_HISTORY TO clearing; + +-- fixedIncomeSecurity - Облигации +DROP TABLE IF EXISTS FIXED_INCOME_SECURITY; +CREATE TABLE FIXED_INCOME_SECURITY(SECURITY_ID bigint, BOND_TYPE varchar(4), MATURITY_DATE date, NOMINAL_FOR_DATE numeric(72,18), NOMINAL_VALUE numeric(72,18), NOMINAL_CURRENCY varchar(4), COUPON numeric(72,18), COUPON_FREQUENCY bigint, ID bigint PRIMARY KEY); +COMMENT ON TABLE FIXED_INCOME_SECURITY IS 'Облигации'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY.BOND_TYPE IS 'Код типа облигации (linked to bondType)'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY.MATURITY_DATE IS 'Дата погашения'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY.NOMINAL_FOR_DATE IS 'Текущее значение номинала'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY.NOMINAL_VALUE IS 'Номинал инструмента'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY.NOMINAL_CURRENCY IS 'Код валюты номинала (linked to currencyCode)'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY.COUPON IS 'Купон'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY.COUPON_FREQUENCY IS 'Длительность купона'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE FIXED_INCOME_SECURITY TO clearing; + + +-- History log of fixedIncomeSecurity - Облигации +DROP TABLE IF EXISTS FIXED_INCOME_SECURITY_HISTORY; +CREATE TABLE FIXED_INCOME_SECURITY_HISTORY(FIXED_INCOME_SECURITY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), SECURITY_ID bigint, BOND_TYPE varchar(4), MATURITY_DATE date, NOMINAL_FOR_DATE numeric(72,18), NOMINAL_VALUE numeric(72,18), NOMINAL_CURRENCY varchar(4), COUPON numeric(72,18), COUPON_FREQUENCY bigint, ID bigint PRIMARY KEY); +COMMENT ON TABLE FIXED_INCOME_SECURITY_HISTORY IS 'История изменений таблицы fixedIncomeSecurity'; +COMMENT ON COLUMN FIXED_INCOME_SECURITY_HISTORY.FIXED_INCOME_SECURITY_ID IS 'Идентификатор записи в таблице FIXED_INCOME_SECURITY'; +COMMENT ON COLUMN FIXED_INCOME_SECURITY_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN FIXED_INCOME_SECURITY_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN FIXED_INCOME_SECURITY_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY_HISTORY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY_HISTORY.BOND_TYPE IS 'Код типа облигации (linked to bondType)'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY_HISTORY.MATURITY_DATE IS 'Дата погашения'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY_HISTORY.NOMINAL_FOR_DATE IS 'Текущее значение номинала'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY_HISTORY.NOMINAL_VALUE IS 'Номинал инструмента'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY_HISTORY.NOMINAL_CURRENCY IS 'Код валюты номинала (linked to currencyCode)'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY_HISTORY.COUPON IS 'Купон'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY_HISTORY.COUPON_FREQUENCY IS 'Длительность купона'; + +COMMENT ON COLUMN FIXED_INCOME_SECURITY_HISTORY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE FIXED_INCOME_SECURITY_HISTORY TO clearing; + +-- fixedIncomeCashFlow - Выплаты по купонам +DROP TABLE IF EXISTS FIXED_INCOME_CASH_FLOW; +CREATE TABLE FIXED_INCOME_CASH_FLOW(SECURITY_ID bigint, ACCRUED_COUPON numeric(72,2), NOMINAL_VALUE numeric(72,18), NUMBER bigint, VALUE_DATE date, ID bigint PRIMARY KEY); +COMMENT ON TABLE FIXED_INCOME_CASH_FLOW IS 'Выплаты по купонам'; + +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW.ACCRUED_COUPON IS 'Купон'; + +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW.NOMINAL_VALUE IS 'Номинал'; + +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW.NUMBER IS 'Номер купона'; + +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW.VALUE_DATE IS 'Дата выплаты купона'; + +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE FIXED_INCOME_CASH_FLOW TO clearing; + + +-- History log of fixedIncomeCashFlow - Выплаты по купонам +DROP TABLE IF EXISTS FIXED_INCOME_CASH_FLOW_HISTORY; +CREATE TABLE FIXED_INCOME_CASH_FLOW_HISTORY(FIXED_INCOME_CASH_FLOW_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), SECURITY_ID bigint, ACCRUED_COUPON numeric(72,2), NOMINAL_VALUE numeric(72,18), NUMBER bigint, VALUE_DATE date, ID bigint PRIMARY KEY); +COMMENT ON TABLE FIXED_INCOME_CASH_FLOW_HISTORY IS 'История изменений таблицы fixedIncomeCashFlow'; +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW_HISTORY.FIXED_INCOME_CASH_FLOW_ID IS 'Идентификатор записи в таблице FIXED_INCOME_CASH_FLOW'; +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW_HISTORY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW_HISTORY.ACCRUED_COUPON IS 'Купон'; + +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW_HISTORY.NOMINAL_VALUE IS 'Номинал'; + +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW_HISTORY.NUMBER IS 'Номер купона'; + +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW_HISTORY.VALUE_DATE IS 'Дата выплаты купона'; + +COMMENT ON COLUMN FIXED_INCOME_CASH_FLOW_HISTORY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE FIXED_INCOME_CASH_FLOW_HISTORY TO clearing; + +-- couponPeriod - Купонное расписание +DROP TABLE IF EXISTS COUPON_PERIOD; +CREATE TABLE COUPON_PERIOD(SECURITY_ID bigint, COUPON_RATE numeric(72,2), NUMBER bigint, PERIOD_START_DATE date, PERIOD_END_DATE date, ID bigint PRIMARY KEY); +COMMENT ON TABLE COUPON_PERIOD IS 'Купонное расписание'; + +COMMENT ON COLUMN COUPON_PERIOD.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN COUPON_PERIOD.COUPON_RATE IS 'Купонная ставка'; + +COMMENT ON COLUMN COUPON_PERIOD.NUMBER IS 'Номер купона'; + +COMMENT ON COLUMN COUPON_PERIOD.PERIOD_START_DATE IS 'Начало периода действия'; + +COMMENT ON COLUMN COUPON_PERIOD.PERIOD_END_DATE IS 'Окончание периода действия'; + +COMMENT ON COLUMN COUPON_PERIOD.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE COUPON_PERIOD TO clearing; + + +-- History log of couponPeriod - Купонное расписание +DROP TABLE IF EXISTS COUPON_PERIOD_HISTORY; +CREATE TABLE COUPON_PERIOD_HISTORY(COUPON_PERIOD_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), SECURITY_ID bigint, COUPON_RATE numeric(72,2), NUMBER bigint, PERIOD_START_DATE date, PERIOD_END_DATE date, ID bigint PRIMARY KEY); +COMMENT ON TABLE COUPON_PERIOD_HISTORY IS 'История изменений таблицы couponPeriod'; +COMMENT ON COLUMN COUPON_PERIOD_HISTORY.COUPON_PERIOD_ID IS 'Идентификатор записи в таблице COUPON_PERIOD'; +COMMENT ON COLUMN COUPON_PERIOD_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN COUPON_PERIOD_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN COUPON_PERIOD_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN COUPON_PERIOD_HISTORY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN COUPON_PERIOD_HISTORY.COUPON_RATE IS 'Купонная ставка'; + +COMMENT ON COLUMN COUPON_PERIOD_HISTORY.NUMBER IS 'Номер купона'; + +COMMENT ON COLUMN COUPON_PERIOD_HISTORY.PERIOD_START_DATE IS 'Начало периода действия'; + +COMMENT ON COLUMN COUPON_PERIOD_HISTORY.PERIOD_END_DATE IS 'Окончание периода действия'; + +COMMENT ON COLUMN COUPON_PERIOD_HISTORY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE COUPON_PERIOD_HISTORY TO clearing; + +-- listing - Инструменты на режимах +DROP TABLE IF EXISTS LISTING; +CREATE TABLE LISTING(SECURITY_ID bigint, MARKET varchar(4), LOT_SIZE numeric(72,2), SYMBOL_CODE varchar(255), SYMBOL_NAME varchar(255), TRADING_CURRENCY varchar(4), WORKFLOW_STATUS varchar(4), MIN_STEP numeric(72,2), PRECISION numeric(72,2), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE LISTING IS 'Инструменты на режимах'; + +COMMENT ON COLUMN LISTING.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN LISTING.MARKET IS 'Код торговой секции (linked to market)'; + +COMMENT ON COLUMN LISTING.LOT_SIZE IS 'Размер лота'; + +COMMENT ON COLUMN LISTING.SYMBOL_CODE IS 'Код инструмента на торговой площадке'; + +COMMENT ON COLUMN LISTING.SYMBOL_NAME IS 'Наименование инструмента на торговой площадке'; + +COMMENT ON COLUMN LISTING.TRADING_CURRENCY IS 'Код валюты расчета (linked to currencyCode)'; + +COMMENT ON COLUMN LISTING.WORKFLOW_STATUS IS 'Код статуса листинга в системе (linked to workflowStatus)'; + +COMMENT ON COLUMN LISTING.MIN_STEP IS 'Шаг цены'; + +COMMENT ON COLUMN LISTING.PRECISION IS 'Точность'; + +COMMENT ON COLUMN LISTING.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN LISTING.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN LISTING.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE LISTING TO clearing; + + +-- History log of listing - Инструменты на режимах +DROP TABLE IF EXISTS LISTING_HISTORY; +CREATE TABLE LISTING_HISTORY(LISTING_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), SECURITY_ID bigint, MARKET varchar(4), LOT_SIZE numeric(72,2), SYMBOL_CODE varchar(255), SYMBOL_NAME varchar(255), TRADING_CURRENCY varchar(4), WORKFLOW_STATUS varchar(4), MIN_STEP numeric(72,2), PRECISION numeric(72,2), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE LISTING_HISTORY IS 'История изменений таблицы listing'; +COMMENT ON COLUMN LISTING_HISTORY.LISTING_ID IS 'Идентификатор записи в таблице LISTING'; +COMMENT ON COLUMN LISTING_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN LISTING_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN LISTING_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN LISTING_HISTORY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN LISTING_HISTORY.MARKET IS 'Код торговой секции (linked to market)'; + +COMMENT ON COLUMN LISTING_HISTORY.LOT_SIZE IS 'Размер лота'; + +COMMENT ON COLUMN LISTING_HISTORY.SYMBOL_CODE IS 'Код инструмента на торговой площадке'; + +COMMENT ON COLUMN LISTING_HISTORY.SYMBOL_NAME IS 'Наименование инструмента на торговой площадке'; + +COMMENT ON COLUMN LISTING_HISTORY.TRADING_CURRENCY IS 'Код валюты расчета (linked to currencyCode)'; + +COMMENT ON COLUMN LISTING_HISTORY.WORKFLOW_STATUS IS 'Код статуса листинга в системе (linked to workflowStatus)'; + +COMMENT ON COLUMN LISTING_HISTORY.MIN_STEP IS 'Шаг цены'; + +COMMENT ON COLUMN LISTING_HISTORY.PRECISION IS 'Точность'; + +COMMENT ON COLUMN LISTING_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN LISTING_HISTORY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN LISTING_HISTORY.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE LISTING_HISTORY TO clearing; + +-- currencyPairSecurity - Инструменты валютного рынка +DROP TABLE IF EXISTS CURRENCY_PAIR_SECURITY; +CREATE TABLE CURRENCY_PAIR_SECURITY(ID bigint PRIMARY KEY, CURRENCY_PAIR_ID bigint, BASE_UNIT_SIZE numeric(72,2), CODE varchar(255), SETTLEMENT_TYPE varchar(4), CLEARING_ORGANIZATION varchar(255), SECURITY_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE CURRENCY_PAIR_SECURITY IS 'Инструменты валютного рынка'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY.CURRENCY_PAIR_ID IS 'Валютная пара (linked to currencyPair)'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY.BASE_UNIT_SIZE IS 'Количество валюты лота'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY.CODE IS 'Наименование валютной пары (linked to currencyPair)'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY.SETTLEMENT_TYPE IS 'Тип расчета (linked to currencySettlementType)'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY.CLEARING_ORGANIZATION IS 'Наименование клиринговой организации'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY.SECURITY_ID IS 'Наименование инструмента (linked to security)'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY.CREATED_AT IS 'Время создания записи'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY.UPDATED_AT IS 'Время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE CURRENCY_PAIR_SECURITY TO clearing; + + +-- History log of currencyPairSecurity - Инструменты валютного рынка +DROP TABLE IF EXISTS CURRENCY_PAIR_SECURITY_HISTORY; +CREATE TABLE CURRENCY_PAIR_SECURITY_HISTORY(CURRENCY_PAIR_SECURITY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ID bigint PRIMARY KEY, CURRENCY_PAIR_ID bigint, BASE_UNIT_SIZE numeric(72,2), CODE varchar(255), SETTLEMENT_TYPE varchar(4), CLEARING_ORGANIZATION varchar(255), SECURITY_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE CURRENCY_PAIR_SECURITY_HISTORY IS 'История изменений таблицы currencyPairSecurity'; +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY_HISTORY.CURRENCY_PAIR_SECURITY_ID IS 'Идентификатор записи в таблице CURRENCY_PAIR_SECURITY'; +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY_HISTORY.CURRENCY_PAIR_ID IS 'Валютная пара (linked to currencyPair)'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY_HISTORY.BASE_UNIT_SIZE IS 'Количество валюты лота'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY_HISTORY.CODE IS 'Наименование валютной пары (linked to currencyPair)'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY_HISTORY.SETTLEMENT_TYPE IS 'Тип расчета (linked to currencySettlementType)'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY_HISTORY.CLEARING_ORGANIZATION IS 'Наименование клиринговой организации'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY_HISTORY.SECURITY_ID IS 'Наименование инструмента (linked to security)'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY_HISTORY.CREATED_AT IS 'Время создания записи'; + +COMMENT ON COLUMN CURRENCY_PAIR_SECURITY_HISTORY.UPDATED_AT IS 'Время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE CURRENCY_PAIR_SECURITY_HISTORY TO clearing; + +-- market - Рынки +DROP TABLE IF EXISTS MARKET; +CREATE TABLE MARKET(DESCRIPTION varchar(255), EXCHANGE_ID bigint, NAME varchar(255), CODE varchar(10), SETTLEMENT_CURRENCY varchar(4), SECTION varchar(4), MARKET_TYPE varchar(4), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE MARKET IS 'Рынки'; + +COMMENT ON COLUMN MARKET.DESCRIPTION IS 'Описание'; + +COMMENT ON COLUMN MARKET.EXCHANGE_ID IS 'Идентификатор площадки (linked to company)'; + +COMMENT ON COLUMN MARKET.NAME IS 'Наименование рынка'; + +COMMENT ON COLUMN MARKET.CODE IS 'Код рынка'; + +COMMENT ON COLUMN MARKET.SETTLEMENT_CURRENCY IS 'Код валюты расчета (linked to currencyCode)'; + +COMMENT ON COLUMN MARKET.SECTION IS 'Код секции (linked to section)'; + +COMMENT ON COLUMN MARKET.MARKET_TYPE IS 'Тип торгов на рынке (linked to marketType)'; + +COMMENT ON COLUMN MARKET.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN MARKET.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN MARKET.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE MARKET TO clearing; + + +-- History log of market - Рынки +DROP TABLE IF EXISTS MARKET_HISTORY; +CREATE TABLE MARKET_HISTORY(MARKET_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), DESCRIPTION varchar(255), EXCHANGE_ID bigint, NAME varchar(255), CODE varchar(10), SETTLEMENT_CURRENCY varchar(4), SECTION varchar(4), MARKET_TYPE varchar(4), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE MARKET_HISTORY IS 'История изменений таблицы market'; +COMMENT ON COLUMN MARKET_HISTORY.MARKET_ID IS 'Идентификатор записи в таблице MARKET'; +COMMENT ON COLUMN MARKET_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN MARKET_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN MARKET_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN MARKET_HISTORY.DESCRIPTION IS 'Описание'; + +COMMENT ON COLUMN MARKET_HISTORY.EXCHANGE_ID IS 'Идентификатор площадки (linked to company)'; + +COMMENT ON COLUMN MARKET_HISTORY.NAME IS 'Наименование рынка'; + +COMMENT ON COLUMN MARKET_HISTORY.CODE IS 'Код рынка'; + +COMMENT ON COLUMN MARKET_HISTORY.SETTLEMENT_CURRENCY IS 'Код валюты расчета (linked to currencyCode)'; + +COMMENT ON COLUMN MARKET_HISTORY.SECTION IS 'Код секции (linked to section)'; + +COMMENT ON COLUMN MARKET_HISTORY.MARKET_TYPE IS 'Тип торгов на рынке (linked to marketType)'; + +COMMENT ON COLUMN MARKET_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN MARKET_HISTORY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN MARKET_HISTORY.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE MARKET_HISTORY TO clearing; + +-- errorText - Полные тексты ошибок +DROP TABLE IF EXISTS ERROR_TEXT; +CREATE TABLE ERROR_TEXT(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, ERROR_CODE_ID bigint, TEXT varchar(255), USER_ID bigint, CLEARING_DATE date); +COMMENT ON TABLE ERROR_TEXT IS 'Полные тексты ошибок'; + +COMMENT ON COLUMN ERROR_TEXT.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN ERROR_TEXT.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN ERROR_TEXT.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN ERROR_TEXT.ERROR_CODE_ID IS 'Идентификатор кода ошибки (linked to errorCode)'; + +COMMENT ON COLUMN ERROR_TEXT.TEXT IS 'Полный текст ошибки'; + +COMMENT ON COLUMN ERROR_TEXT.USER_ID IS 'Идентификатор автора сообщения (linked to userCls)'; + +COMMENT ON COLUMN ERROR_TEXT.CLEARING_DATE IS 'Текущая дата'; + +GRANT ALL PRIVILEGES ON TABLE ERROR_TEXT TO clearing; + +-- clientCode - Коды клиентов компании +DROP TABLE IF EXISTS CLIENT_CODE; +CREATE TABLE CLIENT_CODE(ID bigint PRIMARY KEY, COMPANY_ID bigint, CODE varchar(255), TRADING_CLEARING_REGISTRY_ID bigint, MONEY_ACCOUNT_ID bigint, DEPO_ACCOUNT_ID bigint, CURRENCY_ACCOUNT_ID bigint, STATUS varchar(4), CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE CLIENT_CODE IS 'Коды клиентов компании'; + +COMMENT ON COLUMN CLIENT_CODE.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN CLIENT_CODE.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN CLIENT_CODE.CODE IS 'Код клиента'; + +COMMENT ON COLUMN CLIENT_CODE.TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN CLIENT_CODE.MONEY_ACCOUNT_ID IS 'Идентификатор денежного счета (linked to account)'; + +COMMENT ON COLUMN CLIENT_CODE.DEPO_ACCOUNT_ID IS 'Идентификатор депозитарного счета (linked to account)'; + +COMMENT ON COLUMN CLIENT_CODE.CURRENCY_ACCOUNT_ID IS 'Идентификатор валютного счета (linked to account)'; + +COMMENT ON COLUMN CLIENT_CODE.STATUS IS 'Код статуса (linked to workflowStatus)'; + +COMMENT ON COLUMN CLIENT_CODE.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN CLIENT_CODE.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE CLIENT_CODE TO clearing; + + +-- History log of clientCode - Коды клиентов компании +DROP TABLE IF EXISTS CLIENT_CODE_HISTORY; +CREATE TABLE CLIENT_CODE_HISTORY(CLIENT_CODE_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ID bigint PRIMARY KEY, COMPANY_ID bigint, CODE varchar(255), TRADING_CLEARING_REGISTRY_ID bigint, MONEY_ACCOUNT_ID bigint, DEPO_ACCOUNT_ID bigint, CURRENCY_ACCOUNT_ID bigint, STATUS varchar(4), CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE CLIENT_CODE_HISTORY IS 'История изменений таблицы clientCode'; +COMMENT ON COLUMN CLIENT_CODE_HISTORY.CLIENT_CODE_ID IS 'Идентификатор записи в таблице CLIENT_CODE'; +COMMENT ON COLUMN CLIENT_CODE_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN CLIENT_CODE_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN CLIENT_CODE_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN CLIENT_CODE_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN CLIENT_CODE_HISTORY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN CLIENT_CODE_HISTORY.CODE IS 'Код клиента'; + +COMMENT ON COLUMN CLIENT_CODE_HISTORY.TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN CLIENT_CODE_HISTORY.MONEY_ACCOUNT_ID IS 'Идентификатор денежного счета (linked to account)'; + +COMMENT ON COLUMN CLIENT_CODE_HISTORY.DEPO_ACCOUNT_ID IS 'Идентификатор депозитарного счета (linked to account)'; + +COMMENT ON COLUMN CLIENT_CODE_HISTORY.CURRENCY_ACCOUNT_ID IS 'Идентификатор валютного счета (linked to account)'; + +COMMENT ON COLUMN CLIENT_CODE_HISTORY.STATUS IS 'Код статуса (linked to workflowStatus)'; + +COMMENT ON COLUMN CLIENT_CODE_HISTORY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN CLIENT_CODE_HISTORY.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE CLIENT_CODE_HISTORY TO clearing; + +-- tradingClearingRegistry - Торгово-клиринговый регистр +DROP TABLE IF EXISTS TRADING_CLEARING_REGISTRY; +CREATE TABLE TRADING_CLEARING_REGISTRY(ID bigint PRIMARY KEY, COMPANY_ID bigint, CODE varchar(255), MONEY_ACCOUNT_ID bigint, DEPO_ACCOUNT_ID bigint, TRADING_CLEARING_REGISTRY_TYPE varchar(4), TRADING_CLEARING_REGISTRY_LEVEL varchar(4), TRADING_CLEARING_REGISTRY_PURPOSE varchar(4), STATUS varchar(4), CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY.CODE IS 'Код торгово-клирингового регистра'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY.MONEY_ACCOUNT_ID IS 'Идентификатор денежного счета (linked to account)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY.DEPO_ACCOUNT_ID IS 'Идентификатор депозитарного счета (linked to account)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY.TRADING_CLEARING_REGISTRY_TYPE IS 'Код торгово-клирингового регистра (linked to tradingClearingRegistryType)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY.TRADING_CLEARING_REGISTRY_LEVEL IS 'Код торгово-клирингового регистра (linked to tradingClearingRegistryLevel)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY.TRADING_CLEARING_REGISTRY_PURPOSE IS 'Код области применения (linked to tradingClearingRegistryPurpose)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY.STATUS IS 'Код статуса (linked to serviceStatus)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE TRADING_CLEARING_REGISTRY TO clearing; + + +-- History log of tradingClearingRegistry - Торгово-клиринговый регистр +DROP TABLE IF EXISTS TRADING_CLEARING_REGISTRY_HISTORY; +CREATE TABLE TRADING_CLEARING_REGISTRY_HISTORY(TRADING_CLEARING_REGISTRY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ID bigint PRIMARY KEY, COMPANY_ID bigint, CODE varchar(255), MONEY_ACCOUNT_ID bigint, DEPO_ACCOUNT_ID bigint, TRADING_CLEARING_REGISTRY_TYPE varchar(4), TRADING_CLEARING_REGISTRY_LEVEL varchar(4), TRADING_CLEARING_REGISTRY_PURPOSE varchar(4), STATUS varchar(4), CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE TRADING_CLEARING_REGISTRY_HISTORY IS 'История изменений таблицы tradingClearingRegistry'; +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_HISTORY.TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор записи в таблице TRADING_CLEARING_REGISTRY'; +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_HISTORY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_HISTORY.CODE IS 'Код торгово-клирингового регистра'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_HISTORY.MONEY_ACCOUNT_ID IS 'Идентификатор денежного счета (linked to account)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_HISTORY.DEPO_ACCOUNT_ID IS 'Идентификатор депозитарного счета (linked to account)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_HISTORY.TRADING_CLEARING_REGISTRY_TYPE IS 'Код торгово-клирингового регистра (linked to tradingClearingRegistryType)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_HISTORY.TRADING_CLEARING_REGISTRY_LEVEL IS 'Код торгово-клирингового регистра (linked to tradingClearingRegistryLevel)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_HISTORY.TRADING_CLEARING_REGISTRY_PURPOSE IS 'Код области применения (linked to tradingClearingRegistryPurpose)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_HISTORY.STATUS IS 'Код статуса (linked to serviceStatus)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_HISTORY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_HISTORY.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE TRADING_CLEARING_REGISTRY_HISTORY TO clearing; + +-- tradingClearingRegistryList - Список счетов ТКР +DROP TABLE IF EXISTS TRADING_CLEARING_REGISTRY_LIST; +CREATE TABLE TRADING_CLEARING_REGISTRY_LIST(TRADING_CLEARING_REGISTRY_ID bigint, ACCOUNT_ID bigint, CURRENCY varchar(4), STATUS varchar(4), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE TRADING_CLEARING_REGISTRY_LIST IS 'Список счетов ТКР'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST.TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST.ACCOUNT_ID IS 'Идентификатор валютного счета (linked to account)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST.CURRENCY IS 'Код валюты (linked to currencyCode)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST.STATUS IS 'Код статуса (linked to serviceStatus)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST.CREATED_AT IS 'Дата и время создания записи'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST.UPDATED_AT IS 'Дата и время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE TRADING_CLEARING_REGISTRY_LIST TO clearing; + + +-- History log of tradingClearingRegistryList - Список счетов ТКР +DROP TABLE IF EXISTS TRADING_CLEARING_REGISTRY_LIST_HISTORY; +CREATE TABLE TRADING_CLEARING_REGISTRY_LIST_HISTORY(TRADING_CLEARING_REGISTRY_LIST_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), TRADING_CLEARING_REGISTRY_ID bigint, ACCOUNT_ID bigint, CURRENCY varchar(4), STATUS varchar(4), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE TRADING_CLEARING_REGISTRY_LIST_HISTORY IS 'История изменений таблицы tradingClearingRegistryList'; +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST_HISTORY.TRADING_CLEARING_REGISTRY_LIST_ID IS 'Идентификатор записи в таблице TRADING_CLEARING_REGISTRY_LIST'; +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST_HISTORY.TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST_HISTORY.ACCOUNT_ID IS 'Идентификатор валютного счета (linked to account)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST_HISTORY.CURRENCY IS 'Код валюты (linked to currencyCode)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST_HISTORY.STATUS IS 'Код статуса (linked to serviceStatus)'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST_HISTORY.CREATED_AT IS 'Дата и время создания записи'; + +COMMENT ON COLUMN TRADING_CLEARING_REGISTRY_LIST_HISTORY.UPDATED_AT IS 'Дата и время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE TRADING_CLEARING_REGISTRY_LIST_HISTORY TO clearing; + +-- registry - Регистр активов, обязательств и требований УК +DROP TABLE IF EXISTS REGISTRY; +CREATE TABLE REGISTRY(COMPANY_ID bigint, TRADING_CODE varchar(255), CLEARING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), ACCOUNT_ID bigint, ACCOUNT_TYPE varchar(4), ACCOUNT varchar(50), REGISTRY_DESIGNATION varchar(4), REGISTRY_INSTRUMENT_TYPE varchar(4), REGISTRY_CAPACITY varchar(4), REGISTRY_UNIT varchar(4), REGISTRY_CODE varchar(4), TRADING_CLEARING_REGISTRY_ID bigint, TRADING_CLEARING_REGISTRY varchar(50), REGISTRY_STATUS varchar(4), SECURITY_SYMBOL varchar(255), BALANCE numeric(72,18), OPEN_BALANCE numeric(72,18), CLOSE_BALANCE numeric(72,18), CREDIT numeric(72,18), DEBIT numeric(72,18), SETTLED_CREDIT numeric(72,18), SETTLED_DEBIT numeric(72,18), CHECK_BALANCE numeric(72,18), DIFF_BALANCE numeric(72,18), PLAN_BALANCE numeric(72,18), BALANCE_DIMENSION varchar(4), SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), TRADING_DATE date, CLEARING_DATE date, REFUND_DATE date, VALUE_DATE date, PRICE numeric(72,18), CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COMMENT varchar(255), PARENT_ID bigint, GROUP_ID bigint, SESSION_ID bigint, SESSION_TYPE varchar(4), PAYMENT_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SECURITY_ID bigint); +COMMENT ON TABLE REGISTRY IS 'Регистр активов, обязательств и требований УК'; + +COMMENT ON COLUMN REGISTRY.COMPANY_ID IS 'Идентификатор участника (linked to company)'; + +COMMENT ON COLUMN REGISTRY.TRADING_CODE IS 'Торговый код участника'; + +COMMENT ON COLUMN REGISTRY.CLEARING_CODE IS 'Клиринговый код участника'; + +COMMENT ON COLUMN REGISTRY.SHORT_NAME IS 'Краткое наименование компании'; + +COMMENT ON COLUMN REGISTRY.FULL_NAME IS 'Полное наименование участника'; + +COMMENT ON COLUMN REGISTRY.ACCOUNT_ID IS 'Идентификатор счета (linked to account)'; + +COMMENT ON COLUMN REGISTRY.ACCOUNT_TYPE IS 'Код типа счета (linked to accountType)'; + +COMMENT ON COLUMN REGISTRY.ACCOUNT IS 'Номер счета'; + +COMMENT ON COLUMN REGISTRY.REGISTRY_DESIGNATION IS 'Код назначения (linked to registryDesignation)'; + +COMMENT ON COLUMN REGISTRY.REGISTRY_INSTRUMENT_TYPE IS 'Код типа инструмента (linked to registryInstrumentType)'; + +COMMENT ON COLUMN REGISTRY.REGISTRY_CAPACITY IS 'Код принадлежности регистра (linked to registryCapacity)'; + +COMMENT ON COLUMN REGISTRY.REGISTRY_UNIT IS 'Код части регистра (linked to registryUnit)'; + +COMMENT ON COLUMN REGISTRY.REGISTRY_CODE IS 'Код регистра (linked to registryCode)'; + +COMMENT ON COLUMN REGISTRY.TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN REGISTRY.TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр'; + +COMMENT ON COLUMN REGISTRY.REGISTRY_STATUS IS 'Код статуса (linked to registryStatus)'; + +COMMENT ON COLUMN REGISTRY.SECURITY_SYMBOL IS 'Код инструмента'; + +COMMENT ON COLUMN REGISTRY.BALANCE IS 'Текущий баланс'; + +COMMENT ON COLUMN REGISTRY.OPEN_BALANCE IS 'Начальная сумма после расчетной организации'; + +COMMENT ON COLUMN REGISTRY.CLOSE_BALANCE IS 'Конечная сумма остатков ден. средств на счете'; + +COMMENT ON COLUMN REGISTRY.CREDIT IS 'Зачисления'; + +COMMENT ON COLUMN REGISTRY.DEBIT IS 'Списания'; + +COMMENT ON COLUMN REGISTRY.SETTLED_CREDIT IS 'Зачисления по расчетам'; + +COMMENT ON COLUMN REGISTRY.SETTLED_DEBIT IS 'Списания по расчетам'; + +COMMENT ON COLUMN REGISTRY.CHECK_BALANCE IS 'Сверочный баланс'; + +COMMENT ON COLUMN REGISTRY.DIFF_BALANCE IS 'Расхождение в балансе'; + +COMMENT ON COLUMN REGISTRY.PLAN_BALANCE IS 'Плановый баланс'; + +COMMENT ON COLUMN REGISTRY.BALANCE_DIMENSION IS 'Код единицы измерения (linked to balanceDimension)'; + +COMMENT ON COLUMN REGISTRY.SETTLEMENT_DATE IS 'Дата расчета'; + +COMMENT ON COLUMN REGISTRY.SETTLEMENT_CODE IS 'Код расчетов при размещении'; + +COMMENT ON COLUMN REGISTRY.TRADING_DATE IS 'Дата торгов'; + +COMMENT ON COLUMN REGISTRY.CLEARING_DATE IS 'Дата клиринга'; + +COMMENT ON COLUMN REGISTRY.REFUND_DATE IS 'Дата возврата депозита'; + +COMMENT ON COLUMN REGISTRY.VALUE_DATE IS 'Дата оплаты вклада депозита'; + +COMMENT ON COLUMN REGISTRY.PRICE IS 'Ставка по депозиту'; + +COMMENT ON COLUMN REGISTRY.CONTRACT IS 'Продукт'; + +COMMENT ON COLUMN REGISTRY.COUNTER_PARTY_ID IS 'Идентификатор компании-партнера (linked to company)'; + +COMMENT ON COLUMN REGISTRY.COMMENT IS 'Комментарий'; + +COMMENT ON COLUMN REGISTRY.PARENT_ID IS 'Идентификатор родительского депозита'; + +COMMENT ON COLUMN REGISTRY.GROUP_ID IS 'Идентификатор группы связанных регистров'; + +COMMENT ON COLUMN REGISTRY.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +COMMENT ON COLUMN REGISTRY.SESSION_TYPE IS 'Код типа клиринговой сессии (linked to sessionType)'; + +COMMENT ON COLUMN REGISTRY.PAYMENT_ID IS 'Идентификатор платежа'; + +COMMENT ON COLUMN REGISTRY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN REGISTRY.CREATED_AT IS 'Дата и время создания записи'; + +COMMENT ON COLUMN REGISTRY.UPDATED_AT IS 'Дата и время изменения записи'; + +COMMENT ON COLUMN REGISTRY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +GRANT ALL PRIVILEGES ON TABLE REGISTRY TO clearing; + + +-- History log of registry - Регистр активов, обязательств и требований УК +DROP TABLE IF EXISTS REGISTRY_HISTORY; +CREATE TABLE REGISTRY_HISTORY(REGISTRY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), COMPANY_ID bigint, TRADING_CODE varchar(255), CLEARING_CODE varchar(255), SHORT_NAME varchar(255), FULL_NAME varchar(255), ACCOUNT_ID bigint, ACCOUNT_TYPE varchar(4), ACCOUNT varchar(50), REGISTRY_DESIGNATION varchar(4), REGISTRY_INSTRUMENT_TYPE varchar(4), REGISTRY_CAPACITY varchar(4), REGISTRY_UNIT varchar(4), REGISTRY_CODE varchar(4), TRADING_CLEARING_REGISTRY_ID bigint, TRADING_CLEARING_REGISTRY varchar(50), REGISTRY_STATUS varchar(4), SECURITY_SYMBOL varchar(255), BALANCE numeric(72,18), OPEN_BALANCE numeric(72,18), CLOSE_BALANCE numeric(72,18), CREDIT numeric(72,18), DEBIT numeric(72,18), SETTLED_CREDIT numeric(72,18), SETTLED_DEBIT numeric(72,18), CHECK_BALANCE numeric(72,18), DIFF_BALANCE numeric(72,18), PLAN_BALANCE numeric(72,18), BALANCE_DIMENSION varchar(4), SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), TRADING_DATE date, CLEARING_DATE date, REFUND_DATE date, VALUE_DATE date, PRICE numeric(72,18), CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COMMENT varchar(255), PARENT_ID bigint, GROUP_ID bigint, SESSION_ID bigint, SESSION_TYPE varchar(4), PAYMENT_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SECURITY_ID bigint); +COMMENT ON TABLE REGISTRY_HISTORY IS 'История изменений таблицы registry'; +COMMENT ON COLUMN REGISTRY_HISTORY.REGISTRY_ID IS 'Идентификатор записи в таблице REGISTRY'; +COMMENT ON COLUMN REGISTRY_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN REGISTRY_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN REGISTRY_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN REGISTRY_HISTORY.COMPANY_ID IS 'Идентификатор участника (linked to company)'; + +COMMENT ON COLUMN REGISTRY_HISTORY.TRADING_CODE IS 'Торговый код участника'; + +COMMENT ON COLUMN REGISTRY_HISTORY.CLEARING_CODE IS 'Клиринговый код участника'; + +COMMENT ON COLUMN REGISTRY_HISTORY.SHORT_NAME IS 'Краткое наименование компании'; + +COMMENT ON COLUMN REGISTRY_HISTORY.FULL_NAME IS 'Полное наименование участника'; + +COMMENT ON COLUMN REGISTRY_HISTORY.ACCOUNT_ID IS 'Идентификатор счета (linked to account)'; + +COMMENT ON COLUMN REGISTRY_HISTORY.ACCOUNT_TYPE IS 'Код типа счета (linked to accountType)'; + +COMMENT ON COLUMN REGISTRY_HISTORY.ACCOUNT IS 'Номер счета'; + +COMMENT ON COLUMN REGISTRY_HISTORY.REGISTRY_DESIGNATION IS 'Код назначения (linked to registryDesignation)'; + +COMMENT ON COLUMN REGISTRY_HISTORY.REGISTRY_INSTRUMENT_TYPE IS 'Код типа инструмента (linked to registryInstrumentType)'; + +COMMENT ON COLUMN REGISTRY_HISTORY.REGISTRY_CAPACITY IS 'Код принадлежности регистра (linked to registryCapacity)'; + +COMMENT ON COLUMN REGISTRY_HISTORY.REGISTRY_UNIT IS 'Код части регистра (linked to registryUnit)'; + +COMMENT ON COLUMN REGISTRY_HISTORY.REGISTRY_CODE IS 'Код регистра (linked to registryCode)'; + +COMMENT ON COLUMN REGISTRY_HISTORY.TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN REGISTRY_HISTORY.TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр'; + +COMMENT ON COLUMN REGISTRY_HISTORY.REGISTRY_STATUS IS 'Код статуса (linked to registryStatus)'; + +COMMENT ON COLUMN REGISTRY_HISTORY.SECURITY_SYMBOL IS 'Код инструмента'; + +COMMENT ON COLUMN REGISTRY_HISTORY.BALANCE IS 'Текущий баланс'; + +COMMENT ON COLUMN REGISTRY_HISTORY.OPEN_BALANCE IS 'Начальная сумма после расчетной организации'; + +COMMENT ON COLUMN REGISTRY_HISTORY.CLOSE_BALANCE IS 'Конечная сумма остатков ден. средств на счете'; + +COMMENT ON COLUMN REGISTRY_HISTORY.CREDIT IS 'Зачисления'; + +COMMENT ON COLUMN REGISTRY_HISTORY.DEBIT IS 'Списания'; + +COMMENT ON COLUMN REGISTRY_HISTORY.SETTLED_CREDIT IS 'Зачисления по расчетам'; + +COMMENT ON COLUMN REGISTRY_HISTORY.SETTLED_DEBIT IS 'Списания по расчетам'; + +COMMENT ON COLUMN REGISTRY_HISTORY.CHECK_BALANCE IS 'Сверочный баланс'; + +COMMENT ON COLUMN REGISTRY_HISTORY.DIFF_BALANCE IS 'Расхождение в балансе'; + +COMMENT ON COLUMN REGISTRY_HISTORY.PLAN_BALANCE IS 'Плановый баланс'; + +COMMENT ON COLUMN REGISTRY_HISTORY.BALANCE_DIMENSION IS 'Код единицы измерения (linked to balanceDimension)'; + +COMMENT ON COLUMN REGISTRY_HISTORY.SETTLEMENT_DATE IS 'Дата расчета'; + +COMMENT ON COLUMN REGISTRY_HISTORY.SETTLEMENT_CODE IS 'Код расчетов при размещении'; + +COMMENT ON COLUMN REGISTRY_HISTORY.TRADING_DATE IS 'Дата торгов'; + +COMMENT ON COLUMN REGISTRY_HISTORY.CLEARING_DATE IS 'Дата клиринга'; + +COMMENT ON COLUMN REGISTRY_HISTORY.REFUND_DATE IS 'Дата возврата депозита'; + +COMMENT ON COLUMN REGISTRY_HISTORY.VALUE_DATE IS 'Дата оплаты вклада депозита'; + +COMMENT ON COLUMN REGISTRY_HISTORY.PRICE IS 'Ставка по депозиту'; + +COMMENT ON COLUMN REGISTRY_HISTORY.CONTRACT IS 'Продукт'; + +COMMENT ON COLUMN REGISTRY_HISTORY.COUNTER_PARTY_ID IS 'Идентификатор компании-партнера (linked to company)'; + +COMMENT ON COLUMN REGISTRY_HISTORY.COMMENT IS 'Комментарий'; + +COMMENT ON COLUMN REGISTRY_HISTORY.PARENT_ID IS 'Идентификатор родительского депозита'; + +COMMENT ON COLUMN REGISTRY_HISTORY.GROUP_ID IS 'Идентификатор группы связанных регистров'; + +COMMENT ON COLUMN REGISTRY_HISTORY.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +COMMENT ON COLUMN REGISTRY_HISTORY.SESSION_TYPE IS 'Код типа клиринговой сессии (linked to sessionType)'; + +COMMENT ON COLUMN REGISTRY_HISTORY.PAYMENT_ID IS 'Идентификатор платежа'; + +COMMENT ON COLUMN REGISTRY_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN REGISTRY_HISTORY.CREATED_AT IS 'Дата и время создания записи'; + +COMMENT ON COLUMN REGISTRY_HISTORY.UPDATED_AT IS 'Дата и время изменения записи'; + +COMMENT ON COLUMN REGISTRY_HISTORY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +GRANT ALL PRIVILEGES ON TABLE REGISTRY_HISTORY TO clearing; + +-- account - Счета +DROP TABLE IF EXISTS ACCOUNT; +CREATE TABLE ACCOUNT(ACCOUNT varchar(50), ACCOUNT_TYPE varchar(4), RELATION_ID bigint, CURRENCY varchar(4), STATUS varchar(4), PROCESSING_SIGN varchar(4), COMPANY_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE ACCOUNT IS 'Счета'; + +COMMENT ON COLUMN ACCOUNT.ACCOUNT IS 'Номер счета'; + +COMMENT ON COLUMN ACCOUNT.ACCOUNT_TYPE IS 'Код типа счета (linked to accountType)'; + +COMMENT ON COLUMN ACCOUNT.RELATION_ID IS 'Идентификатор договорных отношений (linked to relation)'; + +COMMENT ON COLUMN ACCOUNT.CURRENCY IS 'Код валюты (linked to currencyCode)'; + +COMMENT ON COLUMN ACCOUNT.STATUS IS 'Код статуса (linked to serviceStatus)'; + +COMMENT ON COLUMN ACCOUNT.PROCESSING_SIGN IS 'Код признака обработки счета (linked to allowed)'; + +COMMENT ON COLUMN ACCOUNT.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN ACCOUNT.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN ACCOUNT.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN ACCOUNT.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE ACCOUNT TO clearing; + + +-- History log of account - Счета +DROP TABLE IF EXISTS ACCOUNT_HISTORY; +CREATE TABLE ACCOUNT_HISTORY(ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ACCOUNT varchar(50), ACCOUNT_TYPE varchar(4), RELATION_ID bigint, CURRENCY varchar(4), STATUS varchar(4), PROCESSING_SIGN varchar(4), COMPANY_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE ACCOUNT_HISTORY IS 'История изменений таблицы account'; +COMMENT ON COLUMN ACCOUNT_HISTORY.ACCOUNT_ID IS 'Идентификатор записи в таблице ACCOUNT'; +COMMENT ON COLUMN ACCOUNT_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN ACCOUNT_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN ACCOUNT_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN ACCOUNT_HISTORY.ACCOUNT IS 'Номер счета'; + +COMMENT ON COLUMN ACCOUNT_HISTORY.ACCOUNT_TYPE IS 'Код типа счета (linked to accountType)'; + +COMMENT ON COLUMN ACCOUNT_HISTORY.RELATION_ID IS 'Идентификатор договорных отношений (linked to relation)'; + +COMMENT ON COLUMN ACCOUNT_HISTORY.CURRENCY IS 'Код валюты (linked to currencyCode)'; + +COMMENT ON COLUMN ACCOUNT_HISTORY.STATUS IS 'Код статуса (linked to serviceStatus)'; + +COMMENT ON COLUMN ACCOUNT_HISTORY.PROCESSING_SIGN IS 'Код признака обработки счета (linked to allowed)'; + +COMMENT ON COLUMN ACCOUNT_HISTORY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN ACCOUNT_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN ACCOUNT_HISTORY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN ACCOUNT_HISTORY.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE ACCOUNT_HISTORY TO clearing; + +-- relation - Доступ в секцию +DROP TABLE IF EXISTS RELATION; +CREATE TABLE RELATION(CONSUMER_ID bigint, SUPPLIER_ID bigint, SERVICE_STATUS varchar(4), SERVICE varchar(4), SERVICE_PRODUCT varchar(4), COMMENT varchar(255), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE RELATION IS 'Доступ в секцию'; + +COMMENT ON COLUMN RELATION.CONSUMER_ID IS 'Идентификатор компании пользователя услуги (linked to company)'; + +COMMENT ON COLUMN RELATION.SUPPLIER_ID IS 'Идентификатор компании поставщика услуги (linked to company)'; + +COMMENT ON COLUMN RELATION.SERVICE_STATUS IS 'Код статуса (linked to serviceStatus)'; + +COMMENT ON COLUMN RELATION.SERVICE IS 'Код услуги (linked to service)'; + +COMMENT ON COLUMN RELATION.SERVICE_PRODUCT IS 'Код продукта (linked to serviceProduct)'; + +COMMENT ON COLUMN RELATION.COMMENT IS 'Текст причины'; + +COMMENT ON COLUMN RELATION.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN RELATION.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN RELATION.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE RELATION TO clearing; + + +-- History log of relation - Доступ в секцию +DROP TABLE IF EXISTS RELATION_HISTORY; +CREATE TABLE RELATION_HISTORY(RELATION_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), CONSUMER_ID bigint, SUPPLIER_ID bigint, SERVICE_STATUS varchar(4), SERVICE varchar(4), SERVICE_PRODUCT varchar(4), COMMENT varchar(255), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE RELATION_HISTORY IS 'История изменений таблицы relation'; +COMMENT ON COLUMN RELATION_HISTORY.RELATION_ID IS 'Идентификатор записи в таблице RELATION'; +COMMENT ON COLUMN RELATION_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN RELATION_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN RELATION_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN RELATION_HISTORY.CONSUMER_ID IS 'Идентификатор компании пользователя услуги (linked to company)'; + +COMMENT ON COLUMN RELATION_HISTORY.SUPPLIER_ID IS 'Идентификатор компании поставщика услуги (linked to company)'; + +COMMENT ON COLUMN RELATION_HISTORY.SERVICE_STATUS IS 'Код статуса (linked to serviceStatus)'; + +COMMENT ON COLUMN RELATION_HISTORY.SERVICE IS 'Код услуги (linked to service)'; + +COMMENT ON COLUMN RELATION_HISTORY.SERVICE_PRODUCT IS 'Код продукта (linked to serviceProduct)'; + +COMMENT ON COLUMN RELATION_HISTORY.COMMENT IS 'Текст причины'; + +COMMENT ON COLUMN RELATION_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN RELATION_HISTORY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN RELATION_HISTORY.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE RELATION_HISTORY TO clearing; + +-- bankAccount - Счета вывода средств из ПРЦ +DROP TABLE IF EXISTS BANK_ACCOUNT; +CREATE TABLE BANK_ACCOUNT(ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY varchar(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN varchar(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), ACCOUNT varchar(50), COMPANY_ID bigint, ID bigint PRIMARY KEY); +COMMENT ON TABLE BANK_ACCOUNT IS 'Счета вывода средств из ПРЦ'; + +COMMENT ON COLUMN BANK_ACCOUNT.ACCOUNT_ID IS 'Идентификатор счета (linked to account)'; + +COMMENT ON COLUMN BANK_ACCOUNT.BANK_IDENTIFICATION_CODE IS 'Банковский идентификационный код (БИК)'; + +COMMENT ON COLUMN BANK_ACCOUNT.BANK_NAME IS 'Наименование банка'; + +COMMENT ON COLUMN BANK_ACCOUNT.CORRESPONDENT_ACCOUNT IS 'Корреспондентский счет'; + +COMMENT ON COLUMN BANK_ACCOUNT.CORRESPONDENT_ACCOUNT_NAME IS 'Наименование корреспондентского счета'; + +COMMENT ON COLUMN BANK_ACCOUNT.CURRENCY IS 'Код валюты (linked to currencyCode)'; + +COMMENT ON COLUMN BANK_ACCOUNT.DESTINATION IS 'Назначение платежа'; + +COMMENT ON COLUMN BANK_ACCOUNT.IBAN IS 'Международный номер банковского счета'; + +COMMENT ON COLUMN BANK_ACCOUNT.INTERNATIONAL_TRANSFER_SIGN IS 'Код доступности международных переводов (linked to allowed)'; + +COMMENT ON COLUMN BANK_ACCOUNT.SWIFT_CODE IS 'Код SWIFT'; + +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 'Номер счета'; + +COMMENT ON COLUMN BANK_ACCOUNT.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN BANK_ACCOUNT.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE BANK_ACCOUNT TO clearing; + + +-- History log of bankAccount - Счета вывода средств из ПРЦ +DROP TABLE IF EXISTS BANK_ACCOUNT_HISTORY; +CREATE TABLE BANK_ACCOUNT_HISTORY(BANK_ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY varchar(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN varchar(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), ACCOUNT varchar(50), COMPANY_ID bigint, ID bigint PRIMARY KEY); +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 'Дата и время изменения'; +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.ACCOUNT_ID IS 'Идентификатор счета (linked to account)'; + +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.BANK_IDENTIFICATION_CODE IS 'Банковский идентификационный код (БИК)'; + +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.BANK_NAME IS 'Наименование банка'; + +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.CORRESPONDENT_ACCOUNT IS 'Корреспондентский счет'; + +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.CORRESPONDENT_ACCOUNT_NAME IS 'Наименование корреспондентского счета'; + +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.CURRENCY IS 'Код валюты (linked to currencyCode)'; + +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.DESTINATION IS 'Назначение платежа'; + +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.IBAN IS 'Международный номер банковского счета'; + +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.INTERNATIONAL_TRANSFER_SIGN IS 'Код доступности международных переводов (linked to allowed)'; + +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.SWIFT_CODE IS 'Код SWIFT'; + +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 'Номер счета'; + +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE BANK_ACCOUNT_HISTORY TO clearing; + +-- informationAccount - Регистр КС +DROP TABLE IF EXISTS INFORMATION_ACCOUNT; +CREATE TABLE INFORMATION_ACCOUNT(ACCOUNT_ID bigint, CLEARING_ACCOUNT_ID bigint, COMPANY_ID bigint, ID bigint PRIMARY KEY); +COMMENT ON TABLE INFORMATION_ACCOUNT IS 'Регистр КС'; + +COMMENT ON COLUMN INFORMATION_ACCOUNT.ACCOUNT_ID IS 'Идентификатор информационного счета (linked to account)'; + +COMMENT ON COLUMN INFORMATION_ACCOUNT.CLEARING_ACCOUNT_ID IS 'Идентификатор аналитического счета (linked to account)'; + +COMMENT ON COLUMN INFORMATION_ACCOUNT.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN INFORMATION_ACCOUNT.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE INFORMATION_ACCOUNT TO clearing; + + +-- History log of informationAccount - Регистр КС +DROP TABLE IF EXISTS INFORMATION_ACCOUNT_HISTORY; +CREATE TABLE INFORMATION_ACCOUNT_HISTORY(INFORMATION_ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ACCOUNT_ID bigint, CLEARING_ACCOUNT_ID bigint, COMPANY_ID bigint, ID bigint PRIMARY KEY); +COMMENT ON TABLE INFORMATION_ACCOUNT_HISTORY IS 'История изменений таблицы informationAccount'; +COMMENT ON COLUMN INFORMATION_ACCOUNT_HISTORY.INFORMATION_ACCOUNT_ID IS 'Идентификатор записи в таблице INFORMATION_ACCOUNT'; +COMMENT ON COLUMN INFORMATION_ACCOUNT_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN INFORMATION_ACCOUNT_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN INFORMATION_ACCOUNT_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN INFORMATION_ACCOUNT_HISTORY.ACCOUNT_ID IS 'Идентификатор информационного счета (linked to account)'; + +COMMENT ON COLUMN INFORMATION_ACCOUNT_HISTORY.CLEARING_ACCOUNT_ID IS 'Идентификатор аналитического счета (linked to account)'; + +COMMENT ON COLUMN INFORMATION_ACCOUNT_HISTORY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN INFORMATION_ACCOUNT_HISTORY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE INFORMATION_ACCOUNT_HISTORY TO clearing; + +-- depoAccount - Депозитарные счета +DROP TABLE IF EXISTS DEPO_ACCOUNT; +CREATE TABLE DEPO_ACCOUNT(ACCOUNT_ID bigint, DEPO_ACCOUNT_TYPE varchar(4), COMPANY_ID bigint, ID bigint PRIMARY KEY); +COMMENT ON TABLE DEPO_ACCOUNT IS 'Депозитарные счета'; + +COMMENT ON COLUMN DEPO_ACCOUNT.ACCOUNT_ID IS 'Идентификатор счета (linked to account)'; + +COMMENT ON COLUMN DEPO_ACCOUNT.DEPO_ACCOUNT_TYPE IS 'Код типа счета (linked to depoAccountType)'; + +COMMENT ON COLUMN DEPO_ACCOUNT.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN DEPO_ACCOUNT.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE DEPO_ACCOUNT TO clearing; + + +-- History log of depoAccount - Депозитарные счета +DROP TABLE IF EXISTS DEPO_ACCOUNT_HISTORY; +CREATE TABLE DEPO_ACCOUNT_HISTORY(DEPO_ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ACCOUNT_ID bigint, DEPO_ACCOUNT_TYPE varchar(4), COMPANY_ID bigint, ID bigint PRIMARY KEY); +COMMENT ON TABLE DEPO_ACCOUNT_HISTORY IS 'История изменений таблицы depoAccount'; +COMMENT ON COLUMN DEPO_ACCOUNT_HISTORY.DEPO_ACCOUNT_ID IS 'Идентификатор записи в таблице DEPO_ACCOUNT'; +COMMENT ON COLUMN DEPO_ACCOUNT_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN DEPO_ACCOUNT_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN DEPO_ACCOUNT_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN DEPO_ACCOUNT_HISTORY.ACCOUNT_ID IS 'Идентификатор счета (linked to account)'; + +COMMENT ON COLUMN DEPO_ACCOUNT_HISTORY.DEPO_ACCOUNT_TYPE IS 'Код типа счета (linked to depoAccountType)'; + +COMMENT ON COLUMN DEPO_ACCOUNT_HISTORY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN DEPO_ACCOUNT_HISTORY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE DEPO_ACCOUNT_HISTORY TO clearing; + +-- accountSymbols - Депо КС - РДЦ +DROP TABLE IF EXISTS ACCOUNT_SYMBOLS; +CREATE TABLE ACCOUNT_SYMBOLS(ID bigint PRIMARY KEY, ACCOUNT_ID bigint, ACCOUNT_SYMBOL_VALUE varchar(255)); +COMMENT ON TABLE ACCOUNT_SYMBOLS IS 'Депо КС - РДЦ'; + +COMMENT ON COLUMN ACCOUNT_SYMBOLS.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN ACCOUNT_SYMBOLS.ACCOUNT_ID IS 'Идентификатор счета (linked to account)'; + +COMMENT ON COLUMN ACCOUNT_SYMBOLS.ACCOUNT_SYMBOL_VALUE IS 'Значение реквизита'; + +GRANT ALL PRIVILEGES ON TABLE ACCOUNT_SYMBOLS TO clearing; + + +-- History log of accountSymbols - Депо КС - РДЦ +DROP TABLE IF EXISTS ACCOUNT_SYMBOLS_HISTORY; +CREATE TABLE ACCOUNT_SYMBOLS_HISTORY(ACCOUNT_SYMBOLS_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ID bigint PRIMARY KEY, ACCOUNT_ID bigint, ACCOUNT_SYMBOL_VALUE varchar(255)); +COMMENT ON TABLE ACCOUNT_SYMBOLS_HISTORY IS 'История изменений таблицы accountSymbols'; +COMMENT ON COLUMN ACCOUNT_SYMBOLS_HISTORY.ACCOUNT_SYMBOLS_ID IS 'Идентификатор записи в таблице ACCOUNT_SYMBOLS'; +COMMENT ON COLUMN ACCOUNT_SYMBOLS_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN ACCOUNT_SYMBOLS_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN ACCOUNT_SYMBOLS_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN ACCOUNT_SYMBOLS_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN ACCOUNT_SYMBOLS_HISTORY.ACCOUNT_ID IS 'Идентификатор счета (linked to account)'; + +COMMENT ON COLUMN ACCOUNT_SYMBOLS_HISTORY.ACCOUNT_SYMBOL_VALUE IS 'Значение реквизита'; + +GRANT ALL PRIVILEGES ON TABLE ACCOUNT_SYMBOLS_HISTORY TO clearing; + +-- clearingAccount - Торгово-Банковские счета +DROP TABLE IF EXISTS CLEARING_ACCOUNT; +CREATE TABLE CLEARING_ACCOUNT(ACCOUNT_ID bigint, CLEARING_ACCOUNT_TYPE varchar(4), COMPANY_ID bigint, ID bigint PRIMARY KEY); +COMMENT ON TABLE CLEARING_ACCOUNT IS 'Торгово-Банковские счета'; + +COMMENT ON COLUMN CLEARING_ACCOUNT.ACCOUNT_ID IS 'Идентификатор счета (linked to account)'; + +COMMENT ON COLUMN CLEARING_ACCOUNT.CLEARING_ACCOUNT_TYPE IS 'Код типа счета (linked to clearingAccountType)'; + +COMMENT ON COLUMN CLEARING_ACCOUNT.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN CLEARING_ACCOUNT.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE CLEARING_ACCOUNT TO clearing; + + +-- History log of clearingAccount - Торгово-Банковские счета +DROP TABLE IF EXISTS CLEARING_ACCOUNT_HISTORY; +CREATE TABLE CLEARING_ACCOUNT_HISTORY(CLEARING_ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ACCOUNT_ID bigint, CLEARING_ACCOUNT_TYPE varchar(4), COMPANY_ID bigint, ID bigint PRIMARY KEY); +COMMENT ON TABLE CLEARING_ACCOUNT_HISTORY IS 'История изменений таблицы clearingAccount'; +COMMENT ON COLUMN CLEARING_ACCOUNT_HISTORY.CLEARING_ACCOUNT_ID IS 'Идентификатор записи в таблице CLEARING_ACCOUNT'; +COMMENT ON COLUMN CLEARING_ACCOUNT_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN CLEARING_ACCOUNT_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN CLEARING_ACCOUNT_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN CLEARING_ACCOUNT_HISTORY.ACCOUNT_ID IS 'Идентификатор счета (linked to account)'; + +COMMENT ON COLUMN CLEARING_ACCOUNT_HISTORY.CLEARING_ACCOUNT_TYPE IS 'Код типа счета (linked to clearingAccountType)'; + +COMMENT ON COLUMN CLEARING_ACCOUNT_HISTORY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN CLEARING_ACCOUNT_HISTORY.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE CLEARING_ACCOUNT_HISTORY TO clearing; + +-- plannerTemplate - Шаблон расписания операционного дня +DROP TABLE IF EXISTS PLANNER_TEMPLATE; +CREATE TABLE PLANNER_TEMPLATE(TASK varchar(4), TASK_TIME time, MARKET varchar(4), SECTION varchar(4), SESSION_TYPE varchar(4), TASK_STATUS varchar(4), COMPANY_ID bigint, SECURITY_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE PLANNER_TEMPLATE IS 'Шаблон расписания операционного дня'; + +COMMENT ON COLUMN PLANNER_TEMPLATE.TASK IS 'Код задачи (linked to task)'; + +COMMENT ON COLUMN PLANNER_TEMPLATE.TASK_TIME IS 'Время задачи'; + +COMMENT ON COLUMN PLANNER_TEMPLATE.MARKET IS 'Код рынка (linked to market)'; + +COMMENT ON COLUMN PLANNER_TEMPLATE.SECTION IS 'Код наименования секции (linked to section)'; + +COMMENT ON COLUMN PLANNER_TEMPLATE.SESSION_TYPE IS 'Код типа клиринговой сессии (linked to sessionType)'; + +COMMENT ON COLUMN PLANNER_TEMPLATE.TASK_STATUS IS 'Код статуса (linked to taskStatus)'; + +COMMENT ON COLUMN PLANNER_TEMPLATE.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN PLANNER_TEMPLATE.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN PLANNER_TEMPLATE.ID IS 'Идентификатор'; + +COMMENT ON COLUMN PLANNER_TEMPLATE.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN PLANNER_TEMPLATE.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE PLANNER_TEMPLATE TO clearing; + +-- clearingCalendar - Рабочие и нерабочие дни +DROP TABLE IF EXISTS CLEARING_CALENDAR; +CREATE TABLE CLEARING_CALENDAR(CLEARING_DATE date, COMPANY_ID bigint, DAY_STATUS varchar(4), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE CLEARING_CALENDAR IS 'Рабочие и нерабочие дни'; + +COMMENT ON COLUMN CLEARING_CALENDAR.CLEARING_DATE IS 'Дата'; + +COMMENT ON COLUMN CLEARING_CALENDAR.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN CLEARING_CALENDAR.DAY_STATUS IS 'Код статуса (linked to dayStatus)'; + +COMMENT ON COLUMN CLEARING_CALENDAR.ID IS 'Идентификатор'; + +COMMENT ON COLUMN CLEARING_CALENDAR.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN CLEARING_CALENDAR.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE CLEARING_CALENDAR TO clearing; + +-- planner - Расписание на все даты +DROP TABLE IF EXISTS PLANNER; +CREATE TABLE PLANNER(TASK varchar(4), TASK_TIME time, CLEARING_DATE date, MARKET varchar(4), SECTION varchar(4), SESSION_TYPE varchar(4), TASK_STATUS varchar(4), COMPANY_ID bigint, SECURITY_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE PLANNER IS 'Расписание на все даты'; + +COMMENT ON COLUMN PLANNER.TASK IS 'Код задачи (linked to task)'; + +COMMENT ON COLUMN PLANNER.TASK_TIME IS 'Время задачи'; + +COMMENT ON COLUMN PLANNER.CLEARING_DATE IS 'Дата задачи'; + +COMMENT ON COLUMN PLANNER.MARKET IS 'Код рынка (linked to market)'; + +COMMENT ON COLUMN PLANNER.SECTION IS 'Код наименования секции (linked to section)'; + +COMMENT ON COLUMN PLANNER.SESSION_TYPE IS 'Код типа клиринговой сессии (linked to sessionType)'; + +COMMENT ON COLUMN PLANNER.TASK_STATUS IS 'Код статуса (linked to taskStatus)'; + +COMMENT ON COLUMN PLANNER.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN PLANNER.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN PLANNER.ID IS 'Идентификатор'; + +COMMENT ON COLUMN PLANNER.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN PLANNER.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE PLANNER TO clearing; + +-- plannerAllToday - Расписание на текущий день +DROP TABLE IF EXISTS PLANNER_ALL_TODAY; +CREATE TABLE PLANNER_ALL_TODAY(TASK varchar(4), TASK_TIME time, CLEARING_DATE date, MARKET varchar(4), SECTION varchar(4), SESSION_TYPE varchar(4), TASK_STATUS varchar(4), COMPANY_ID bigint, SECURITY_ID bigint, PARENT varchar(4), PARENT_ID bigint, ID bigint PRIMARY KEY); +COMMENT ON TABLE PLANNER_ALL_TODAY IS 'Расписание на текущий день'; + +COMMENT ON COLUMN PLANNER_ALL_TODAY.TASK IS 'Код задачи (linked to task)'; + +COMMENT ON COLUMN PLANNER_ALL_TODAY.TASK_TIME IS 'Время'; + +COMMENT ON COLUMN PLANNER_ALL_TODAY.CLEARING_DATE IS 'Дата'; + +COMMENT ON COLUMN PLANNER_ALL_TODAY.MARKET IS 'Код рынка (linked to market)'; + +COMMENT ON COLUMN PLANNER_ALL_TODAY.SECTION IS 'Код наименования секции (linked to section)'; + +COMMENT ON COLUMN PLANNER_ALL_TODAY.SESSION_TYPE IS 'Код типа клиринговой сессии (linked to sessionType)'; + +COMMENT ON COLUMN PLANNER_ALL_TODAY.TASK_STATUS IS 'Код статуса (linked to taskStatus)'; + +COMMENT ON COLUMN PLANNER_ALL_TODAY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN PLANNER_ALL_TODAY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN PLANNER_ALL_TODAY.PARENT IS 'Код источника записи расписания (linked to parent)'; + +COMMENT ON COLUMN PLANNER_ALL_TODAY.PARENT_ID IS 'Идентификатор записи в таблице-источнике'; + +COMMENT ON COLUMN PLANNER_ALL_TODAY.ID IS 'Идентификатор'; + +GRANT ALL PRIVILEGES ON TABLE PLANNER_ALL_TODAY TO clearing; + +-- launcher - Запуск задачи +DROP TABLE IF EXISTS LAUNCHER; +CREATE TABLE LAUNCHER(SENDER_ID bigint, TASK varchar(4), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE LAUNCHER IS 'Запуск задачи'; + +COMMENT ON COLUMN LAUNCHER.SENDER_ID IS 'Идентификатор отправителя (linked to userCls)'; + +COMMENT ON COLUMN LAUNCHER.TASK IS 'Код задачи (linked to task)'; + +COMMENT ON COLUMN LAUNCHER.ID IS 'Идентификатор'; + +COMMENT ON COLUMN LAUNCHER.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN LAUNCHER.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE LAUNCHER TO clearing; + +-- session - Клиринговые сессии +DROP TABLE IF EXISTS SESSION; +CREATE TABLE SESSION(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, SESSION_STATUS varchar(4), COMPANY_ID bigint, SECURITY_ID bigint, USER_ID bigint, SECTION varchar(4), SESSION_TYPE varchar(4), WORKFLOW_STATUS varchar(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)'; + +COMMENT ON COLUMN SESSION.COMPANY_ID IS 'Идентификатор инициатора торгов (linked to company)'; + +COMMENT ON COLUMN SESSION.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN SESSION.USER_ID IS 'Идентификатор пользователя (linked to userCls)'; + +COMMENT ON COLUMN SESSION.SECTION IS 'Код наименования секции (linked to section)'; + +COMMENT ON COLUMN SESSION.SESSION_TYPE IS 'Код типа клиринговой сессии (linked to sessionType)'; + +COMMENT ON COLUMN SESSION.WORKFLOW_STATUS IS 'Код статуса (linked to workflowStatus)'; + +GRANT ALL PRIVILEGES ON TABLE SESSION TO clearing; + + +-- History log of session - Клиринговые сессии +DROP TABLE IF EXISTS SESSION_HISTORY; +CREATE TABLE SESSION_HISTORY(SESSION_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, SESSION_STATUS varchar(4), COMPANY_ID bigint, SECURITY_ID bigint, USER_ID bigint, SECTION varchar(4), SESSION_TYPE varchar(4), WORKFLOW_STATUS varchar(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.EVENT_TYPE 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)'; + +COMMENT ON COLUMN SESSION_HISTORY.COMPANY_ID IS 'Идентификатор инициатора торгов (linked to company)'; + +COMMENT ON COLUMN SESSION_HISTORY.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN SESSION_HISTORY.USER_ID IS 'Идентификатор пользователя (linked to userCls)'; + +COMMENT ON COLUMN SESSION_HISTORY.SECTION IS 'Код наименования секции (linked to section)'; + +COMMENT ON COLUMN SESSION_HISTORY.SESSION_TYPE IS 'Код типа клиринговой сессии (linked to sessionType)'; + +COMMENT ON COLUMN SESSION_HISTORY.WORKFLOW_STATUS IS 'Код статуса (linked to workflowStatus)'; + +GRANT ALL PRIVILEGES ON TABLE SESSION_HISTORY TO clearing; + +-- sTrades - Сделки из Торговой системы +DROP TABLE IF EXISTS S_TRADES; +CREATE TABLE S_TRADES(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, TRADE_NUM bigint, OPERATION varchar(40), CLASS_CODE varchar(255), TRADE_DATE date, SEC_CODE varchar(255), ACCRUEDINT numeric(72,18), ACCRUEDINT2 numeric(72,18), LOWER_DISCOUNT numeric(72,18), ORDER_NUM bigint, PRICE numeric(72,18), PRICE2 numeric(72,18), REPO_RATE numeric(72,18), REPO_VALUE numeric(72,18), REPO2_VALUE numeric(72,18), START_DISCOUNT numeric(72,18), TS_COMMISSION numeric(72,18), UPPER_DISCOUNT numeric(72,18), VALUE numeric(72,18), YIELD numeric(72,18), QTY numeric(72,18), QTY_PCS numeric(72,18), TRADE_DATE_TIME timestamp, REPO_TERM bigint, CLEARING_COMMISSION numeric(72,18), EXCHANGE_COMMISSION numeric(72,18), TECH_CENTER_COMMISSION numeric(72,18), ACCOUNT varchar(50), BROKER_REF varchar(34), CLIENT_CODE varchar(255), SETTLE_CODE varchar(50), USER_ID varchar(32), EXCHANGE_CODE varchar(64), FIRM_ID varchar(255), FIRM_NAME varchar(255), CP_FIRM_ID varchar(255), CP_FIRM_NAME varchar(255), CLASS_NAME varchar(255), SEC_NAME varchar(255), SETTLE_DATE date, SETTLE_CURRENCY varchar(4), TRADE_CURRENCY varchar(4), TRADE_TIME_MS bigint, BANK_ACC_ID varchar(12), SECTION varchar(4)); +COMMENT ON TABLE S_TRADES IS 'Сделки из Торговой системы'; + +COMMENT ON COLUMN S_TRADES.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_TRADES.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN S_TRADES.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN S_TRADES.TRADE_NUM IS 'Номер сделки'; + +COMMENT ON COLUMN S_TRADES.OPERATION IS 'Направленность сделки (BUY или SELL)'; + +COMMENT ON COLUMN S_TRADES.CLASS_CODE IS 'Код класса инструментов'; + +COMMENT ON COLUMN S_TRADES.TRADE_DATE IS 'Дата торговой сессии'; + +COMMENT ON COLUMN S_TRADES.SEC_CODE IS 'Код инструмента'; + +COMMENT ON COLUMN S_TRADES.ACCRUEDINT IS 'Накопленный купонный доход'; + +COMMENT ON COLUMN S_TRADES.ACCRUEDINT2 IS 'Доход(%) на дату выкупа'; + +COMMENT ON COLUMN S_TRADES.LOWER_DISCOUNT IS 'Нижний дисконт(%)'; + +COMMENT ON COLUMN S_TRADES.ORDER_NUM IS 'Номер заявки'; + +COMMENT ON COLUMN S_TRADES.PRICE IS 'Цена сделки'; + +COMMENT ON COLUMN S_TRADES.PRICE2 IS 'Цена выкупа второй части РЕПО'; + +COMMENT ON COLUMN S_TRADES.REPO_RATE IS 'Ставка РЕПО (%)'; + +COMMENT ON COLUMN S_TRADES.REPO_VALUE IS 'Сумма РЕПО'; + +COMMENT ON COLUMN S_TRADES.REPO2_VALUE IS 'Объем сделки выкупа РЕПО, рублей'; + +COMMENT ON COLUMN S_TRADES.START_DISCOUNT IS 'Начальный дисконт(%)'; + +COMMENT ON COLUMN S_TRADES.TS_COMMISSION IS 'Комиссия торговой системы'; + +COMMENT ON COLUMN S_TRADES.UPPER_DISCOUNT IS 'Верхний дисконт(%)'; + +COMMENT ON COLUMN S_TRADES.VALUE IS 'Объем сделки без учета комиссионного сбора биржи и % дохода'; + +COMMENT ON COLUMN S_TRADES.YIELD IS 'Доходность'; + +COMMENT ON COLUMN S_TRADES.QTY IS 'Количество бумаг в лотах'; + +COMMENT ON COLUMN S_TRADES.QTY_PCS IS 'Количество бумаг в штуках'; + +COMMENT ON COLUMN S_TRADES.TRADE_DATE_TIME IS 'Дата и время сделки'; + +COMMENT ON COLUMN S_TRADES.REPO_TERM IS 'Срок РЕПО'; + +COMMENT ON COLUMN S_TRADES.CLEARING_COMMISSION IS 'Клиринговая комиссия. Параметр сделок на МБ'; + +COMMENT ON COLUMN S_TRADES.EXCHANGE_COMMISSION IS 'Комиссия Фондовой биржи. Параметр сделок на МБ'; + +COMMENT ON COLUMN S_TRADES.TECH_CENTER_COMMISSION IS 'Комиссия Технического центра. Параметр сделок на МБ'; + +COMMENT ON COLUMN S_TRADES.ACCOUNT IS 'Торговый счет'; + +COMMENT ON COLUMN S_TRADES.BROKER_REF IS 'Комментарий, обычно: код клиента>/номер поручения>'; + +COMMENT ON COLUMN S_TRADES.CLIENT_CODE IS 'Код участника торгов = Код участника клиринга = Код участника расчетов'; + +COMMENT ON COLUMN S_TRADES.SETTLE_CODE IS 'Код расчетов по сделке'; + +COMMENT ON COLUMN S_TRADES.USER_ID IS 'Идентификатор трейдера'; + +COMMENT ON COLUMN S_TRADES.EXCHANGE_CODE IS 'Идентификатор биржи'; + +COMMENT ON COLUMN S_TRADES.FIRM_ID IS 'Трейдер'; + +COMMENT ON COLUMN S_TRADES.FIRM_NAME IS 'Организация трейдера'; + +COMMENT ON COLUMN S_TRADES.CP_FIRM_ID IS 'Партнер'; + +COMMENT ON COLUMN S_TRADES.CP_FIRM_NAME IS 'Организация партнера'; + +COMMENT ON COLUMN S_TRADES.CLASS_NAME IS 'Класс инструмента'; + +COMMENT ON COLUMN S_TRADES.SEC_NAME IS 'Полное наименование инструмента'; + +COMMENT ON COLUMN S_TRADES.SETTLE_DATE IS 'Дата расчетов'; + +COMMENT ON COLUMN S_TRADES.SETTLE_CURRENCY IS 'Валюта расчетов'; + +COMMENT ON COLUMN S_TRADES.TRADE_CURRENCY IS 'Валюта сделки'; + +COMMENT ON COLUMN S_TRADES.TRADE_TIME_MS IS 'Микросекунды времени сделки'; + +COMMENT ON COLUMN S_TRADES.BANK_ACC_ID IS 'Идентификатор расчетного счета/кода в клиринговой организации'; + +COMMENT ON COLUMN S_TRADES.SECTION IS 'Код наименования секции (linked to section)'; + +GRANT ALL PRIVILEGES ON TABLE S_TRADES TO clearing; + +-- executionDeposit - Сделки на секции МКР +DROP TABLE IF EXISTS EXECUTION_DEPOSIT; +CREATE TABLE EXECUTION_DEPOSIT(EXCHANGE_EXECUTION_ID bigint, EXCHANGE_EXECUTION_TIME timestamp, TRADING_DATE date, TRADING_CLEARING_REGISTRY_ID bigint, PARTY_TRADING_CLEARING_REGISTRY varchar(20), MARKET varchar(8), PRICE numeric(72,18), LOTS numeric(72,2), QUANTITY numeric(72,2), FIRST_LEG_AMOUNT numeric(72,2), SECOND_LEG_AMOUNT numeric(72,2), INTEREST_AMOUNT numeric(72,2), SIDE varchar(4), SETTLEMENT_CURRENCY varchar(4), COMPANY_ID bigint, DURATION bigint, FIRST_LEG_SETTLEMENT_DATE date, SECOND_LEG_SETTLEMENT_DATE date, FIRST_LEG_SETTLEMENT_CODE varchar(12), SECOND_LEG_SETTLEMENT_CODE varchar(12), SECURITY_FULL_NAME varchar(255), SECURITY_SYMBOL varchar(255), SECURITY_CODE varchar(255), SECURITY_ID bigint, CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID bigint, COUNTER_PARTY_TRADING_CLEARING_REGISTRY varchar(20), COVERAGE_STATUS varchar(4), SESSION_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date); +COMMENT ON TABLE EXECUTION_DEPOSIT IS 'Сделки на секции МКР'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.EXCHANGE_EXECUTION_ID IS 'Идентификационный номер сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.EXCHANGE_EXECUTION_TIME IS 'Время заключения сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.TRADING_DATE IS 'Дата заключения сделки'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.PARTY_TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр '; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.MARKET IS 'Код секции финансового инструмента'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.PRICE IS 'Ставка по депозиту'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.LOTS IS 'Количество лотов'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.QUANTITY IS 'Количество штук'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.FIRST_LEG_AMOUNT IS 'Объем сделки'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.SECOND_LEG_AMOUNT IS 'Объем возврата'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.INTEREST_AMOUNT IS 'Объем процентов'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.SIDE IS 'Код направления сделки (linked to moneyFlowSide)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.SETTLEMENT_CURRENCY IS 'Код валюты расчетов по инструменту (linked to currencyCode)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.DURATION IS 'Срок, дней'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.FIRST_LEG_SETTLEMENT_DATE IS 'Дата размещения'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.SECOND_LEG_SETTLEMENT_DATE IS 'Дата возврата'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.FIRST_LEG_SETTLEMENT_CODE IS 'Код расчетов при размещении'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.SECOND_LEG_SETTLEMENT_CODE IS 'Код расчетов при возврате'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.SECURITY_FULL_NAME IS 'Наименование инструмента'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.SECURITY_SYMBOL IS 'Код инструмента в Торговой Системе'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.SECURITY_CODE IS 'Полный код инструмента со сроком'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.SECURITY_ID IS 'Идентификатор финансового инструмента (linked to moneyMarketSecurity)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.CONTRACT IS 'Продукт'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.COUNTER_PARTY_ID IS 'Идентификатор компании-партнера, с которой заключена сделка (linked to company)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра партнера (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.COUNTER_PARTY_TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр партнера'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.COVERAGE_STATUS IS 'Код статуса достаточности обеспечения (linked to allowed)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT.CLEARING_DATE IS 'Дата клиринга'; + +GRANT ALL PRIVILEGES ON TABLE EXECUTION_DEPOSIT TO clearing; + + +-- History log of executionDeposit - Сделки на секции МКР +DROP TABLE IF EXISTS EXECUTION_DEPOSIT_HISTORY; +CREATE TABLE EXECUTION_DEPOSIT_HISTORY(EXECUTION_DEPOSIT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), EXCHANGE_EXECUTION_ID bigint, EXCHANGE_EXECUTION_TIME timestamp, TRADING_DATE date, TRADING_CLEARING_REGISTRY_ID bigint, PARTY_TRADING_CLEARING_REGISTRY varchar(20), MARKET varchar(8), PRICE numeric(72,18), LOTS numeric(72,2), QUANTITY numeric(72,2), FIRST_LEG_AMOUNT numeric(72,2), SECOND_LEG_AMOUNT numeric(72,2), INTEREST_AMOUNT numeric(72,2), SIDE varchar(4), SETTLEMENT_CURRENCY varchar(4), COMPANY_ID bigint, DURATION bigint, FIRST_LEG_SETTLEMENT_DATE date, SECOND_LEG_SETTLEMENT_DATE date, FIRST_LEG_SETTLEMENT_CODE varchar(12), SECOND_LEG_SETTLEMENT_CODE varchar(12), SECURITY_FULL_NAME varchar(255), SECURITY_SYMBOL varchar(255), SECURITY_CODE varchar(255), SECURITY_ID bigint, CONTRACT varchar(255), COUNTER_PARTY_ID bigint, COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID bigint, COUNTER_PARTY_TRADING_CLEARING_REGISTRY varchar(20), COVERAGE_STATUS varchar(4), SESSION_ID bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date); +COMMENT ON TABLE EXECUTION_DEPOSIT_HISTORY IS 'История изменений таблицы executionDeposit'; +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.EXECUTION_DEPOSIT_ID IS 'Идентификатор записи в таблице EXECUTION_DEPOSIT'; +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.EXCHANGE_EXECUTION_ID IS 'Идентификационный номер сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.EXCHANGE_EXECUTION_TIME IS 'Время заключения сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.TRADING_DATE IS 'Дата заключения сделки'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.PARTY_TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр '; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.MARKET IS 'Код секции финансового инструмента'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.PRICE IS 'Ставка по депозиту'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.LOTS IS 'Количество лотов'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.QUANTITY IS 'Количество штук'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.FIRST_LEG_AMOUNT IS 'Объем сделки'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.SECOND_LEG_AMOUNT IS 'Объем возврата'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.INTEREST_AMOUNT IS 'Объем процентов'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.SIDE IS 'Код направления сделки (linked to moneyFlowSide)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.SETTLEMENT_CURRENCY IS 'Код валюты расчетов по инструменту (linked to currencyCode)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.DURATION IS 'Срок, дней'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.FIRST_LEG_SETTLEMENT_DATE IS 'Дата размещения'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.SECOND_LEG_SETTLEMENT_DATE IS 'Дата возврата'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.FIRST_LEG_SETTLEMENT_CODE IS 'Код расчетов при размещении'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.SECOND_LEG_SETTLEMENT_CODE IS 'Код расчетов при возврате'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.SECURITY_FULL_NAME IS 'Наименование инструмента'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.SECURITY_SYMBOL IS 'Код инструмента в Торговой Системе'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.SECURITY_CODE IS 'Полный код инструмента со сроком'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.SECURITY_ID IS 'Идентификатор финансового инструмента (linked to moneyMarketSecurity)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.CONTRACT IS 'Продукт'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.COUNTER_PARTY_ID IS 'Идентификатор компании-партнера, с которой заключена сделка (linked to company)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра партнера (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.COUNTER_PARTY_TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр партнера'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.COVERAGE_STATUS IS 'Код статуса достаточности обеспечения (linked to allowed)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN EXECUTION_DEPOSIT_HISTORY.CLEARING_DATE IS 'Дата клиринга'; + +GRANT ALL PRIVILEGES ON TABLE EXECUTION_DEPOSIT_HISTORY TO clearing; + +-- executionFond - Сделки на Фондовой секции +DROP TABLE IF EXISTS EXECUTION_FOND; +CREATE TABLE EXECUTION_FOND(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, EXCHANGE_EXECUTION_ID bigint, SIDE varchar(4), MARKET varchar(4), TRADING_DATE date, SECURITY_SYMBOL varchar(255), SECURITY_ID bigint, INTEREST_AMOUNT numeric(72,2), EXCHANGE_ORDER_ID bigint, PRICE numeric(72,18), SETTLEMENT_AMOUNT numeric(72,2), LOTS numeric(72,2), QUANTITY numeric(72,2), EXCHANGE_EXECUTION_TIME timestamp, DURATION bigint, TRADING_CLEARING_REGISTRY_ID bigint, PARTY_TRADING_CLEARING_REGISTRY varchar(20), COMMENT varchar(255), CLIENT_CODE_ID bigint, SETTLEMENT_CODE varchar(12), COMPANY_ID bigint, COUNTER_PARTY_ID bigint, COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID bigint, COUNTER_PARTY_TRADING_CLEARING_REGISTRY varchar(20), SECURITY_FULL_NAME varchar(255), SETTLEMENT_DATE date, SETTLEMENT_CURRENCY varchar(4), EXCHANGE_EXECUTION_MICROSECONDS timestamp, COVERAGE_STATUS varchar(4), SESSION_ID bigint); +COMMENT ON TABLE EXECUTION_FOND IS 'Сделки на Фондовой секции'; + +COMMENT ON COLUMN EXECUTION_FOND.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN EXECUTION_FOND.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN EXECUTION_FOND.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN EXECUTION_FOND.CLEARING_DATE IS 'Дата клиринга'; + +COMMENT ON COLUMN EXECUTION_FOND.EXCHANGE_EXECUTION_ID IS 'Идентификационный номер сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_FOND.SIDE IS 'Код направления сделки (linked to side)'; + +COMMENT ON COLUMN EXECUTION_FOND.MARKET IS 'Код секции финансового инструмента'; + +COMMENT ON COLUMN EXECUTION_FOND.TRADING_DATE IS 'Дата заключения сделки'; + +COMMENT ON COLUMN EXECUTION_FOND.SECURITY_SYMBOL IS 'Код инструмента в Торговой Системе'; + +COMMENT ON COLUMN EXECUTION_FOND.SECURITY_ID IS 'Идентификатор финансового инструмента (linked to security)'; + +COMMENT ON COLUMN EXECUTION_FOND.INTEREST_AMOUNT IS 'НКД'; + +COMMENT ON COLUMN EXECUTION_FOND.EXCHANGE_ORDER_ID IS 'Идентификационный номер заявки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_FOND.PRICE IS 'Цена, %'; + +COMMENT ON COLUMN EXECUTION_FOND.SETTLEMENT_AMOUNT IS 'Объем сделки'; + +COMMENT ON COLUMN EXECUTION_FOND.LOTS IS 'Количество лотов'; + +COMMENT ON COLUMN EXECUTION_FOND.QUANTITY IS 'Количество штук'; + +COMMENT ON COLUMN EXECUTION_FOND.EXCHANGE_EXECUTION_TIME IS 'Время заключения сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_FOND.DURATION IS 'Срок, дней'; + +COMMENT ON COLUMN EXECUTION_FOND.TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN EXECUTION_FOND.PARTY_TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр '; + +COMMENT ON COLUMN EXECUTION_FOND.COMMENT IS 'Комментарий'; + +COMMENT ON COLUMN EXECUTION_FOND.CLIENT_CODE_ID IS 'Идентификатор кода клиента'; + +COMMENT ON COLUMN EXECUTION_FOND.SETTLEMENT_CODE IS 'Код расчетов при размещении'; + +COMMENT ON COLUMN EXECUTION_FOND.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN EXECUTION_FOND.COUNTER_PARTY_ID IS 'Идентификатор компании-партнера, с которой заключена сделка (linked to company)'; + +COMMENT ON COLUMN EXECUTION_FOND.COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра партнера (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN EXECUTION_FOND.COUNTER_PARTY_TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр партнера'; + +COMMENT ON COLUMN EXECUTION_FOND.SECURITY_FULL_NAME IS 'Наименование инструмента'; + +COMMENT ON COLUMN EXECUTION_FOND.SETTLEMENT_DATE IS 'Дата расчетов'; + +COMMENT ON COLUMN EXECUTION_FOND.SETTLEMENT_CURRENCY IS 'Код валюты расчетов по инструменту (linked to currencyCode)'; + +COMMENT ON COLUMN EXECUTION_FOND.EXCHANGE_EXECUTION_MICROSECONDS IS 'Микросекунды заключения сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_FOND.COVERAGE_STATUS IS 'Код статуса достаточности обеспечения (linked to allowed)'; + +COMMENT ON COLUMN EXECUTION_FOND.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +GRANT ALL PRIVILEGES ON TABLE EXECUTION_FOND TO clearing; + + +-- History log of executionFond - Сделки на Фондовой секции +DROP TABLE IF EXISTS EXECUTION_FOND_HISTORY; +CREATE TABLE EXECUTION_FOND_HISTORY(EXECUTION_FOND_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, EXCHANGE_EXECUTION_ID bigint, SIDE varchar(4), MARKET varchar(4), TRADING_DATE date, SECURITY_SYMBOL varchar(255), SECURITY_ID bigint, INTEREST_AMOUNT numeric(72,2), EXCHANGE_ORDER_ID bigint, PRICE numeric(72,18), SETTLEMENT_AMOUNT numeric(72,2), LOTS numeric(72,2), QUANTITY numeric(72,2), EXCHANGE_EXECUTION_TIME timestamp, DURATION bigint, TRADING_CLEARING_REGISTRY_ID bigint, PARTY_TRADING_CLEARING_REGISTRY varchar(20), COMMENT varchar(255), CLIENT_CODE_ID bigint, SETTLEMENT_CODE varchar(12), COMPANY_ID bigint, COUNTER_PARTY_ID bigint, COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID bigint, COUNTER_PARTY_TRADING_CLEARING_REGISTRY varchar(20), SECURITY_FULL_NAME varchar(255), SETTLEMENT_DATE date, SETTLEMENT_CURRENCY varchar(4), EXCHANGE_EXECUTION_MICROSECONDS timestamp, COVERAGE_STATUS varchar(4), SESSION_ID bigint); +COMMENT ON TABLE EXECUTION_FOND_HISTORY IS 'История изменений таблицы executionFond'; +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.EXECUTION_FOND_ID IS 'Идентификатор записи в таблице EXECUTION_FOND'; +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.CLEARING_DATE IS 'Дата клиринга'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.EXCHANGE_EXECUTION_ID IS 'Идентификационный номер сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.SIDE IS 'Код направления сделки (linked to side)'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.MARKET IS 'Код секции финансового инструмента'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.TRADING_DATE IS 'Дата заключения сделки'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.SECURITY_SYMBOL IS 'Код инструмента в Торговой Системе'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.SECURITY_ID IS 'Идентификатор финансового инструмента (linked to security)'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.INTEREST_AMOUNT IS 'НКД'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.EXCHANGE_ORDER_ID IS 'Идентификационный номер заявки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.PRICE IS 'Цена, %'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.SETTLEMENT_AMOUNT IS 'Объем сделки'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.LOTS IS 'Количество лотов'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.QUANTITY IS 'Количество штук'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.EXCHANGE_EXECUTION_TIME IS 'Время заключения сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.DURATION IS 'Срок, дней'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.PARTY_TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр '; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.COMMENT IS 'Комментарий'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.CLIENT_CODE_ID IS 'Идентификатор кода клиента'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.SETTLEMENT_CODE IS 'Код расчетов при размещении'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.COUNTER_PARTY_ID IS 'Идентификатор компании-партнера, с которой заключена сделка (linked to company)'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра партнера (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.COUNTER_PARTY_TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр партнера'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.SECURITY_FULL_NAME IS 'Наименование инструмента'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.SETTLEMENT_DATE IS 'Дата расчетов'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.SETTLEMENT_CURRENCY IS 'Код валюты расчетов по инструменту (linked to currencyCode)'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.EXCHANGE_EXECUTION_MICROSECONDS IS 'Микросекунды заключения сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.COVERAGE_STATUS IS 'Код статуса достаточности обеспечения (linked to allowed)'; + +COMMENT ON COLUMN EXECUTION_FOND_HISTORY.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +GRANT ALL PRIVILEGES ON TABLE EXECUTION_FOND_HISTORY TO clearing; + +-- executionCurrency - Сделки с валютными инструментами +DROP TABLE IF EXISTS EXECUTION_CURRENCY; +CREATE TABLE EXECUTION_CURRENCY(EXCHANGE_EXECUTION_ID bigint, EXCHANGE_EXECUTION_TIME timestamp, EXCHANGE_EXECUTION_MICROSECONDS timestamp, TRADING_DATE date, SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), SECURITY_ID bigint, SECURITY_SYMBOL varchar(255), SECURITY_NAME varchar(255), COMPANY_ID bigint, PARTY_TRADING_CLEARING_REGISTRY_ID bigint, PARTY_TRADING_CLEARING_REGISTRY varchar(20), COUNTER_PARTY_ID bigint, COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID bigint, COUNTER_PARTY_TRADING_CLEARING_REGISTRY varchar(20), MARKET varchar(4), PRICE numeric(72,18), LOTS numeric(72,2), SETTLEMENT_AMOUNT numeric(72,2), QUANTITY numeric(72,2), SIDE varchar(4), CURRENCY_CODE varchar(4), SETTLEMENT_ORGANIZATION varchar(255), COVERAGE_STATUS varchar(4), SESSION_ID bigint, CLEARING_DATE date, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE EXECUTION_CURRENCY IS 'Сделки с валютными инструментами'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.EXCHANGE_EXECUTION_ID IS 'Идентификационный номер сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.EXCHANGE_EXECUTION_TIME IS 'Время заключения сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.EXCHANGE_EXECUTION_MICROSECONDS IS 'Микросекунды заключения сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.TRADING_DATE IS 'Дата заключения сделки'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.SETTLEMENT_DATE IS 'Дата расчетов'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.SETTLEMENT_CODE IS 'Код расчетов при размещении'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.SECURITY_ID IS 'Идентификатор финансового инструмента (linked to security)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.SECURITY_SYMBOL IS 'Код инструмента в Торговой Системе'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.SECURITY_NAME IS 'Краткое наименование инструмента'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.PARTY_TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.PARTY_TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр '; + +COMMENT ON COLUMN EXECUTION_CURRENCY.COUNTER_PARTY_ID IS 'Идентификатор компании-партнера, с которой заключена сделка (linked to company)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра партнера (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.COUNTER_PARTY_TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр партнера'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.MARKET IS 'Код секции валютного инструмента (linked to market)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.PRICE IS 'Цена'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.LOTS IS 'Количество лотов'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.SETTLEMENT_AMOUNT IS 'Объем сделки в валюте лота'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.QUANTITY IS 'Количество штук'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.SIDE IS 'Код направления сделки (linked to side)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.CURRENCY_CODE IS 'Код валюты лота (linked to currencyCode)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.SETTLEMENT_ORGANIZATION IS 'Наименование расчетной организации'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.COVERAGE_STATUS IS 'Код статуса достаточности обеспечения (linked to allowed)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.CLEARING_DATE IS 'Дата клиринга'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN EXECUTION_CURRENCY.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE EXECUTION_CURRENCY TO clearing; + + +-- History log of executionCurrency - Сделки с валютными инструментами +DROP TABLE IF EXISTS EXECUTION_CURRENCY_HISTORY; +CREATE TABLE EXECUTION_CURRENCY_HISTORY(EXECUTION_CURRENCY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), EXCHANGE_EXECUTION_ID bigint, EXCHANGE_EXECUTION_TIME timestamp, EXCHANGE_EXECUTION_MICROSECONDS timestamp, TRADING_DATE date, SETTLEMENT_DATE date, SETTLEMENT_CODE varchar(12), SECURITY_ID bigint, SECURITY_SYMBOL varchar(255), SECURITY_NAME varchar(255), COMPANY_ID bigint, PARTY_TRADING_CLEARING_REGISTRY_ID bigint, PARTY_TRADING_CLEARING_REGISTRY varchar(20), COUNTER_PARTY_ID bigint, COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID bigint, COUNTER_PARTY_TRADING_CLEARING_REGISTRY varchar(20), MARKET varchar(4), PRICE numeric(72,18), LOTS numeric(72,2), SETTLEMENT_AMOUNT numeric(72,2), QUANTITY numeric(72,2), SIDE varchar(4), CURRENCY_CODE varchar(4), SETTLEMENT_ORGANIZATION varchar(255), COVERAGE_STATUS varchar(4), SESSION_ID bigint, CLEARING_DATE date, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE EXECUTION_CURRENCY_HISTORY IS 'История изменений таблицы executionCurrency'; +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.EXECUTION_CURRENCY_ID IS 'Идентификатор записи в таблице EXECUTION_CURRENCY'; +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.EVENT_TIME IS 'Дата и время изменения'; +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.EVENT_USER_ID IS 'Инициатор изменения'; +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.EXCHANGE_EXECUTION_ID IS 'Идентификационный номер сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.EXCHANGE_EXECUTION_TIME IS 'Время заключения сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.EXCHANGE_EXECUTION_MICROSECONDS IS 'Микросекунды заключения сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.TRADING_DATE IS 'Дата заключения сделки'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.SETTLEMENT_DATE IS 'Дата расчетов'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.SETTLEMENT_CODE IS 'Код расчетов при размещении'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.SECURITY_ID IS 'Идентификатор финансового инструмента (linked to security)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.SECURITY_SYMBOL IS 'Код инструмента в Торговой Системе'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.SECURITY_NAME IS 'Краткое наименование инструмента'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.PARTY_TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.PARTY_TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр '; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.COUNTER_PARTY_ID IS 'Идентификатор компании-партнера, с которой заключена сделка (linked to company)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID IS 'Идентификатор торгово-клирингового регистра партнера (linked to tradingClearingRegistry)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.COUNTER_PARTY_TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр партнера'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.MARKET IS 'Код секции валютного инструмента (linked to market)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.PRICE IS 'Цена'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.LOTS IS 'Количество лотов'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.SETTLEMENT_AMOUNT IS 'Объем сделки в валюте лота'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.QUANTITY IS 'Количество штук'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.SIDE IS 'Код направления сделки (linked to side)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.CURRENCY_CODE IS 'Код валюты лота (linked to currencyCode)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.SETTLEMENT_ORGANIZATION IS 'Наименование расчетной организации'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.COVERAGE_STATUS IS 'Код статуса достаточности обеспечения (linked to allowed)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.CLEARING_DATE IS 'Дата клиринга'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN EXECUTION_CURRENCY_HISTORY.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE EXECUTION_CURRENCY_HISTORY TO clearing; + +-- depoBalanceRegister - Реестр остатков ценных бумаг +DROP TABLE IF EXISTS DEPO_BALANCE_REGISTER; +CREATE TABLE DEPO_BALANCE_REGISTER(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, COMPANY_ID bigint, SESSION_ID bigint, SET_HOUSE_NAME varchar(255), NUMBER varchar(255), DEPO_CODE varchar(50), QUANTITY numeric(72,2), SECURITY_SYMBOL varchar(255)); +COMMENT ON TABLE DEPO_BALANCE_REGISTER IS 'Реестр остатков ценных бумаг'; + +COMMENT ON COLUMN DEPO_BALANCE_REGISTER.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN DEPO_BALANCE_REGISTER.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN DEPO_BALANCE_REGISTER.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN DEPO_BALANCE_REGISTER.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN DEPO_BALANCE_REGISTER.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +COMMENT ON COLUMN DEPO_BALANCE_REGISTER.SET_HOUSE_NAME IS 'Наименование РД'; + +COMMENT ON COLUMN DEPO_BALANCE_REGISTER.NUMBER IS 'Номер отчета'; + +COMMENT ON COLUMN DEPO_BALANCE_REGISTER.DEPO_CODE IS 'Код раздела субсчета/счета депо'; + +COMMENT ON COLUMN DEPO_BALANCE_REGISTER.QUANTITY IS 'Количество'; + +COMMENT ON COLUMN DEPO_BALANCE_REGISTER.SECURITY_SYMBOL IS 'Код ценной бумаги'; + +GRANT ALL PRIVILEGES ON TABLE DEPO_BALANCE_REGISTER TO clearing; + +-- moneyBalanceRegister - Реестр остатков денежных средств +DROP TABLE IF EXISTS MONEY_BALANCE_REGISTER; +CREATE TABLE MONEY_BALANCE_REGISTER(SET_HOUSE_NAME varchar(255), NUMBER varchar(255), CREATED_AT timestamp, CURRENCY_CODE varchar(4), COMPANY_ID bigint, ACCOUNT varchar(50), REMAINDER_SUM numeric(72,18), INFO_ACCOUNT varchar(50), COMPANY_FULL_NAME varchar(255), ID bigint PRIMARY KEY, INN varchar(255), SESSION_ID bigint, BLOCKED_SUM numeric(72,18), UNBLOCKED_SUM numeric(72,18), UPDATED_AT timestamp); +COMMENT ON TABLE MONEY_BALANCE_REGISTER IS 'Реестр остатков денежных средств'; + +COMMENT ON COLUMN MONEY_BALANCE_REGISTER.SET_HOUSE_NAME IS 'Наименование РО'; + +COMMENT ON COLUMN MONEY_BALANCE_REGISTER.NUMBER IS 'Номер отчета'; + +COMMENT ON COLUMN MONEY_BALANCE_REGISTER.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN MONEY_BALANCE_REGISTER.CURRENCY_CODE IS 'Код валюты (linked to currencyCode)'; + +COMMENT ON COLUMN MONEY_BALANCE_REGISTER.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN MONEY_BALANCE_REGISTER.ACCOUNT IS 'Номер торгового /клирингового счета/ счета внутреннего учета СПВБ'; + +COMMENT ON COLUMN MONEY_BALANCE_REGISTER.REMAINDER_SUM IS 'Остаток денежных средств'; + +COMMENT ON COLUMN MONEY_BALANCE_REGISTER.INFO_ACCOUNT IS 'Номер счета внутреннего учета СПВБ'; + +COMMENT ON COLUMN MONEY_BALANCE_REGISTER.COMPANY_FULL_NAME IS 'Полное наименование компании'; + +COMMENT ON COLUMN MONEY_BALANCE_REGISTER.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN MONEY_BALANCE_REGISTER.INN IS 'Идентификационный номер налогоплательщика (ИНН)'; + +COMMENT ON COLUMN MONEY_BALANCE_REGISTER.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +COMMENT ON COLUMN MONEY_BALANCE_REGISTER.BLOCKED_SUM IS 'Сумма блокированных денежных средств'; + +COMMENT ON COLUMN MONEY_BALANCE_REGISTER.UNBLOCKED_SUM IS 'Сумма свободных денежных средств'; + +COMMENT ON COLUMN MONEY_BALANCE_REGISTER.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE MONEY_BALANCE_REGISTER TO clearing; + +-- admittedLiabilitiesRegister - Реестр обязательств, допущенных к клирингу +DROP TABLE IF EXISTS ADMITTED_LIABILITIES_REGISTER; +CREATE TABLE ADMITTED_LIABILITIES_REGISTER(COMPANY_FULL_NAME varchar(255), SESSION_ID bigint, SECURITY_SYMBOL varchar(255), SECURITY_FULL_NAME varchar(255), COMPANY_ID bigint, CLEARING_CODE varchar(255), ACCOUNT varchar(50), AMOUNT numeric(72,18), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date); +COMMENT ON TABLE ADMITTED_LIABILITIES_REGISTER IS 'Реестр обязательств, допущенных к клирингу'; + +COMMENT ON COLUMN ADMITTED_LIABILITIES_REGISTER.COMPANY_FULL_NAME IS 'Полное наименование компании'; + +COMMENT ON COLUMN ADMITTED_LIABILITIES_REGISTER.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +COMMENT ON COLUMN ADMITTED_LIABILITIES_REGISTER.SECURITY_SYMBOL IS 'Финансовый инструмент'; + +COMMENT ON COLUMN ADMITTED_LIABILITIES_REGISTER.SECURITY_FULL_NAME IS 'Полное наименование инструмента'; + +COMMENT ON COLUMN ADMITTED_LIABILITIES_REGISTER.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN ADMITTED_LIABILITIES_REGISTER.CLEARING_CODE IS 'Код участника клиринга'; + +COMMENT ON COLUMN ADMITTED_LIABILITIES_REGISTER.ACCOUNT IS 'Счет компании'; + +COMMENT ON COLUMN ADMITTED_LIABILITIES_REGISTER.AMOUNT IS 'Сумма обязательств'; + +COMMENT ON COLUMN ADMITTED_LIABILITIES_REGISTER.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN ADMITTED_LIABILITIES_REGISTER.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN ADMITTED_LIABILITIES_REGISTER.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN ADMITTED_LIABILITIES_REGISTER.CLEARING_DATE IS 'Дата клиринга'; + +GRANT ALL PRIVILEGES ON TABLE ADMITTED_LIABILITIES_REGISTER TO clearing; + +-- coveredLiabilitiesRegister - Реестр обязательств, прошедших процедуру контроля обеспечения +DROP TABLE IF EXISTS COVERED_LIABILITIES_REGISTER; +CREATE TABLE COVERED_LIABILITIES_REGISTER(COMPANY_FULL_NAME varchar(255), SESSION_ID bigint, SECURITY_SYMBOL varchar(255), SECURITY_FULL_NAME varchar(255), COMPANY_ID bigint, CLEARING_CODE varchar(255), ACCOUNT varchar(50), AMOUNT numeric(72,18), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date); +COMMENT ON TABLE COVERED_LIABILITIES_REGISTER IS 'Реестр обязательств, прошедших процедуру контроля обеспечения'; + +COMMENT ON COLUMN COVERED_LIABILITIES_REGISTER.COMPANY_FULL_NAME IS 'Полное наименование компании'; + +COMMENT ON COLUMN COVERED_LIABILITIES_REGISTER.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +COMMENT ON COLUMN COVERED_LIABILITIES_REGISTER.SECURITY_SYMBOL IS 'Финансовый инструмент'; + +COMMENT ON COLUMN COVERED_LIABILITIES_REGISTER.SECURITY_FULL_NAME IS 'Полное наименование инструмента'; + +COMMENT ON COLUMN COVERED_LIABILITIES_REGISTER.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN COVERED_LIABILITIES_REGISTER.CLEARING_CODE IS 'Код участника клиринга'; + +COMMENT ON COLUMN COVERED_LIABILITIES_REGISTER.ACCOUNT IS 'Счет компании'; + +COMMENT ON COLUMN COVERED_LIABILITIES_REGISTER.AMOUNT IS 'Сумма обязательств'; + +COMMENT ON COLUMN COVERED_LIABILITIES_REGISTER.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN COVERED_LIABILITIES_REGISTER.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN COVERED_LIABILITIES_REGISTER.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN COVERED_LIABILITIES_REGISTER.CLEARING_DATE IS 'Дата клиринга'; + +GRANT ALL PRIVILEGES ON TABLE COVERED_LIABILITIES_REGISTER TO clearing; + +-- moneyPaymentInstructionRegister - Реестр распоряжений, направленных расчетной организации +DROP TABLE IF EXISTS MONEY_PAYMENT_INSTRUCTION_REGISTER; +CREATE TABLE MONEY_PAYMENT_INSTRUCTION_REGISTER(CREDIT_LEG_ACCOUNT varchar(50), CREDIT_LEG_AMOUNT numeric(72,18), CREDIT_LEG_CURRENCY_CODE varchar(4), DEBIT_LEG_ACCOUNT varchar(50), SENDER varchar(255), ADDRESSEE varchar(255), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date); +COMMENT ON TABLE MONEY_PAYMENT_INSTRUCTION_REGISTER IS 'Реестр распоряжений, направленных расчетной организации'; + +COMMENT ON COLUMN MONEY_PAYMENT_INSTRUCTION_REGISTER.CREDIT_LEG_ACCOUNT IS 'Счет отправителя'; + +COMMENT ON COLUMN MONEY_PAYMENT_INSTRUCTION_REGISTER.CREDIT_LEG_AMOUNT IS 'Сумма отправителя'; + +COMMENT ON COLUMN MONEY_PAYMENT_INSTRUCTION_REGISTER.CREDIT_LEG_CURRENCY_CODE IS 'Код валюты отправителя (linked to currency)'; + +COMMENT ON COLUMN MONEY_PAYMENT_INSTRUCTION_REGISTER.DEBIT_LEG_ACCOUNT IS 'Счет получателя'; + +COMMENT ON COLUMN MONEY_PAYMENT_INSTRUCTION_REGISTER.SENDER IS 'Отправитель'; + +COMMENT ON COLUMN MONEY_PAYMENT_INSTRUCTION_REGISTER.ADDRESSEE IS 'Получатель'; + +COMMENT ON COLUMN MONEY_PAYMENT_INSTRUCTION_REGISTER.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN MONEY_PAYMENT_INSTRUCTION_REGISTER.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN MONEY_PAYMENT_INSTRUCTION_REGISTER.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN MONEY_PAYMENT_INSTRUCTION_REGISTER.CLEARING_DATE IS 'Дата расчета'; + +GRANT ALL PRIVILEGES ON TABLE MONEY_PAYMENT_INSTRUCTION_REGISTER TO clearing; + +-- depoPaymentInstructionRegister - Реестр распоряжений, направленных расчетному депозитарию +DROP TABLE IF EXISTS DEPO_PAYMENT_INSTRUCTION_REGISTER; +CREATE TABLE DEPO_PAYMENT_INSTRUCTION_REGISTER(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, COMPANY_ID bigint, TRADING_CLEARING_REGISTRY_TYPE varchar(255), TRADING_CLEARING_REGISTRY varchar(50), CB_CODE varchar(50), QUANTITY numeric(72,2), DIRECTION bigint, SESSION_ID bigint); +COMMENT ON TABLE DEPO_PAYMENT_INSTRUCTION_REGISTER IS 'Реестр распоряжений, направленных расчетному депозитарию'; + +COMMENT ON COLUMN DEPO_PAYMENT_INSTRUCTION_REGISTER.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN DEPO_PAYMENT_INSTRUCTION_REGISTER.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN DEPO_PAYMENT_INSTRUCTION_REGISTER.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN DEPO_PAYMENT_INSTRUCTION_REGISTER.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN DEPO_PAYMENT_INSTRUCTION_REGISTER.TRADING_CLEARING_REGISTRY_TYPE IS 'Тип торгово-клирингового регистра'; + +COMMENT ON COLUMN DEPO_PAYMENT_INSTRUCTION_REGISTER.TRADING_CLEARING_REGISTRY IS 'Торгово-клиринговый регистр'; + +COMMENT ON COLUMN DEPO_PAYMENT_INSTRUCTION_REGISTER.CB_CODE IS 'Код ЦБ'; + +COMMENT ON COLUMN DEPO_PAYMENT_INSTRUCTION_REGISTER.QUANTITY IS 'Количество'; + +COMMENT ON COLUMN DEPO_PAYMENT_INSTRUCTION_REGISTER.DIRECTION IS 'Направление (linked to inOutDirection)'; + +COMMENT ON COLUMN DEPO_PAYMENT_INSTRUCTION_REGISTER.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +GRANT ALL PRIVILEGES ON TABLE DEPO_PAYMENT_INSTRUCTION_REGISTER TO clearing; + +-- excludeLiabilitiesRegister - Реестр обязательств, исключенных из клирингового пула +DROP TABLE IF EXISTS EXCLUDE_LIABILITIES_REGISTER; +CREATE TABLE EXCLUDE_LIABILITIES_REGISTER(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SESSION_ID bigint, VALID_FROM_DATE date, VALID_TO_DATE date, COMPANY_ID bigint, COMPANY_FULL_NAME varchar(255), INN varchar(255), SEGMENT varchar(10), REGISTRY_CODE varchar(4), ACCOUNT varchar(50), REGISTRY_STATUS varchar(4), CURRENCY varchar(4), SUM_LIABILITIES numeric(72,18), SETTLEMENT_DATE date); +COMMENT ON TABLE EXCLUDE_LIABILITIES_REGISTER IS 'Реестр обязательств, исключенных из клирингового пула'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.VALID_FROM_DATE IS 'Дата начала cессии'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.VALID_TO_DATE IS 'Дата окончания cессии'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.COMPANY_FULL_NAME IS 'Полное наименование компании'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.INN IS 'Идентификационный номер налогоплательщика (ИНН)'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.SEGMENT IS 'Сегмент'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.REGISTRY_CODE IS 'Код регистра (linked to tradingClearingRegistryType)'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.ACCOUNT IS 'Наименование счета'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.REGISTRY_STATUS IS 'Код статуса'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.CURRENCY IS 'Код валюты отправителя (linked to currency)'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.SUM_LIABILITIES IS 'Сумма обязательств'; + +COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.SETTLEMENT_DATE IS 'Дата расчета'; + +GRANT ALL PRIVILEGES ON TABLE EXCLUDE_LIABILITIES_REGISTER TO clearing; + +-- pairSdf - Пары файлов +DROP TABLE IF EXISTS PAIR_SDF; +CREATE TABLE PAIR_SDF(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, IN_S_DF_ID varchar(255), IN_S_DF varchar(255), OUT_S_DF_ID varchar(255), OUT_S_DF varchar(255)); +COMMENT ON TABLE PAIR_SDF IS 'Пары файлов'; + +COMMENT ON COLUMN PAIR_SDF.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN PAIR_SDF.CREATED_AT IS 'Время создания записи'; + +COMMENT ON COLUMN PAIR_SDF.UPDATED_AT IS 'Время изменения записи'; + +COMMENT ON COLUMN PAIR_SDF.IN_S_DF_ID IS 'Идентификатор входящего файла'; + +COMMENT ON COLUMN PAIR_SDF.IN_S_DF IS 'Входящий файл'; + +COMMENT ON COLUMN PAIR_SDF.OUT_S_DF_ID IS 'Идентификатор исходящего файла'; + +COMMENT ON COLUMN PAIR_SDF.OUT_S_DF IS 'Исходящий файл'; + +GRANT ALL PRIVILEGES ON TABLE PAIR_SDF TO clearing; + +-- gatewayResult - Результаты запросов к ТС +DROP TABLE IF EXISTS GATEWAY_RESULT; +CREATE TABLE GATEWAY_RESULT(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, REQUEST_ID varchar(255), NAME_REQUEST varchar(255), REQUEST varchar(1023), RESULT varchar(1023), GATEWAY_RESULT_STATUS varchar(4)); +COMMENT ON TABLE GATEWAY_RESULT IS 'Результаты запросов к ТС'; + +COMMENT ON COLUMN GATEWAY_RESULT.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN GATEWAY_RESULT.CREATED_AT IS 'Время создания записи'; + +COMMENT ON COLUMN GATEWAY_RESULT.UPDATED_AT IS 'Время изменения записи'; + +COMMENT ON COLUMN GATEWAY_RESULT.REQUEST_ID IS 'ID запроса'; + +COMMENT ON COLUMN GATEWAY_RESULT.NAME_REQUEST IS 'Наименование запроса'; + +COMMENT ON COLUMN GATEWAY_RESULT.REQUEST IS 'Тело запроса'; + +COMMENT ON COLUMN GATEWAY_RESULT.RESULT IS 'Тело ответа'; + +COMMENT ON COLUMN GATEWAY_RESULT.GATEWAY_RESULT_STATUS IS 'Статус запроса (linked to gatewayResultStatus)'; + +GRANT ALL PRIVILEGES ON TABLE GATEWAY_RESULT TO clearing; + +-- liabilitiesRegister - Реестр учета обязательств +DROP TABLE IF EXISTS LIABILITIES_REGISTER; +CREATE TABLE LIABILITIES_REGISTER(ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, SESSION_ID bigint, VALID_FROM_DATE date, VALID_TO_DATE date, COMPANY_ID bigint, COMPANY_FULL_NAME varchar(255), INN varchar(255), SEGMENT varchar(10), REGISTRY_CODE varchar(4), ACCOUNT varchar(50), REGISTRY_STATUS varchar(4), CURRENCY varchar(4), SUM_LIABILITIES numeric(72,18), SETTLEMENT_DATE date); +COMMENT ON TABLE LIABILITIES_REGISTER IS 'Реестр учета обязательств'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.VALID_FROM_DATE IS 'Дата начала cессии'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.VALID_TO_DATE IS 'Дата окончания cессии'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.COMPANY_FULL_NAME IS 'Полное наименование компании'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.INN IS 'Идентификационный номер налогоплательщика (ИНН)'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.SEGMENT IS 'Сегмент'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.REGISTRY_CODE IS 'Код регистра (linked to tradingClearingRegistryType)'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.ACCOUNT IS 'Наименование счета'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.REGISTRY_STATUS IS 'Код статуса'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.CURRENCY IS 'Код валюты отправителя (linked to currency)'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.SUM_LIABILITIES IS 'Сумма обязательств'; + +COMMENT ON COLUMN LIABILITIES_REGISTER.SETTLEMENT_DATE IS 'Дата расчета'; + +GRANT ALL PRIVILEGES ON TABLE LIABILITIES_REGISTER TO clearing; + +-- executionRegister - Реестр сделок +DROP TABLE IF EXISTS EXECUTION_REGISTER; +CREATE TABLE EXECUTION_REGISTER(TRADING_DATE date, EXCHANGE_EXECUTION_ID bigint, EXCHANGE_EXECUTION_TIME timestamp, SECURITY_ID bigint, SELLER_ID bigint, SELLER_CLEARING_CODE varchar(255), SELLER_TRADING_CLEARING_REGISTER varchar(255), SELLER_MONEY_ACCOUNT varchar(50), SELLER_DEPO_ACCOUNT varchar(50), BUYER_ID bigint, BUYER_CLEARING_CODE varchar(255), BUYER_TRADING_CLEARING_REGISTER varchar(255), BUYER_MONEY_ACCOUNT varchar(50), BUYER_DEPO_ACCOUNT varchar(50), AMOUNT numeric(72,2), QUANTITY numeric(72,2), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date); +COMMENT ON TABLE EXECUTION_REGISTER IS 'Реестр сделок'; + +COMMENT ON COLUMN EXECUTION_REGISTER.TRADING_DATE IS 'Дата заключения сделки'; + +COMMENT ON COLUMN EXECUTION_REGISTER.EXCHANGE_EXECUTION_ID IS 'Идентификационный номер сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_REGISTER.EXCHANGE_EXECUTION_TIME IS 'Время заключения сделки в Торговой системе'; + +COMMENT ON COLUMN EXECUTION_REGISTER.SECURITY_ID IS 'Идентификатор финансового инструмента (linked to security)'; + +COMMENT ON COLUMN EXECUTION_REGISTER.SELLER_ID IS 'Идентификатор компании-продавца (linked to company)'; + +COMMENT ON COLUMN EXECUTION_REGISTER.SELLER_CLEARING_CODE IS 'Клиринговый код продавца'; + +COMMENT ON COLUMN EXECUTION_REGISTER.SELLER_TRADING_CLEARING_REGISTER IS 'Торгово-клиринговый регистр продавца'; + +COMMENT ON COLUMN EXECUTION_REGISTER.SELLER_MONEY_ACCOUNT IS 'Денежный счет продавца'; + +COMMENT ON COLUMN EXECUTION_REGISTER.SELLER_DEPO_ACCOUNT IS 'Депо счет продавца'; + +COMMENT ON COLUMN EXECUTION_REGISTER.BUYER_ID IS 'Идентификатор компании-покупателя (linked to company)'; + +COMMENT ON COLUMN EXECUTION_REGISTER.BUYER_CLEARING_CODE IS 'Клиринговый код покупателя'; + +COMMENT ON COLUMN EXECUTION_REGISTER.BUYER_TRADING_CLEARING_REGISTER IS 'Торгово-клиринговый регистр покупателя'; + +COMMENT ON COLUMN EXECUTION_REGISTER.BUYER_MONEY_ACCOUNT IS 'Денежный счет покупателя'; + +COMMENT ON COLUMN EXECUTION_REGISTER.BUYER_DEPO_ACCOUNT IS 'Депо счет покупателя'; + +COMMENT ON COLUMN EXECUTION_REGISTER.AMOUNT IS 'Сумма сделки'; + +COMMENT ON COLUMN EXECUTION_REGISTER.QUANTITY IS 'Количество ценных бумаг'; + +COMMENT ON COLUMN EXECUTION_REGISTER.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN EXECUTION_REGISTER.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN EXECUTION_REGISTER.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN EXECUTION_REGISTER.CLEARING_DATE IS 'Дата клиринга'; + +GRANT ALL PRIVILEGES ON TABLE EXECUTION_REGISTER TO clearing; + +-- statement - Транзакции по деньгам/бумагам +DROP TABLE IF EXISTS STATEMENT; +CREATE TABLE STATEMENT(ADDRESSEE_ID bigint, SENDER_ID bigint, STATEMENT_TYPE varchar(4), SECURITY_ID bigint, CONTRACT varchar(255), COMMENT varchar(255), ACCOUNT_ID bigint, ACCOUNT varchar(50), IN_OUT_DIRECTION varchar(4), SETTLEMENT_DATE date, AMOUNT numeric(72,2), OPERATION_STATUS varchar(4), ERROR_CODE_ID bigint, ERROR_TEXT_ID bigint, IN_S_DF_ID bigint, OUT_S_DF_ID bigint, IN_OUT_S_DF_TYPE varchar(4), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date); +COMMENT ON TABLE STATEMENT IS 'Транзакции по деньгам/бумагам'; + +COMMENT ON COLUMN STATEMENT.ADDRESSEE_ID IS 'Идентификатор компании-получателя (linked to company)'; + +COMMENT ON COLUMN STATEMENT.SENDER_ID IS 'Идентификатор компании-отправителя (linked to company)'; + +COMMENT ON COLUMN STATEMENT.STATEMENT_TYPE IS 'Код типа поступления средств (linked to statementType)'; + +COMMENT ON COLUMN STATEMENT.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN STATEMENT.CONTRACT IS 'Продукт'; + +COMMENT ON COLUMN STATEMENT.COMMENT IS 'Комментарий'; + +COMMENT ON COLUMN STATEMENT.ACCOUNT_ID IS 'Идентификатор счета (linked to account)'; + +COMMENT ON COLUMN STATEMENT.ACCOUNT IS 'Наименование счета'; + +COMMENT ON COLUMN STATEMENT.IN_OUT_DIRECTION IS 'Код направления (linked to inOutDirection)'; + +COMMENT ON COLUMN STATEMENT.SETTLEMENT_DATE IS 'Дата расчетов'; + +COMMENT ON COLUMN STATEMENT.AMOUNT IS 'Объем'; + +COMMENT ON COLUMN STATEMENT.OPERATION_STATUS IS 'Код статуса обработки (linked to operationStatus)'; + +COMMENT ON COLUMN STATEMENT.ERROR_CODE_ID IS 'Идентификатор кода ошибки (linked to errorCode)'; + +COMMENT ON COLUMN STATEMENT.ERROR_TEXT_ID IS 'Идентификатор полного текста ошибки (linked to errorText)'; + +COMMENT ON COLUMN STATEMENT.IN_S_DF_ID IS 'Идентификатор записи, инициировавшая изменения этой таблицы'; + +COMMENT ON COLUMN STATEMENT.OUT_S_DF_ID IS 'Идентификатор записи, сформированная в результате изменения этой таблицы'; + +COMMENT ON COLUMN STATEMENT.IN_OUT_S_DF_TYPE IS 'Код типа входящей и исходящей записей (linked to inOutSDfType)'; + +COMMENT ON COLUMN STATEMENT.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN STATEMENT.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN STATEMENT.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN STATEMENT.CLEARING_DATE IS 'Дата расчета'; + +GRANT ALL PRIVILEGES ON TABLE STATEMENT TO clearing; + +-- paymentInstruction - Платежные поручения +DROP TABLE IF EXISTS PAYMENT_INSTRUCTION; +CREATE TABLE PAYMENT_INSTRUCTION(SENDER_ID bigint, ADDRESSEE_ID bigint, PAYEE_BIC varchar(255), ADRESSEE_BIC varchar(255), PAYEE_BANK_NAME varchar(255), ADDRESSEE_BANK_NAME varchar(255), PAYMENT_DATE timestamp, PAYMENT_PURPOSE varchar(255), SETTLEMENT_DATE date, CREDIT_LEG_AMOUNT numeric(72,18), DEBIT_LEG_AMOUNT numeric(72,18), 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 varchar(4), DEBIT_LEG_DIRECTION varchar(4), CREDIT_LEG_CURRENCY_CODE varchar(4), DEBIT_LEG_CURRENCY_CODE varchar(4), CREDIT_LEG_SECURITY_ID bigint, DEBIT_LEG_SECURITY_ID bigint, TRANSACTION_STATUS varchar(4), DOCUMENT_NUMBER varchar(255), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date, SESSION_ID bigint); +COMMENT ON TABLE PAYMENT_INSTRUCTION IS 'Платежные поручения'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.SENDER_ID IS 'Идентификатор компании-отправителя (linked to company)'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.ADDRESSEE_ID IS 'Идентификатор компании-получателя (linked to company)'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.PAYEE_BIC IS 'Банковский идентификационный код (БИК) отправителя'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.ADRESSEE_BIC IS 'Банковский идентификационный код (БИК) получателя'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.PAYEE_BANK_NAME IS 'Наименование банка отправителя'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.ADDRESSEE_BANK_NAME IS 'Наименование банка получателя'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.PAYMENT_DATE IS 'Дата и время платежа'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.PAYMENT_PURPOSE IS 'Назначение платежа'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.SETTLEMENT_DATE IS 'Дата расчетов'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.CREDIT_LEG_AMOUNT IS 'Сумма отправителя'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.DEBIT_LEG_AMOUNT IS 'Сумма получателя'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.CREDIT_LEG_ACCOUNT_ID IS 'Идентификатор счета отправителя (linked to account)'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.CREDIT_CS_ACCOUNT IS 'Корреспондентский счет отправителя'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.CREDIT_LEG_ACCOUNT IS 'Счет отправителя'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.DEBIT_LEG_ACCOUNT_ID IS 'Идентификатор счета получателя (linked to account)'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.DEBIT_CS_ACCOUNT IS 'Корреспондентский счет получателя'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.DEBIT_LEG_ACCOUNT IS 'Счет получателя'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.CREDIT_LEG_DIRECTION IS 'Код направления отправителя (linked to inOutDirection)'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.DEBIT_LEG_DIRECTION IS 'Код направления получателя (linked to inOutDirection)'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.CREDIT_LEG_CURRENCY_CODE IS 'Код валюты отправителя (linked to currency)'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.DEBIT_LEG_CURRENCY_CODE IS 'Код валюты получателя (linked to currency)'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.CREDIT_LEG_SECURITY_ID IS 'Идентификатор инструмента отправителя (linked to security)'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.DEBIT_LEG_SECURITY_ID IS 'Идентификатор инструмента получателя (linked to security)'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.TRANSACTION_STATUS IS 'Код статуса транзакции (linked to transactionStatus)'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.DOCUMENT_NUMBER IS 'Номер документа в сторонней системе'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.CLEARING_DATE IS 'Дата расчета'; + +COMMENT ON COLUMN PAYMENT_INSTRUCTION.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +GRANT ALL PRIVILEGES ON TABLE PAYMENT_INSTRUCTION TO clearing; + +-- notification - Сообщения +DROP TABLE IF EXISTS NOTIFICATION; +CREATE TABLE NOTIFICATION(ID bigint PRIMARY KEY, CLEARING_DATE date, CREATED_AT timestamp, UPDATED_AT timestamp, SENDER_ID bigint, ADDRESSEE_ID bigint, OBJECT_TYPE varchar(4), OBJECT_ID bigint, NOTIFICATION_STATUS varchar(4), COMMENT varchar(255), PRIORITY varchar(4)); +COMMENT ON TABLE NOTIFICATION IS 'Сообщения'; + +COMMENT ON COLUMN NOTIFICATION.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN NOTIFICATION.CLEARING_DATE IS 'Дата'; + +COMMENT ON COLUMN NOTIFICATION.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN NOTIFICATION.UPDATED_AT 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)'; + +COMMENT ON COLUMN NOTIFICATION.COMMENT IS 'Текст сообщения'; + +COMMENT ON COLUMN NOTIFICATION.PRIORITY IS 'Код приоритета отображения (linked to priority)'; + +GRANT ALL PRIVILEGES ON TABLE NOTIFICATION TO clearing; + + +-- History log of notification - Сообщения +DROP TABLE IF EXISTS NOTIFICATION_HISTORY; +CREATE TABLE NOTIFICATION_HISTORY(NOTIFICATION_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, EVENT_TYPE VARCHAR(4), ID bigint PRIMARY KEY, CLEARING_DATE date, CREATED_AT timestamp, UPDATED_AT timestamp, SENDER_ID bigint, ADDRESSEE_ID bigint, OBJECT_TYPE varchar(4), OBJECT_ID bigint, NOTIFICATION_STATUS varchar(4), COMMENT varchar(255), PRIORITY varchar(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.EVENT_TYPE IS 'Тип изменения'; + +COMMENT ON COLUMN NOTIFICATION_HISTORY.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN NOTIFICATION_HISTORY.CLEARING_DATE IS 'Дата'; + +COMMENT ON COLUMN NOTIFICATION_HISTORY.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN NOTIFICATION_HISTORY.UPDATED_AT 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)'; + +COMMENT ON COLUMN NOTIFICATION_HISTORY.COMMENT IS 'Текст сообщения'; + +COMMENT ON COLUMN NOTIFICATION_HISTORY.PRIORITY IS 'Код приоритета отображения (linked to priority)'; + +GRANT ALL PRIVILEGES ON TABLE NOTIFICATION_HISTORY TO clearing; + +-- verificationResult - Результаты сверки +DROP TABLE IF EXISTS VERIFICATION_RESULT; +CREATE TABLE VERIFICATION_RESULT(CLEARING_CODE varchar(255), ACCOUNT_ID bigint, IN_SUM numeric(72,2), OUT_INT_SUM numeric(72,2), OUT_EXT_SUM numeric(72,2), DIFF_SUM numeric(72,2), GENERATION_ID bigint, GENERATION_STATUS varchar(4), RESULT_STATUS varchar(4), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE VERIFICATION_RESULT IS 'Результаты сверки'; + +COMMENT ON COLUMN VERIFICATION_RESULT.CLEARING_CODE IS 'Код участника клиринга'; + +COMMENT ON COLUMN VERIFICATION_RESULT.ACCOUNT_ID IS 'Идентификатор счета УК, по которому проводится сверка'; + +COMMENT ON COLUMN VERIFICATION_RESULT.IN_SUM IS 'Входящая сумма остатков'; + +COMMENT ON COLUMN VERIFICATION_RESULT.OUT_INT_SUM IS 'Исходящая сумма остатков, полученная в КС'; + +COMMENT ON COLUMN VERIFICATION_RESULT.OUT_EXT_SUM IS 'Исходящая сумма остатков из отчета ПРЦ'; + +COMMENT ON COLUMN VERIFICATION_RESULT.DIFF_SUM IS 'Сумма расхождений'; + +COMMENT ON COLUMN VERIFICATION_RESULT.GENERATION_ID IS 'Идентификатор взаимодействия'; + +COMMENT ON COLUMN VERIFICATION_RESULT.GENERATION_STATUS IS 'Код общего статуса сверки (linked to resultStatus)'; + +COMMENT ON COLUMN VERIFICATION_RESULT.RESULT_STATUS IS 'Код статуса сверки (linked to resultStatus)'; + +COMMENT ON COLUMN VERIFICATION_RESULT.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN VERIFICATION_RESULT.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN VERIFICATION_RESULT.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE VERIFICATION_RESULT TO clearing; + +-- sDf01 - ДФ-01 Информация о денежных средствах, находящихся на торгово-банковских счетах участников клиринга +DROP TABLE IF EXISTS S_DF01; +CREATE TABLE S_DF01(ID bigint PRIMARY KEY, CURR_CODE varchar(12), ACCOUNT varchar(35), REMAINDER varchar(22), DEAL varchar(10), ACC_CODE varchar(5), DAT varchar(8), MARKET varchar(1), ACC_NAME varchar(30), ACC_TYPE varchar(2), SUMENGAGE varchar(22), SUMUNBLOCK varchar(22), FILE_TYPE varchar(1), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF01 IS 'ДФ-01 Информация о денежных средствах, находящихся на торгово-банковских счетах участников клиринга'; + +COMMENT ON COLUMN S_DF01.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF01.CURR_CODE IS 'Код валюты'; + +COMMENT ON COLUMN S_DF01.ACCOUNT IS 'Счет участника клиринга'; + +COMMENT ON COLUMN S_DF01.REMAINDER IS 'Остаток денежных средств'; + +COMMENT ON COLUMN S_DF01.DEAL IS 'Биржевой код участника клиринга'; + +COMMENT ON COLUMN S_DF01.ACC_CODE IS 'Код счета'; + +COMMENT ON COLUMN S_DF01.DAT IS 'Дата расчетов'; + +COMMENT ON COLUMN S_DF01.MARKET IS 'Биржевая секция'; + +COMMENT ON COLUMN S_DF01.ACC_NAME IS 'Наименование участника клиринга'; + +COMMENT ON COLUMN S_DF01.ACC_TYPE IS 'Признак счета'; + +COMMENT ON COLUMN S_DF01.SUMENGAGE IS 'Сумма блокированных денежных средств'; + +COMMENT ON COLUMN S_DF01.SUMUNBLOCK IS 'Сумма свободных денежных средств'; + +COMMENT ON COLUMN S_DF01.FILE_TYPE IS 'Тип файла'; + +COMMENT ON COLUMN S_DF01.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF01.GENERATION_TIME IS 'Дата и время обработки файла'; + +COMMENT ON COLUMN S_DF01.GENERATION_ID IS 'Идентификатор взаимодействия'; + +GRANT ALL PRIVILEGES ON TABLE S_DF01 TO clearing; + +-- sDf02 - ДФ-02 Уведомление об исполнении операции загрузки денежных средств или уведомление об ошибке +DROP TABLE IF EXISTS S_DF02; +CREATE TABLE S_DF02(ID bigint PRIMARY KEY, CURR_CODE varchar(12), ACCOUNT varchar(35), REMAINDER varchar(22), DEAL varchar(10), ACC_CODE varchar(5), DAT varchar(8), MARKET varchar(1), ACC_NAME varchar(30), ACC_TYPE varchar(2), SUMENGAGE varchar(22), SUMUNBLOCK varchar(22), FILE_TYPE varchar(1), RESULT varchar(3), GENERATION_TIME timestamp, GENERATION_ID bigint, FILE_NAME varchar(255), IN_S_DF_ID bigint); +COMMENT ON TABLE S_DF02 IS 'ДФ-02 Уведомление об исполнении операции загрузки денежных средств или уведомление об ошибке'; + +COMMENT ON COLUMN S_DF02.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF02.CURR_CODE IS 'Код валюты'; + +COMMENT ON COLUMN S_DF02.ACCOUNT IS 'Счет участника клиринга'; + +COMMENT ON COLUMN S_DF02.REMAINDER IS 'Остаток денежных средств'; + +COMMENT ON COLUMN S_DF02.DEAL IS 'Биржевой код участника клиринга'; + +COMMENT ON COLUMN S_DF02.ACC_CODE IS 'Код счета'; + +COMMENT ON COLUMN S_DF02.DAT IS 'Дата расчетов'; + +COMMENT ON COLUMN S_DF02.MARKET IS 'Биржевая секция'; + +COMMENT ON COLUMN S_DF02.ACC_NAME IS 'Наименование участника клиринга'; + +COMMENT ON COLUMN S_DF02.ACC_TYPE IS 'Признак счета'; + +COMMENT ON COLUMN S_DF02.SUMENGAGE IS 'Сумма блокированных денежных средств'; + +COMMENT ON COLUMN S_DF02.SUMUNBLOCK IS 'Сумма свободных денежных средств'; + +COMMENT ON COLUMN S_DF02.FILE_TYPE IS 'Тип файла'; + +COMMENT ON COLUMN S_DF02.RESULT IS 'Результат обработки каждой записи исходного файла ДФ-01'; + +COMMENT ON COLUMN S_DF02.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF02.GENERATION_ID IS 'Идентификатор взаимодействия'; + +COMMENT ON COLUMN S_DF02.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF02.IN_S_DF_ID IS 'Идентификатор соответствующей записи из таблицы-источника'; + +GRANT ALL PRIVILEGES ON TABLE S_DF02 TO clearing; + +-- sDf03 - ДФ-03 Реестр платежных поручений +DROP TABLE IF EXISTS S_DF03; +CREATE TABLE S_DF03(ID bigint PRIMARY KEY, SEG_TYPE varchar(1), DOC_TYPE varchar(4), DOCNM_REF varchar(16), DOCNMPREV varchar(16), C_ACC_DEB varchar(35), SBANKNAM1 varchar(35), SBANKNAM2 varchar(35), SBANKNAM3 varchar(35), SBANKNAM4 varchar(35), SBANKNAM5 varchar(35), C_ACC_CRED varchar(35), RBANKNAM1 varchar(35), RBANKNAM2 varchar(35), RBANKNAM3 varchar(35), RBANKNAM4 varchar(35), RBANKNAM5 varchar(35), PAY_DATE varchar(8), PAY_VAL varchar(12), SUM_DEB varchar(22), SPECIF_1 varchar(255), IMP_RESULT varchar(3), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint, PAYMENT_INSTRUCTION_ID bigint); +COMMENT ON TABLE S_DF03 IS 'ДФ-03 Реестр платежных поручений'; + +COMMENT ON COLUMN S_DF03.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF03.SEG_TYPE IS 'Код инициатора в КС'; + +COMMENT ON COLUMN S_DF03.DOC_TYPE IS 'Тип документа'; + +COMMENT ON COLUMN S_DF03.DOCNM_REF IS 'Ссылочный номер документа у отправителя'; + +COMMENT ON COLUMN S_DF03.DOCNMPREV IS 'Ссылка на предшествующий документ'; + +COMMENT ON COLUMN S_DF03.C_ACC_DEB IS 'Счет по дебету'; + +COMMENT ON COLUMN S_DF03.SBANKNAM1 IS 'Наименование банка-плательщика 1'; + +COMMENT ON COLUMN S_DF03.SBANKNAM2 IS 'Наименование банка-плательщика 2'; + +COMMENT ON COLUMN S_DF03.SBANKNAM3 IS 'Наименование банка-плательщика 3'; + +COMMENT ON COLUMN S_DF03.SBANKNAM4 IS 'Наименование банка-плательщика 4'; + +COMMENT ON COLUMN S_DF03.SBANKNAM5 IS 'Наименование банка-плательщика 5'; + +COMMENT ON COLUMN S_DF03.C_ACC_CRED IS 'Счет по кредиту'; + +COMMENT ON COLUMN S_DF03.RBANKNAM1 IS 'Наименование банка-получателя 1'; + +COMMENT ON COLUMN S_DF03.RBANKNAM2 IS 'Наименование банка-получателя 2'; + +COMMENT ON COLUMN S_DF03.RBANKNAM3 IS 'Наименование банка-получателя 3'; + +COMMENT ON COLUMN S_DF03.RBANKNAM4 IS 'Наименование банка-получателя 4'; + +COMMENT ON COLUMN S_DF03.RBANKNAM5 IS 'Наименование банка-получателя 5'; + +COMMENT ON COLUMN S_DF03.PAY_DATE IS 'Платеж-дата'; + +COMMENT ON COLUMN S_DF03.PAY_VAL IS 'Валюта платежа'; + +COMMENT ON COLUMN S_DF03.SUM_DEB IS 'Сумма дебет'; + +COMMENT ON COLUMN S_DF03.SPECIF_1 IS 'Назначение платежа'; + +COMMENT ON COLUMN S_DF03.IMP_RESULT IS 'Результат приема'; + +COMMENT ON COLUMN S_DF03.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF03.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF03.GENERATION_ID IS 'Идентификатор взаимодействия'; + +COMMENT ON COLUMN S_DF03.PAYMENT_INSTRUCTION_ID IS 'Идентификатор соответствующей записи из таблицы-источника (linked to paymentInstruction)'; + +GRANT ALL PRIVILEGES ON TABLE S_DF03 TO clearing; + +-- sDf04 - ДФ-04 Подтверждение проведения расчетов +DROP TABLE IF EXISTS S_DF04; +CREATE TABLE S_DF04(ID bigint PRIMARY KEY, SEG_TYPE varchar(1), DOC_TYPE varchar(4), DOCNM_REF varchar(16), DOCNMPREV varchar(16), C_ACC_DEB varchar(35), SBANKNAM1 varchar(35), SBANKNAM2 varchar(35), SBANKNAM3 varchar(35), SBANKNAM4 varchar(35), SBANKNAM5 varchar(35), C_ACC_CRED varchar(35), RBANKNAM1 varchar(35), RBANKNAM2 varchar(35), RBANKNAM3 varchar(35), RBANKNAM4 varchar(35), RBANKNAM5 varchar(35), PAY_DATE varchar(8), PAY_VAL varchar(12), SUM_DEB varchar(22), SPECIF_1 varchar(255), IMP_RESULT varchar(3), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF04 IS 'ДФ-04 Подтверждение проведения расчетов'; + +COMMENT ON COLUMN S_DF04.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF04.SEG_TYPE IS 'Код инициатора в КС'; + +COMMENT ON COLUMN S_DF04.DOC_TYPE IS 'Тип документа'; + +COMMENT ON COLUMN S_DF04.DOCNM_REF IS 'Ссылочный номер документа у отправителя'; + +COMMENT ON COLUMN S_DF04.DOCNMPREV IS 'Ссылка на предшествующий документ'; + +COMMENT ON COLUMN S_DF04.C_ACC_DEB IS 'Счет по дебету'; + +COMMENT ON COLUMN S_DF04.SBANKNAM1 IS 'Наименование банка-плательщика 1'; + +COMMENT ON COLUMN S_DF04.SBANKNAM2 IS 'Наименование банка-плательщика 2'; + +COMMENT ON COLUMN S_DF04.SBANKNAM3 IS 'Наименование банка-плательщика 3'; + +COMMENT ON COLUMN S_DF04.SBANKNAM4 IS 'Наименование банка-плательщика 4'; + +COMMENT ON COLUMN S_DF04.SBANKNAM5 IS 'Наименование банка-плательщика 5'; + +COMMENT ON COLUMN S_DF04.C_ACC_CRED IS 'Счет по кредиту'; + +COMMENT ON COLUMN S_DF04.RBANKNAM1 IS 'Наименование банка-получателя 1'; + +COMMENT ON COLUMN S_DF04.RBANKNAM2 IS 'Наименование банка-получателя 2'; + +COMMENT ON COLUMN S_DF04.RBANKNAM3 IS 'Наименование банка-получателя 3'; + +COMMENT ON COLUMN S_DF04.RBANKNAM4 IS 'Наименование банка-получателя 4'; + +COMMENT ON COLUMN S_DF04.RBANKNAM5 IS 'Наименование банка-получателя 5'; + +COMMENT ON COLUMN S_DF04.PAY_DATE IS 'Платеж-дата'; + +COMMENT ON COLUMN S_DF04.PAY_VAL IS 'Валюта платежа'; + +COMMENT ON COLUMN S_DF04.SUM_DEB IS 'Сумма дебет'; + +COMMENT ON COLUMN S_DF04.SPECIF_1 IS 'Назначение платежа'; + +COMMENT ON COLUMN S_DF04.IMP_RESULT IS 'Результат приема'; + +COMMENT ON COLUMN S_DF04.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF04.GENERATION_TIME IS 'Дата и время обработки файла'; + +COMMENT ON COLUMN S_DF04.GENERATION_ID IS 'Идентификатор взаимодействия'; + +GRANT ALL PRIVILEGES ON TABLE S_DF04 TO clearing; + +-- sDf05 - ДФ-05 Уведомление о завершении расчетов +DROP TABLE IF EXISTS S_DF05; +CREATE TABLE S_DF05(ID bigint PRIMARY KEY, TP numeric(72,18), DT date, TM varchar(255), PR varchar(1), GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF05 IS 'ДФ-05 Уведомление о завершении расчетов'; + +COMMENT ON COLUMN S_DF05.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF05.TP IS 'Тип документа'; + +COMMENT ON COLUMN S_DF05.DT IS 'Дата завершения расчетов'; + +COMMENT ON COLUMN S_DF05.TM IS 'Время завершения расчетов'; + +COMMENT ON COLUMN S_DF05.PR IS 'Результат обработки запроса'; + +COMMENT ON COLUMN S_DF05.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF05.GENERATION_ID IS 'Идентификатор взаимодействия'; + +GRANT ALL PRIVILEGES ON TABLE S_DF05 TO clearing; + +-- sDf06 - ДФ-06 Запрос на зачисление/списание денежных средств +DROP TABLE IF EXISTS S_DF06; +CREATE TABLE S_DF06(ID bigint PRIMARY KEY, ACCOUNT varchar(20), SUM numeric(72,18), MARKET varchar(1), TYPE varchar(255), DEAL varchar(10), CLIENT_N varchar(255), INN varchar(255), BIC varchar(255), SPEC varchar(255), NUMBER numeric(72,18), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint, DOC_NUM varchar(3), DOC_DATE varchar(8), PAY_VAL varchar(12)); +COMMENT ON TABLE S_DF06 IS 'ДФ-06 Запрос на зачисление/списание денежных средств'; + +COMMENT ON COLUMN S_DF06.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF06.ACCOUNT IS 'Номер счета участника торгов'; + +COMMENT ON COLUMN S_DF06.SUM IS 'Сумма платежного документа (операции)'; + +COMMENT ON COLUMN S_DF06.MARKET IS 'Код сегмента рынка'; + +COMMENT ON COLUMN S_DF06.TYPE IS 'Код типа платежного документа (операции)'; + +COMMENT ON COLUMN S_DF06.DEAL IS 'Биржевой код участника клиринга'; + +COMMENT ON COLUMN S_DF06.CLIENT_N IS 'Наименование клиента - плательщика'; + +COMMENT ON COLUMN S_DF06.INN IS 'Идентификационный номер налогоплательщика'; + +COMMENT ON COLUMN S_DF06.BIC IS 'Банковский идентификационный код'; + +COMMENT ON COLUMN S_DF06.SPEC IS 'Назначение'; + +COMMENT ON COLUMN S_DF06.NUMBER IS 'Номер платежного документа (операции)'; + +COMMENT ON COLUMN S_DF06.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF06.GENERATION_TIME IS 'Дата и время обработки файла'; + +COMMENT ON COLUMN S_DF06.GENERATION_ID IS 'Идентификатор взаимодействия'; + +COMMENT ON COLUMN S_DF06.DOC_NUM IS 'Номер выгружаемого документа'; + +COMMENT ON COLUMN S_DF06.DOC_DATE IS 'Дата выгружаемого документа'; + +COMMENT ON COLUMN S_DF06.PAY_VAL IS 'Валюта документа'; + +GRANT ALL PRIVILEGES ON TABLE S_DF06 TO clearing; + +-- sDf07 - ДФ-07 Ответ на запрос по зачислению/списанию денежных средств +DROP TABLE IF EXISTS S_DF07; +CREATE TABLE S_DF07(ID bigint PRIMARY KEY, ACCOUNT varchar(20), SUM numeric(72,18), MARKET varchar(1), TYPE varchar(255), DEAL varchar(10), CLIENT_N varchar(255), INN varchar(255), BIC varchar(255), SPEC varchar(255), NUMBER numeric(72,18), RESULT numeric(72,18), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint, IN_S_DF_ID bigint, DOC_NUM varchar(3), DOC_DATE varchar(8), PAY_VAL varchar(12)); +COMMENT ON TABLE S_DF07 IS 'ДФ-07 Ответ на запрос по зачислению/списанию денежных средств'; + +COMMENT ON COLUMN S_DF07.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF07.ACCOUNT IS 'Номер счета участника торгов'; + +COMMENT ON COLUMN S_DF07.SUM IS 'Сумма платежного документа (операции)'; + +COMMENT ON COLUMN S_DF07.MARKET IS 'Код сегмента рынка'; + +COMMENT ON COLUMN S_DF07.TYPE IS 'Код типа платежного документа (операции)'; + +COMMENT ON COLUMN S_DF07.DEAL IS 'Биржевой код участника клиринга'; + +COMMENT ON COLUMN S_DF07.CLIENT_N IS 'Наименование клиента - плательщика'; + +COMMENT ON COLUMN S_DF07.INN IS 'Идентификационный номер налогоплательщика'; + +COMMENT ON COLUMN S_DF07.BIC IS 'Банковский идентификационный код'; + +COMMENT ON COLUMN S_DF07.SPEC IS 'Назначение'; + +COMMENT ON COLUMN S_DF07.NUMBER IS 'Номер платежного документа (операции)'; + +COMMENT ON COLUMN S_DF07.RESULT IS 'Код завершения операции'; + +COMMENT ON COLUMN S_DF07.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF07.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF07.GENERATION_ID IS 'Идентификатор взаимодействия'; + +COMMENT ON COLUMN S_DF07.IN_S_DF_ID IS 'Идентификатор соответствующей записи из таблицы-источника'; + +COMMENT ON COLUMN S_DF07.DOC_NUM IS 'Номер выгружаемого документа'; + +COMMENT ON COLUMN S_DF07.DOC_DATE IS 'Дата выгружаемого документа'; + +COMMENT ON COLUMN S_DF07.PAY_VAL IS 'Валюта документа'; + +GRANT ALL PRIVILEGES ON TABLE S_DF07 TO clearing; + +-- sDf08 - ДФ-08 Загрузка счетов с остатками +DROP TABLE IF EXISTS S_DF08; +CREATE TABLE S_DF08(ID bigint PRIMARY KEY, OUT_DOCUMENT varchar, DEPO_CODE varchar, QUANTITY varchar, SECURITY_CODE varchar, CLIENT_NAME varchar, FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF08 IS 'ДФ-08 Загрузка счетов с остатками'; + +COMMENT ON COLUMN S_DF08.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF08.OUT_DOCUMENT IS 'Уникальный исходящий номер сообщения'; + +COMMENT ON COLUMN S_DF08.DEPO_CODE IS 'Код раздела субсчета/счета депо'; + +COMMENT ON COLUMN S_DF08.QUANTITY IS 'Количество'; + +COMMENT ON COLUMN S_DF08.SECURITY_CODE IS 'Код ценной бумаги'; + +COMMENT ON COLUMN S_DF08.CLIENT_NAME IS 'Наименование клиента'; + +COMMENT ON COLUMN S_DF08.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF08.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF08.GENERATION_ID IS 'Идентификатор взаимодействия'; + +GRANT ALL PRIVILEGES ON TABLE S_DF08 TO clearing; + +-- sDf09 - ДФ-09 Ответ на загрузку счетов с остатками +DROP TABLE IF EXISTS S_DF09; +CREATE TABLE S_DF09(ID bigint PRIMARY KEY, OUT_DOCUMENT varchar, IN_DOCUMENT varchar, DEPO_CODE varchar, QUANTITY varchar, SECURITY_CODE varchar, CLIENT_NAME varchar, RESULT varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF09 IS 'ДФ-09 Ответ на загрузку счетов с остатками'; + +COMMENT ON COLUMN S_DF09.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF09.OUT_DOCUMENT IS 'Уникальный исходящий номер сообщения'; + +COMMENT ON COLUMN S_DF09.IN_DOCUMENT IS 'Исходящий номер входящего сообщения'; + +COMMENT ON COLUMN S_DF09.DEPO_CODE IS 'Код раздела субсчета/счета депо'; + +COMMENT ON COLUMN S_DF09.QUANTITY IS 'Количество'; + +COMMENT ON COLUMN S_DF09.SECURITY_CODE IS 'Код ценной бумаги'; + +COMMENT ON COLUMN S_DF09.CLIENT_NAME IS 'Наименование клиента'; + +COMMENT ON COLUMN S_DF09.RESULT IS 'Результат операции'; + +COMMENT ON COLUMN S_DF09.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF09.GENERATION_ID IS 'Идентификатор взаимодействия'; + +GRANT ALL PRIVILEGES ON TABLE S_DF09 TO clearing; + +-- sDf10 - ДФ-10 Запрос на зачисление/списание ценных бумаг +DROP TABLE IF EXISTS S_DF10; +CREATE TABLE S_DF10(ID bigint PRIMARY KEY, OUT_DOCUMENT varchar, DEPO_CODE varchar, QUANTITY varchar, SECURITY_CODE varchar, CLIENT_NAME varchar, FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF10 IS 'ДФ-10 Запрос на зачисление/списание ценных бумаг'; + +COMMENT ON COLUMN S_DF10.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF10.OUT_DOCUMENT IS 'Уникальный исходящий номер сообщения'; + +COMMENT ON COLUMN S_DF10.DEPO_CODE IS 'Код раздела субсчета/счета депо'; + +COMMENT ON COLUMN S_DF10.QUANTITY IS 'Количество'; + +COMMENT ON COLUMN S_DF10.SECURITY_CODE IS 'Код ценной бумаги'; + +COMMENT ON COLUMN S_DF10.CLIENT_NAME IS 'Наименование клиента'; + +COMMENT ON COLUMN S_DF10.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF10.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF10.GENERATION_ID IS 'Идентификатор взаимодействия'; + +GRANT ALL PRIVILEGES ON TABLE S_DF10 TO clearing; + +-- sDf11 - ДФ-11 Ответ на Запрос на зачисление/списание ценных бумаг +DROP TABLE IF EXISTS S_DF11; +CREATE TABLE S_DF11(ID bigint PRIMARY KEY, OUT_DOCUMENT varchar, IN_DOCUMENT varchar, DEPO_CODE varchar, QUANTITY varchar, SECURITY_CODE varchar, CLIENT_NAME varchar, RESULT varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF11 IS 'ДФ-11 Ответ на Запрос на зачисление/списание ценных бумаг'; + +COMMENT ON COLUMN S_DF11.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF11.OUT_DOCUMENT IS 'Уникальный исходящий номер сообщения'; + +COMMENT ON COLUMN S_DF11.IN_DOCUMENT IS 'Исходящий номер входящего сообщения'; + +COMMENT ON COLUMN S_DF11.DEPO_CODE IS 'Код раздела субсчета/счета депо'; + +COMMENT ON COLUMN S_DF11.QUANTITY IS 'Количество'; + +COMMENT ON COLUMN S_DF11.SECURITY_CODE IS 'Код ценной бумаги'; + +COMMENT ON COLUMN S_DF11.CLIENT_NAME IS 'Наименование клиента'; + +COMMENT ON COLUMN S_DF11.RESULT IS 'Результат операции'; + +COMMENT ON COLUMN S_DF11.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF11.GENERATION_ID IS 'Идентификатор взаимодействия'; + +GRANT ALL PRIVILEGES ON TABLE S_DF11 TO clearing; + +-- sDf12 - ДФ-12 Распоряжение на проведение операций по итогам клиринга +DROP TABLE IF EXISTS S_DF12; +CREATE TABLE S_DF12(ID bigint PRIMARY KEY, OUT_DOCUMENT varchar, DIRECTION varchar(255), QUANTITY varchar, SECURITY_CODE varchar, DEPO_CODE_SENDER varchar, DEPO_CODE_ADRESSEE varchar, TRANSACTION_NUMBER varchar(255), TRANSACTION_QUANTITY varchar(255), RESULT varchar(255), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF12 IS 'ДФ-12 Распоряжение на проведение операций по итогам клиринга'; + +COMMENT ON COLUMN S_DF12.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF12.OUT_DOCUMENT IS 'Уникальный исходящий номер сообщения'; + +COMMENT ON COLUMN S_DF12.DIRECTION IS 'Направление (списание/зачисление)'; + +COMMENT ON COLUMN S_DF12.QUANTITY IS 'Количество ценных бумаг'; + +COMMENT ON COLUMN S_DF12.SECURITY_CODE IS 'Код ценной бумаги'; + +COMMENT ON COLUMN S_DF12.DEPO_CODE_SENDER IS 'Депо счет списания'; + +COMMENT ON COLUMN S_DF12.DEPO_CODE_ADRESSEE IS 'Депо счет зачисления'; + +COMMENT ON COLUMN S_DF12.TRANSACTION_NUMBER IS 'Порядковый номер транзакции'; + +COMMENT ON COLUMN S_DF12.TRANSACTION_QUANTITY IS 'Количество транзакций'; + +COMMENT ON COLUMN S_DF12.RESULT IS 'Результат операции'; + +COMMENT ON COLUMN S_DF12.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF12.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF12.GENERATION_ID IS 'Идентификатор взаимодействия'; + +GRANT ALL PRIVILEGES ON TABLE S_DF12 TO clearing; + +-- sDf13 - ДФ-13 Уведомление о статусе исполнения или мотивированный отказ +DROP TABLE IF EXISTS S_DF13; +CREATE TABLE S_DF13(ID bigint PRIMARY KEY, OUT_DOCUMENT varchar, IN_DOCUMENT varchar, RESULT varchar(255), TEXT_ERROR varchar, FILE_NAME varchar, GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF13 IS 'ДФ-13 Уведомление о статусе исполнения или мотивированный отказ'; + +COMMENT ON COLUMN S_DF13.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF13.OUT_DOCUMENT IS 'Уникальный исходящий номер сообщения'; + +COMMENT ON COLUMN S_DF13.IN_DOCUMENT IS 'Исходящий номер входящего сообщения'; + +COMMENT ON COLUMN S_DF13.RESULT IS 'Результат операции'; + +COMMENT ON COLUMN S_DF13.TEXT_ERROR IS 'Описание ошибки'; + +COMMENT ON COLUMN S_DF13.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF13.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF13.GENERATION_ID IS 'Идентификатор взаимодействия'; + +GRANT ALL PRIVILEGES ON TABLE S_DF13 TO clearing; + +-- sDf14 - ДФ-14 Уведомление о завершении расчетов +DROP TABLE IF EXISTS S_DF14; +CREATE TABLE S_DF14(ID bigint PRIMARY KEY, OUT_DOCUMENT varchar, RESULT varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF14 IS 'ДФ-14 Уведомление о завершении расчетов'; + +COMMENT ON COLUMN S_DF14.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF14.OUT_DOCUMENT IS 'Уникальный исходящий номер сообщения'; + +COMMENT ON COLUMN S_DF14.RESULT IS 'Результат операции'; + +COMMENT ON COLUMN S_DF14.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF14.GENERATION_ID IS 'Идентификатор взаимодействия'; + +GRANT ALL PRIVILEGES ON TABLE S_DF14 TO clearing; + +-- sDf20 - ДФ-20 Отчет об исполнении поручения на зачисление/списание ценных бумаг +DROP TABLE IF EXISTS S_DF20; +CREATE TABLE S_DF20(ID bigint PRIMARY KEY, OUT_DOCUMENT varchar, IN_DOCUMENT varchar, SECURITY varchar, SECURITY_NAME varchar, SECURITY_TYPE varchar, OPEN_BALANCE varchar, DEPO_CODE_CL varchar, NAME_CL varchar, QUANTITY varchar, OPERATION_CODE varchar, DEPO_CODE_CORR varchar, OPERATION_DATE varchar, CLOSE_BALANCE varchar, TRANSACTION_NUMBER varchar(255), FILE_NAME varchar, GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF20 IS 'ДФ-20 Отчет об исполнении поручения на зачисление/списание ценных бумаг'; + +COMMENT ON COLUMN S_DF20.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF20.OUT_DOCUMENT IS 'Уникальный исходящий номер сообщения'; + +COMMENT ON COLUMN S_DF20.IN_DOCUMENT IS 'Исходящий номер входящего сообщения'; + +COMMENT ON COLUMN S_DF20.SECURITY IS 'Ценная бумага'; + +COMMENT ON COLUMN S_DF20.SECURITY_NAME IS 'Наименование ценной бумаги'; + +COMMENT ON COLUMN S_DF20.SECURITY_TYPE IS 'Тип ценной бумаги'; + +COMMENT ON COLUMN S_DF20.OPEN_BALANCE IS 'Входящий остаток'; + +COMMENT ON COLUMN S_DF20.DEPO_CODE_CL IS 'Код раздела тех.счета/счета депо/ и наименование клиента'; + +COMMENT ON COLUMN S_DF20.NAME_CL IS 'Наименование клиента'; + +COMMENT ON COLUMN S_DF20.QUANTITY IS 'Количество ценных бумаг'; + +COMMENT ON COLUMN S_DF20.OPERATION_CODE IS 'Код операции'; + +COMMENT ON COLUMN S_DF20.DEPO_CODE_CORR IS 'Код раздела субсчета/счета депо корреспондента'; + +COMMENT ON COLUMN S_DF20.OPERATION_DATE IS 'Дата операции'; + +COMMENT ON COLUMN S_DF20.CLOSE_BALANCE IS 'Исходящий остаток'; + +COMMENT ON COLUMN S_DF20.TRANSACTION_NUMBER IS 'ID транзакции депозитария'; + +COMMENT ON COLUMN S_DF20.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF20.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF20.GENERATION_ID IS 'Идентификатор взаимодействия'; + +GRANT ALL PRIVILEGES ON TABLE S_DF20 TO clearing; + +-- sDf21 - ДФ-21 Отчет об операциях +DROP TABLE IF EXISTS S_DF21; +CREATE TABLE S_DF21(ID bigint PRIMARY KEY, OUT_DOCUMENT varchar, IN_DOCUMENT varchar, SECURITY_CODE varchar, SECURITY_NAME varchar, SECURITY_TYPE varchar, OPEN_BALANCE varchar, DEPO_CODE_CL varchar, NAME_CL varchar, QUANTITY varchar, OPERATION_CODE varchar, DEPO_CODE_CORR varchar, OPERATION_DATE varchar, CLOSE_BALANCE varchar, COMMENT varchar(250), TRANSACTION_NUMBER varchar(255), FILE_NAME varchar, GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF21 IS 'ДФ-21 Отчет об операциях'; + +COMMENT ON COLUMN S_DF21.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF21.OUT_DOCUMENT IS 'Уникальный исходящий номер сообщения'; + +COMMENT ON COLUMN S_DF21.IN_DOCUMENT IS 'Исходящий номер входящего сообщения'; + +COMMENT ON COLUMN S_DF21.SECURITY_CODE IS 'Код ценной бумаги'; + +COMMENT ON COLUMN S_DF21.SECURITY_NAME IS 'Наименование ценной бумаги'; + +COMMENT ON COLUMN S_DF21.SECURITY_TYPE IS 'Тип ценной бумаги'; + +COMMENT ON COLUMN S_DF21.OPEN_BALANCE IS 'Входящий остаток'; + +COMMENT ON COLUMN S_DF21.DEPO_CODE_CL IS 'Код раздела тех.счета/счета депо'; + +COMMENT ON COLUMN S_DF21.NAME_CL IS 'Наименование клиента'; + +COMMENT ON COLUMN S_DF21.QUANTITY IS 'Количество ценных бумаг'; + +COMMENT ON COLUMN S_DF21.OPERATION_CODE IS 'Код операции'; + +COMMENT ON COLUMN S_DF21.DEPO_CODE_CORR IS 'Код раздела субсчета/счета депо корреспондента'; + +COMMENT ON COLUMN S_DF21.OPERATION_DATE IS 'Дата операции'; + +COMMENT ON COLUMN S_DF21.CLOSE_BALANCE IS 'Исходящий остаток'; + +COMMENT ON COLUMN S_DF21.COMMENT IS 'Основание проведения операции'; + +COMMENT ON COLUMN S_DF21.TRANSACTION_NUMBER IS 'ID транзакции депозитария'; + +COMMENT ON COLUMN S_DF21.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF21.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF21.GENERATION_ID IS 'Идентификатор взаимодействия'; + +GRANT ALL PRIVILEGES ON TABLE S_DF21 TO clearing; + +-- sDf51 - ДФ-51 Запрос остатков по всем счетам +DROP TABLE IF EXISTS S_DF51; +CREATE TABLE S_DF51(ID bigint PRIMARY KEY, NUMBER varchar(10), DATETIME varchar(13), GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF51 IS 'ДФ-51 Запрос остатков по всем счетам'; + +COMMENT ON COLUMN S_DF51.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF51.NUMBER IS 'Номер запроса остатков по счетам'; + +COMMENT ON COLUMN S_DF51.DATETIME IS 'Дата и время сообщения'; + +COMMENT ON COLUMN S_DF51.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF51.GENERATION_ID IS 'Идентификатор взаимодействия'; + +GRANT ALL PRIVILEGES ON TABLE S_DF51 TO clearing; + +-- sDf52 - ДФ-52 Информация о состоянии счета (блокировка/разблокировка/закрытие/открытие) +DROP TABLE IF EXISTS S_DF52; +CREATE TABLE S_DF52(ID bigint PRIMARY KEY, ACCOUNT varchar(25), ACC_NAME varchar(30), ACC_TYPE varchar(3), DEAL varchar(4), DATE varchar(8), STATUS bigint, FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF52 IS 'ДФ-52 Информация о состоянии счета (блокировка/разблокировка/закрытие/открытие)'; + +COMMENT ON COLUMN S_DF52.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF52.ACCOUNT IS 'Код счета участника клиринга'; + +COMMENT ON COLUMN S_DF52.ACC_NAME IS 'Наименование участника клиринга'; + +COMMENT ON COLUMN S_DF52.ACC_TYPE IS 'Признак счета'; + +COMMENT ON COLUMN S_DF52.DEAL IS 'Биржевой код участника клиринга'; + +COMMENT ON COLUMN S_DF52.DATE IS 'Дата изменения состояния счета'; + +COMMENT ON COLUMN S_DF52.STATUS IS 'Статус счета'; + +COMMENT ON COLUMN S_DF52.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF52.GENERATION_TIME IS 'Дата и время обработки файла'; + +COMMENT ON COLUMN S_DF52.GENERATION_ID IS 'Идентификатор взаимодействия'; + +GRANT ALL PRIVILEGES ON TABLE S_DF52 TO clearing; + +-- sDf53 - ДФ-53 Квитанция о получении информации о состоянии счета (блокировка/разблокировка/закрытие/открытие) +DROP TABLE IF EXISTS S_DF53; +CREATE TABLE S_DF53(ID bigint PRIMARY KEY, ACC_NAME varchar(30), ACCOUNT varchar(25), DEAL varchar(4), DATE varchar(8), STATUS bigint, RESULT varchar(255), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint, IN_S_DF_ID bigint, ACC_TYPE varchar(3)); +COMMENT ON TABLE S_DF53 IS 'ДФ-53 Квитанция о получении информации о состоянии счета (блокировка/разблокировка/закрытие/открытие)'; + +COMMENT ON COLUMN S_DF53.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF53.ACC_NAME IS 'Наименование участника клиринга'; + +COMMENT ON COLUMN S_DF53.ACCOUNT IS 'Код счета участника клиринга'; + +COMMENT ON COLUMN S_DF53.DEAL IS 'Биржевой код участника клиринга'; + +COMMENT ON COLUMN S_DF53.DATE IS 'Дата изменения состояния счета'; + +COMMENT ON COLUMN S_DF53.STATUS IS 'Статус счета'; + +COMMENT ON COLUMN S_DF53.RESULT IS 'Код завершения операции'; + +COMMENT ON COLUMN S_DF53.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF53.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF53.GENERATION_ID IS 'Идентификатор взаимодействия'; + +COMMENT ON COLUMN S_DF53.IN_S_DF_ID IS 'Идентификатор соответствующей записи из таблицы-источника'; + +COMMENT ON COLUMN S_DF53.ACC_TYPE IS 'Признак счета'; + +GRANT ALL PRIVILEGES ON TABLE S_DF53 TO clearing; + +-- sDf54 - ДФ-54 Вывод свободных средств для инициаторов категории В с клирингового счета 30414 +DROP TABLE IF EXISTS S_DF54; +CREATE TABLE S_DF54(ID bigint PRIMARY KEY, SEG_TYPE varchar(1), DOC_TYPE varchar(4), DOCNM_REF varchar(16), DOCNMPREV varchar(16), 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), RBANKNAM2 varchar(35), RBANKNAM3 varchar(35), RBANKNAM4 varchar(35), RBANKNAM5 varchar(35), OP_TYPE varchar(2), OP_ORDER varchar(1), PAY_DATE varchar(8), PAY_VAL varchar(12), SUM_DEB varchar(22), SCLIENTN1 varchar(35), SCLIENTN2 varchar(35), SCLIENTN3 varchar(35), SCLIENTN4 varchar(35), INN_DEB varchar(12), KPP_DEB varchar(9), ACC_DEB varchar(35), RCLIENTN1 varchar(35), RCLIENTN2 varchar(35), RCLIENTN3 varchar(35), RCLIENTN4 varchar(35), INN_CRED varchar(12), KPP_CRED varchar(9), ACC_KR_1 varchar(35), SPECIF_1 varchar(255), SEND_TYPE varchar(10), DOC_RESULT varchar(2), GENERATION_TIME timestamp, GENERATION_ID bigint, DOC_NUM varchar(3), DOC_DATE varchar(8), VALUE_DATE varchar(8), SWIFT_BEN varchar(11), SWIFT_INT varchar(11)); +COMMENT ON TABLE S_DF54 IS 'ДФ-54 Вывод свободных средств для инициаторов категории В с клирингового счета 30414'; + +COMMENT ON COLUMN S_DF54.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF54.SEG_TYPE IS 'Код инициатора в КС'; + +COMMENT ON COLUMN S_DF54.DOC_TYPE IS 'Тип документа'; + +COMMENT ON COLUMN S_DF54.DOCNM_REF IS 'Ссылочный номер документа у отправителя'; + +COMMENT ON COLUMN S_DF54.DOCNMPREV IS 'Ссылка на предшествующий документ'; + +COMMENT ON COLUMN S_DF54.SBANKCODE IS 'Код банка-плательщика'; + +COMMENT ON COLUMN S_DF54.C_ACC_DEB IS 'Кор счет банка-плательщика в системе - акт.'; + +COMMENT ON COLUMN S_DF54.SBANKNAM1 IS 'Наименование банка-плательщика 1'; + +COMMENT ON COLUMN S_DF54.SBANKNAM2 IS 'Наименование банка-плательщика 2'; + +COMMENT ON COLUMN S_DF54.SBANKNAM3 IS 'Наименование банка-плательщика 3'; + +COMMENT ON COLUMN S_DF54.SBANKNAM4 IS 'Наименование банка-плательщика 4'; + +COMMENT ON COLUMN S_DF54.SBANKNAM5 IS 'Наименование банка-плательщика 5'; + +COMMENT ON COLUMN S_DF54.RBANKCODE IS 'Код банка-получателя'; + +COMMENT ON COLUMN S_DF54.C_ACC_CRED IS 'Кор счет банка-получателя в системе - акт. '; + +COMMENT ON COLUMN S_DF54.RBANKNAM1 IS 'Наименование банка-получателя 1'; + +COMMENT ON COLUMN S_DF54.RBANKNAM2 IS 'Наименование банка-получателя 2'; + +COMMENT ON COLUMN S_DF54.RBANKNAM3 IS 'Наименование банка-получателя 3'; + +COMMENT ON COLUMN S_DF54.RBANKNAM4 IS 'Наименование банка-получателя 4'; + +COMMENT ON COLUMN S_DF54.RBANKNAM5 IS 'Наименование банка-получателя 5'; + +COMMENT ON COLUMN S_DF54.OP_TYPE IS 'Вид операции'; + +COMMENT ON COLUMN S_DF54.OP_ORDER IS 'Очередность платежа'; + +COMMENT ON COLUMN S_DF54.PAY_DATE IS 'Платеж-дата'; + +COMMENT ON COLUMN S_DF54.PAY_VAL IS 'Валюта платежа'; + +COMMENT ON COLUMN S_DF54.SUM_DEB IS 'Сумма дебет'; + +COMMENT ON COLUMN S_DF54.SCLIENTN1 IS 'Наименование клиента-плательщика 1'; + +COMMENT ON COLUMN S_DF54.SCLIENTN2 IS 'Наименование клиента-плательщика 2'; + +COMMENT ON COLUMN S_DF54.SCLIENTN3 IS 'Наименование клиента-плательщика 3'; + +COMMENT ON COLUMN S_DF54.SCLIENTN4 IS 'Наименование клиента-плательщика 4'; + +COMMENT ON COLUMN S_DF54.INN_DEB IS 'ИНН клиента-плательщика'; + +COMMENT ON COLUMN S_DF54.KPP_DEB IS 'КПП клиента-плательщика'; + +COMMENT ON COLUMN S_DF54.ACC_DEB IS 'Счет клиента-плательщика(дебет)'; + +COMMENT ON COLUMN S_DF54.RCLIENTN1 IS 'Наименование клиента-получателя 1'; + +COMMENT ON COLUMN S_DF54.RCLIENTN2 IS 'Наименование клиента-получателя 2'; + +COMMENT ON COLUMN S_DF54.RCLIENTN3 IS 'Наименование клиента-получателя 3'; + +COMMENT ON COLUMN S_DF54.RCLIENTN4 IS 'Наименование клиента-получателя 4'; + +COMMENT ON COLUMN S_DF54.INN_CRED IS 'ИНН клиента-получателя'; + +COMMENT ON COLUMN S_DF54.KPP_CRED IS 'КПП клиента-получателя'; + +COMMENT ON COLUMN S_DF54.ACC_KR_1 IS 'Счет получателя'; + +COMMENT ON COLUMN S_DF54.SPECIF_1 IS 'Назначение платежа'; + +COMMENT ON COLUMN S_DF54.SEND_TYPE IS 'Вид платежа'; + +COMMENT ON COLUMN S_DF54.DOC_RESULT IS 'Результат операции'; + +COMMENT ON COLUMN S_DF54.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF54.GENERATION_ID IS 'Идентификатор взаимодействия'; + +COMMENT ON COLUMN S_DF54.DOC_NUM IS 'Номер выгружаемого документа'; + +COMMENT ON COLUMN S_DF54.DOC_DATE IS 'Дата выгружаемого документа'; + +COMMENT ON COLUMN S_DF54.VALUE_DATE IS 'Дата валютирования'; + +COMMENT ON COLUMN S_DF54.SWIFT_BEN IS 'Свифт банка бенефициара'; + +COMMENT ON COLUMN S_DF54.SWIFT_INT IS 'Свифт банка посредника'; + +GRANT ALL PRIVILEGES ON TABLE S_DF54 TO clearing; + +-- sDf55 - ДФ-55 Квитанция об обработке ДФ-54 +DROP TABLE IF EXISTS S_DF55; +CREATE TABLE S_DF55(ID bigint PRIMARY KEY, SEG_TYPE varchar(1), DOC_TYPE varchar(4), DOCNM_REF varchar(16), DOCNMPREV varchar(16), 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), RBANKNAM2 varchar(35), RBANKNAM3 varchar(35), RBANKNAM4 varchar(35), RBANKNAM5 varchar(35), OP_TYPE varchar(2), OP_ORDER varchar(1), PAY_DATE varchar(8), PAY_VAL varchar(12), SUM_DEB varchar(22), SCLIENTN1 varchar(35), SCLIENTN2 varchar(35), SCLIENTN3 varchar(35), SCLIENTN4 varchar(35), INN_DEB varchar(12), KPP_DEB varchar(9), ACC_DEB varchar(35), RCLIENTN1 varchar(35), RCLIENTN2 varchar(35), RCLIENTN3 varchar(35), RCLIENTN4 varchar(35), INN_CRED varchar(12), KPP_CRED varchar(9), ACC_KR_1 varchar(35), SPECIF_1 varchar(255), SEND_TYPE varchar(10), DOC_RESULT varchar(2), FILE_NAME varchar(255), GENERATION_TIME timestamp, GENERATION_ID bigint, DOC_NUM varchar(3), DOC_DATE varchar(8), VALUE_DATE varchar(8), SWIFT_BEN varchar(11), SWIFT_INT varchar(11)); +COMMENT ON TABLE S_DF55 IS 'ДФ-55 Квитанция об обработке ДФ-54'; + +COMMENT ON COLUMN S_DF55.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF55.SEG_TYPE IS 'Код инициатора в КС'; + +COMMENT ON COLUMN S_DF55.DOC_TYPE IS 'Тип документа'; + +COMMENT ON COLUMN S_DF55.DOCNM_REF IS 'Ссылочный номер документа у отправителя'; + +COMMENT ON COLUMN S_DF55.DOCNMPREV IS 'Ссылка на предшествующий документ'; + +COMMENT ON COLUMN S_DF55.SBANKCODE IS 'Код банка-плательщика'; + +COMMENT ON COLUMN S_DF55.C_ACC_DEB IS 'Кор счет банка-плательщика в системе - акт.'; + +COMMENT ON COLUMN S_DF55.SBANKNAM1 IS 'Наименование банка-плательщика 1'; + +COMMENT ON COLUMN S_DF55.SBANKNAM2 IS 'Наименование банка-плательщика 2'; + +COMMENT ON COLUMN S_DF55.SBANKNAM3 IS 'Наименование банка-плательщика 3'; + +COMMENT ON COLUMN S_DF55.SBANKNAM4 IS 'Наименование банка-плательщика 4'; + +COMMENT ON COLUMN S_DF55.SBANKNAM5 IS 'Наименование банка-плательщика 5'; + +COMMENT ON COLUMN S_DF55.RBANKCODE IS 'Код банка-получателя'; + +COMMENT ON COLUMN S_DF55.C_ACC_CRED IS 'Кор счет банка-получателя в системе - акт. '; + +COMMENT ON COLUMN S_DF55.RBANKNAM1 IS 'Наименование банка-получателя 1'; + +COMMENT ON COLUMN S_DF55.RBANKNAM2 IS 'Наименование банка-получателя 2'; + +COMMENT ON COLUMN S_DF55.RBANKNAM3 IS 'Наименование банка-получателя 3'; + +COMMENT ON COLUMN S_DF55.RBANKNAM4 IS 'Наименование банка-получателя 4'; + +COMMENT ON COLUMN S_DF55.RBANKNAM5 IS 'Наименование банка-получателя 5'; + +COMMENT ON COLUMN S_DF55.OP_TYPE IS 'Вид операции'; + +COMMENT ON COLUMN S_DF55.OP_ORDER IS 'Очередность платежа'; + +COMMENT ON COLUMN S_DF55.PAY_DATE IS 'Платеж-дата'; + +COMMENT ON COLUMN S_DF55.PAY_VAL IS 'Валюта платежа'; + +COMMENT ON COLUMN S_DF55.SUM_DEB IS 'Сумма дебет'; + +COMMENT ON COLUMN S_DF55.SCLIENTN1 IS 'Наименование клиента-плательщика 1'; + +COMMENT ON COLUMN S_DF55.SCLIENTN2 IS 'Наименование клиента-плательщика 2'; + +COMMENT ON COLUMN S_DF55.SCLIENTN3 IS 'Наименование клиента-плательщика 3'; + +COMMENT ON COLUMN S_DF55.SCLIENTN4 IS 'Наименование клиента-плательщика 4'; + +COMMENT ON COLUMN S_DF55.INN_DEB IS 'ИНН клиента-плательщика'; + +COMMENT ON COLUMN S_DF55.KPP_DEB IS 'КПП клиента-плательщика'; + +COMMENT ON COLUMN S_DF55.ACC_DEB IS 'Счет клиента-плательщика(дебет)'; + +COMMENT ON COLUMN S_DF55.RCLIENTN1 IS 'Наименование клиента-получателя 1'; + +COMMENT ON COLUMN S_DF55.RCLIENTN2 IS 'Наименование клиента-получателя 2'; + +COMMENT ON COLUMN S_DF55.RCLIENTN3 IS 'Наименование клиента-получателя 3'; + +COMMENT ON COLUMN S_DF55.RCLIENTN4 IS 'Наименование клиента-получателя 4'; + +COMMENT ON COLUMN S_DF55.INN_CRED IS 'ИНН клиента-получателя'; + +COMMENT ON COLUMN S_DF55.KPP_CRED IS 'КПП клиента-получателя'; + +COMMENT ON COLUMN S_DF55.ACC_KR_1 IS 'Счет получателя'; + +COMMENT ON COLUMN S_DF55.SPECIF_1 IS 'Назначение платежа'; + +COMMENT ON COLUMN S_DF55.SEND_TYPE IS 'Вид платежа'; + +COMMENT ON COLUMN S_DF55.DOC_RESULT IS 'Результат операции'; + +COMMENT ON COLUMN S_DF55.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF55.GENERATION_TIME IS 'Дата и время обработки файла'; + +COMMENT ON COLUMN S_DF55.GENERATION_ID IS 'Идентификатор взаимодействия'; + +COMMENT ON COLUMN S_DF55.DOC_NUM IS 'Номер выгружаемого документа'; + +COMMENT ON COLUMN S_DF55.DOC_DATE IS 'Дата выгружаемого документа'; + +COMMENT ON COLUMN S_DF55.VALUE_DATE IS 'Дата валютирования'; + +COMMENT ON COLUMN S_DF55.SWIFT_BEN IS 'Свифт банка бенефициара'; + +COMMENT ON COLUMN S_DF55.SWIFT_INT IS 'Свифт банка посредника'; + +GRANT ALL PRIVILEGES ON TABLE S_DF55 TO clearing; + +-- sDf56 - ДФ-56 Запрос транзакций за период +DROP TABLE IF EXISTS S_DF56; +CREATE TABLE S_DF56(ID bigint PRIMARY KEY, NUMBER varchar(10), START_DATETIME varchar(13), END_DATETIME varchar(13), ACCOUNT varchar(25), DEAL varchar(4), GENERATION_TIME timestamp, GENERATION_ID bigint); +COMMENT ON TABLE S_DF56 IS 'ДФ-56 Запрос транзакций за период'; + +COMMENT ON COLUMN S_DF56.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF56.NUMBER IS 'Номер запроса'; + +COMMENT ON COLUMN S_DF56.START_DATETIME IS 'Дата и время для фильтрации транзакций с большим или равным указанным параметром'; + +COMMENT ON COLUMN S_DF56.END_DATETIME IS 'Дата и время для фильтрации транзакций с меньшим указанным параметром'; + +COMMENT ON COLUMN S_DF56.ACCOUNT IS 'Код счета участника клиринга для фильтрации транзакций по значению'; + +COMMENT ON COLUMN S_DF56.DEAL IS 'Биржевой код участника клиринга для фильтрации транзакций по значению'; + +COMMENT ON COLUMN S_DF56.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF56.GENERATION_ID IS 'Идентификатор взаимодействия'; + +GRANT ALL PRIVILEGES ON TABLE S_DF56 TO clearing; + +-- sDf57 - ДФ-57 Список транзакций о списании/зачислении за период по всем счетам (ТБС и КС) +DROP TABLE IF EXISTS S_DF57; +CREATE TABLE S_DF57(GENERATION_TIME timestamp, ID bigint PRIMARY KEY, DBF_ID bigint, DEAL_DEB varchar(4), DEAL_CRED varchar(4), 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(35), C_ACC_CRED varchar(35), RBANKNAM1 varchar(35), RBANKNAM2 varchar(35), RBANKNAM3 varchar(35), RBANKNAM4 varchar(35), RBANKNAM5 varchar(35), OP_TYPE varchar(2), PAY_DATE varchar(8), EXT_DATE varchar(255), PAY_VAL varchar(12), SUM_DEB varchar(22), SCLIENTN1 varchar(35), SCLIENTN2 varchar(35), SCLIENTN3 varchar(35), SCLIENTN4 varchar(35), INN_DEB varchar(12), KPP_DEB varchar(9), ACC_DEB varchar(35), RCLIENTN1 varchar(35), RCLIENTN2 varchar(35), RCLIENTN3 varchar(35), RCLIENTN4 varchar(35), INN_CRED varchar(12), KPP_CRED varchar(9), ACC_KR varchar(35), SPECIF varchar(255), FILE_NAME varchar(255), GENERATION_ID bigint, DOC_NUM varchar(3), DOC_DATE varchar(8), DT_IN varchar(22), KT_IN varchar(22), DT_OUT varchar(22), KT_OUT varchar(22)); +COMMENT ON TABLE S_DF57 IS 'ДФ-57 Список транзакций о списании/зачислении за период по всем счетам (ТБС и КС)'; + +COMMENT ON COLUMN S_DF57.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_DF57.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_DF57.DBF_ID IS 'Уникальный идентификатор платежного документа (транзакции)'; + +COMMENT ON COLUMN S_DF57.DEAL_DEB IS 'Биржевой код участника клиринга (плательщик)'; + +COMMENT ON COLUMN S_DF57.DEAL_CRED IS 'Биржевой код участника клиринга (получатель)'; + +COMMENT ON COLUMN S_DF57.SBANKCODE IS 'Код банка-плательщика'; + +COMMENT ON COLUMN S_DF57.C_ACC_DEB IS 'Кор счет банка-плательщика в системе - акт.'; + +COMMENT ON COLUMN S_DF57.SBANKNAM1 IS 'Наименование банка-плательщика 1'; + +COMMENT ON COLUMN S_DF57.SBANKNAM2 IS 'Наименование банка-плательщика 2'; + +COMMENT ON COLUMN S_DF57.SBANKNAM3 IS 'Наименование банка-плательщика 3'; + +COMMENT ON COLUMN S_DF57.SBANKNAM4 IS 'Наименование банка-плательщика 4'; + +COMMENT ON COLUMN S_DF57.SBANKNAM5 IS 'Наименование банка-плательщика 5'; + +COMMENT ON COLUMN S_DF57.RBANKCODE IS 'Код банка-получателя'; + +COMMENT ON COLUMN S_DF57.C_ACC_CRED IS 'Кор счет банка-получателя в системе - акт.'; + +COMMENT ON COLUMN S_DF57.RBANKNAM1 IS 'Наименование банка-получателя 1'; + +COMMENT ON COLUMN S_DF57.RBANKNAM2 IS 'Наименование банка-получателя 2'; + +COMMENT ON COLUMN S_DF57.RBANKNAM3 IS 'Наименование банка-получателя 3'; + +COMMENT ON COLUMN S_DF57.RBANKNAM4 IS 'Наименование банка-получателя 4'; + +COMMENT ON COLUMN S_DF57.RBANKNAM5 IS 'Наименование банка-получателя 5'; + +COMMENT ON COLUMN S_DF57.OP_TYPE IS 'Вид операции'; + +COMMENT ON COLUMN S_DF57.PAY_DATE IS 'Платеж-дата'; + +COMMENT ON COLUMN S_DF57.EXT_DATE IS 'Дата по выписке'; + +COMMENT ON COLUMN S_DF57.PAY_VAL IS 'Валюта платежа'; + +COMMENT ON COLUMN S_DF57.SUM_DEB IS 'Сумма дебет'; + +COMMENT ON COLUMN S_DF57.SCLIENTN1 IS 'Наименование клиента-плательщика 1'; + +COMMENT ON COLUMN S_DF57.SCLIENTN2 IS 'Наименование клиента-плательщика 2'; + +COMMENT ON COLUMN S_DF57.SCLIENTN3 IS 'Наименование клиента-плательщика 3'; + +COMMENT ON COLUMN S_DF57.SCLIENTN4 IS 'Наименование клиента-плательщика 4'; + +COMMENT ON COLUMN S_DF57.INN_DEB IS 'ИНН клиента-плательщика'; + +COMMENT ON COLUMN S_DF57.KPP_DEB IS 'КПП клиента-плательщика'; + +COMMENT ON COLUMN S_DF57.ACC_DEB IS 'Счет клиента-плательщика(дебет)'; + +COMMENT ON COLUMN S_DF57.RCLIENTN1 IS 'Наименование клиента-получателя 1'; + +COMMENT ON COLUMN S_DF57.RCLIENTN2 IS 'Наименование клиента-получателя 2'; + +COMMENT ON COLUMN S_DF57.RCLIENTN3 IS 'Наименование клиента-получателя 3'; + +COMMENT ON COLUMN S_DF57.RCLIENTN4 IS 'Наименование клиента-получателя 4'; + +COMMENT ON COLUMN S_DF57.INN_CRED IS 'ИНН клиента-получателя'; + +COMMENT ON COLUMN S_DF57.KPP_CRED IS 'КПП клиента-получателя'; + +COMMENT ON COLUMN S_DF57.ACC_KR IS 'Счет получателя'; + +COMMENT ON COLUMN S_DF57.SPECIF IS 'Назначение платежа'; + +COMMENT ON COLUMN S_DF57.FILE_NAME IS 'Наименование входящего файла'; + +COMMENT ON COLUMN S_DF57.GENERATION_ID IS 'Идентификатор взаимодействия'; + +COMMENT ON COLUMN S_DF57.DOC_NUM IS 'Номер выгружаемого документа'; + +COMMENT ON COLUMN S_DF57.DOC_DATE IS 'Дата выгружаемого документа'; + +COMMENT ON COLUMN S_DF57.DT_IN IS 'Входящий дебетовый остаток'; + +COMMENT ON COLUMN S_DF57.KT_IN IS 'Входящий кредитовый остаток'; + +COMMENT ON COLUMN S_DF57.DT_OUT IS 'Исходящий дебетовый остаток'; + +COMMENT ON COLUMN S_DF57.KT_OUT IS 'Исходящий кредитовый остаток'; + +GRANT ALL PRIVILEGES ON TABLE S_DF57 TO clearing; + +-- managementJournal - Журнал мониторинга и контроля +DROP TABLE IF EXISTS MANAGEMENT_JOURNAL; +CREATE TABLE MANAGEMENT_JOURNAL(COMPANY_ID bigint, USER_ID bigint, MANAGEMENT_JOURNAL_TYPE varchar(4), MANAGEMENT_JOURNAL_PURPOSE varchar(4), MANAGEMENT_JOURNAL_STATUS varchar(4), TEXT varchar(4096), CHANGE_ACCESS_SIGN varchar(4), CHANGE_DATA_SIGN varchar(4), EVENT_DATE timestamp, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE MANAGEMENT_JOURNAL IS 'Журнал мониторинга и контроля'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL.COMPANY_ID IS 'Идентификатор компании (linked to company)'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL.USER_ID IS 'Идентификатор пользователя (linked to userCls)'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL.MANAGEMENT_JOURNAL_TYPE IS 'Код типа мониторинга (linked to managementJournalType)'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL.MANAGEMENT_JOURNAL_PURPOSE IS 'Код цели мониторинга (linked to managementJournalPurpose)'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL.MANAGEMENT_JOURNAL_STATUS IS 'Код статуса (linked to managementJournalStatus)'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL.TEXT IS 'Текст сообщения'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL.CHANGE_ACCESS_SIGN IS 'Код признака изменения доступа (linked to allowed)'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL.CHANGE_DATA_SIGN IS 'Код признака изменения данных (linked to allowed)'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL.EVENT_DATE IS 'Дата события ЕГРЮЛ'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN MANAGEMENT_JOURNAL.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE MANAGEMENT_JOURNAL TO clearing; + +-- inDocumentJournal - Журнал входящих документов +DROP TABLE IF EXISTS IN_DOCUMENT_JOURNAL; +CREATE TABLE IN_DOCUMENT_JOURNAL(REGISTRATION_DATE date, REGISTRATION_TIME time, REGISTRATION_NUMBER bigint, DOCUMENT_NAME varchar(255), SENDER varchar(255), QUANTITY bigint, CLEARING_CODE varchar(255), COURIER_TYPE varchar(4), EMAIL_DATE date, AMOUNT numeric(72,2), DOSSIER_NUMBER varchar(50), COMMENT varchar(255), RECEIPT_DATE date, RESULT_STATUS varchar(4), ID bigint PRIMARY KEY); +COMMENT ON TABLE IN_DOCUMENT_JOURNAL IS 'Журнал входящих документов'; + +COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.REGISTRATION_DATE IS 'Дата регистрации'; + +COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.REGISTRATION_TIME IS 'Время регистрации'; + +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 IS 'Полное наименование отправителя'; + +COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.QUANTITY IS 'Количествово экземпляров'; + +COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.CLEARING_CODE IS 'Код участника клиринга'; + +COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.COURIER_TYPE IS 'Код способа отправки (linked to courierType)'; + +COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.EMAIL_DATE IS 'Дата отправки электронной почтой'; + +COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.AMOUNT IS 'Сумма'; + +COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.DOSSIER_NUMBER IS 'Номер дела'; + +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)'; + +COMMENT ON COLUMN IN_DOCUMENT_JOURNAL.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE IN_DOCUMENT_JOURNAL TO clearing; + +-- outDocumentJournal - Журнал исходящих документов +DROP TABLE IF EXISTS OUT_DOCUMENT_JOURNAL; +CREATE TABLE OUT_DOCUMENT_JOURNAL(REGISTRATION_DATE date, REGISTRATION_TIME time, REGISTRATION_NUMBER bigint, DOCUMENT_NAME varchar(255), ADDRESSEE varchar(255), QUANTITY bigint, CLEARING_CODE varchar(255), COURIER_TYPE varchar(4), EMAIL_DATE date, AMOUNT numeric(72,2), DOSSIER_NUMBER varchar(50), POST_DATE date, RESULT_STATUS varchar(4), ID bigint PRIMARY KEY); +COMMENT ON TABLE OUT_DOCUMENT_JOURNAL IS 'Журнал исходящих документов'; + +COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.REGISTRATION_DATE IS 'Дата регистрации'; + +COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.REGISTRATION_TIME IS 'Время регистрации'; + +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 IS 'Полное наименование получателя'; + +COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.QUANTITY IS 'Количествово экземпляров'; + +COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.CLEARING_CODE IS 'Код участника клиринга'; + +COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.COURIER_TYPE IS 'Код способа отправки (linked to courierType)'; + +COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.EMAIL_DATE IS 'Дата отправки электронной почтой'; + +COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.AMOUNT IS 'Сумма'; + +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)'; + +COMMENT ON COLUMN OUT_DOCUMENT_JOURNAL.ID IS 'Идентификатор записи'; + +GRANT ALL PRIVILEGES ON TABLE OUT_DOCUMENT_JOURNAL TO clearing; + +-- reportRegister - Реестр отправленных отчетов +DROP TABLE IF EXISTS REPORT_REGISTER; +CREATE TABLE REPORT_REGISTER(COMPANY_FULL_NAME varchar(255), CLEARING_CODE varchar(255), SESSION_ID bigint, COMMENT varchar(255), NAME varchar(255), QUANTITY bigint, ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp, CLEARING_DATE date); +COMMENT ON TABLE REPORT_REGISTER IS 'Реестр отправленных отчетов'; + +COMMENT ON COLUMN REPORT_REGISTER.COMPANY_FULL_NAME IS 'Полное наименование компании'; + +COMMENT ON COLUMN REPORT_REGISTER.CLEARING_CODE IS 'Код клиринга'; + +COMMENT ON COLUMN REPORT_REGISTER.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)'; + +COMMENT ON COLUMN REPORT_REGISTER.COMMENT IS 'Комментарий'; + +COMMENT ON COLUMN REPORT_REGISTER.NAME IS 'Наименование'; + +COMMENT ON COLUMN REPORT_REGISTER.QUANTITY IS 'Количество записей'; + +COMMENT ON COLUMN REPORT_REGISTER.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN REPORT_REGISTER.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN REPORT_REGISTER.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN REPORT_REGISTER.CLEARING_DATE IS 'Дата'; + +GRANT ALL PRIVILEGES ON TABLE REPORT_REGISTER TO clearing; + +-- contractRegister - Журнал регистрации договоров +DROP TABLE IF EXISTS CONTRACT_REGISTER; +CREATE TABLE CONTRACT_REGISTER(NAME varchar(255), NUMBER varchar(255), ISSUE_DATE date, COMPANY_FULL_NAME varchar(255), COMPANY_ID bigint, DOCUMENT_TYPE varchar(4), ISSUE_PLACE varchar(255), ISSUER varchar(255), ISSUER_CODE varchar(255), PLACE varchar(255), VALID_FROM_DATE date, VALID_TO_DATE date, CLOSE_DATE date, COMMENT varchar(255), ID bigint PRIMARY KEY, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE CONTRACT_REGISTER IS 'Журнал регистрации договоров'; + +COMMENT ON COLUMN CONTRACT_REGISTER.NAME IS 'Наименование документа'; + +COMMENT ON COLUMN CONTRACT_REGISTER.NUMBER IS 'Номер документа'; + +COMMENT ON COLUMN CONTRACT_REGISTER.ISSUE_DATE IS 'Дата составления'; + +COMMENT ON COLUMN CONTRACT_REGISTER.COMPANY_FULL_NAME IS 'Полное наименование компании'; + +COMMENT ON COLUMN CONTRACT_REGISTER.COMPANY_ID IS 'Наименование компании (linked to company)'; + +COMMENT ON COLUMN CONTRACT_REGISTER.DOCUMENT_TYPE IS 'Код типа документа (linked to documentType)'; + +COMMENT ON COLUMN CONTRACT_REGISTER.ISSUE_PLACE IS 'Место выдачи'; + +COMMENT ON COLUMN CONTRACT_REGISTER.ISSUER IS 'Кем выдан'; + +COMMENT ON COLUMN CONTRACT_REGISTER.ISSUER_CODE IS 'Код выдавшего органа'; + +COMMENT ON COLUMN CONTRACT_REGISTER.PLACE IS 'Место'; + +COMMENT ON COLUMN CONTRACT_REGISTER.VALID_FROM_DATE IS 'Дата начала срока действия'; + +COMMENT ON COLUMN CONTRACT_REGISTER.VALID_TO_DATE IS 'Дата окончания срока действия'; + +COMMENT ON COLUMN CONTRACT_REGISTER.CLOSE_DATE IS 'Дата расторжения'; + +COMMENT ON COLUMN CONTRACT_REGISTER.COMMENT IS 'Место'; + +COMMENT ON COLUMN CONTRACT_REGISTER.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN CONTRACT_REGISTER.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN CONTRACT_REGISTER.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE CONTRACT_REGISTER TO clearing; + +-- operation - Проводки +DROP TABLE IF EXISTS OPERATION; +CREATE TABLE 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 varchar(4)); +COMMENT ON TABLE OPERATION IS 'Проводки'; + +COMMENT ON COLUMN OPERATION.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN OPERATION.ADDRESSEE_ID IS 'Идентификатор компании-получателя (linked to company)'; + +COMMENT ON COLUMN OPERATION.SENDER_ID IS 'Идентификатор компании-отправителя (linked to company)'; + +COMMENT ON COLUMN OPERATION.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN OPERATION.UPDATED_AT IS 'Дата-время изменения записи'; + +COMMENT ON COLUMN OPERATION.CLEARING_DATE IS 'Дата'; + +COMMENT ON COLUMN OPERATION.OPERATION_TYPE_ID IS 'Тип проводки (linked to operationType)'; + +COMMENT ON COLUMN OPERATION.OPERATION_STATUS IS 'Код статуса обработки (linked to operationStatus)'; + +GRANT ALL PRIVILEGES ON TABLE OPERATION TO clearing; + +-- marketDataLiquidation - Статичная ценовая информация для ликвидации активов +DROP TABLE IF EXISTS MARKET_DATA_LIQUIDATION; +CREATE TABLE MARKET_DATA_LIQUIDATION(ID bigint PRIMARY KEY, SECURITY_ID bigint, PRICE numeric(72,18), CLEARING_DATE date); +COMMENT ON TABLE MARKET_DATA_LIQUIDATION IS 'Статичная ценовая информация для ликвидации активов'; + +COMMENT ON COLUMN MARKET_DATA_LIQUIDATION.ID IS 'Идентификатор'; + +COMMENT ON COLUMN MARKET_DATA_LIQUIDATION.SECURITY_ID IS 'Идентификатор инструмента (linked to security)'; + +COMMENT ON COLUMN MARKET_DATA_LIQUIDATION.PRICE IS 'Цена за 1 штуку ликвидационного актива'; + +COMMENT ON COLUMN MARKET_DATA_LIQUIDATION.CLEARING_DATE IS 'Дата'; + +GRANT ALL PRIVILEGES ON TABLE MARKET_DATA_LIQUIDATION TO clearing; + +-- sCrossRate - Кросс курсы валют от ЦБ +DROP TABLE IF EXISTS S_CROSS_RATE; +CREATE TABLE S_CROSS_RATE(ID bigint PRIMARY KEY, DATE date, CURRENCY varchar(50), CURR_CODE varchar(50), FACE_VALUE numeric(72,18), RATE numeric(72,18), UNIT_RATE numeric(72,18), GENERATION_TIME timestamp, GENERATION_ID bigint, CREATED_AT timestamp, UPDATED_AT timestamp); +COMMENT ON TABLE S_CROSS_RATE IS 'Кросс курсы валют от ЦБ'; + +COMMENT ON COLUMN S_CROSS_RATE.ID IS 'Идентификатор записи'; + +COMMENT ON COLUMN S_CROSS_RATE.DATE IS 'Дата торгов'; + +COMMENT ON COLUMN S_CROSS_RATE.CURRENCY IS 'Наименование валюты'; + +COMMENT ON COLUMN S_CROSS_RATE.CURR_CODE IS 'Код валюты'; + +COMMENT ON COLUMN S_CROSS_RATE.FACE_VALUE IS 'Номинал'; + +COMMENT ON COLUMN S_CROSS_RATE.RATE IS 'Курс валюты с учетом размера лота'; + +COMMENT ON COLUMN S_CROSS_RATE.UNIT_RATE IS 'Курс за единицу иностранной валюты'; + +COMMENT ON COLUMN S_CROSS_RATE.GENERATION_TIME IS 'Дата и время создания записи'; + +COMMENT ON COLUMN S_CROSS_RATE.GENERATION_ID IS 'Идентификатор взаимодействия'; + +COMMENT ON COLUMN S_CROSS_RATE.CREATED_AT IS 'Дата-время создания записи'; + +COMMENT ON COLUMN S_CROSS_RATE.UPDATED_AT IS 'Дата-время изменения записи'; + +GRANT ALL PRIVILEGES ON TABLE S_CROSS_RATE TO clearing; + +/* views */ + +-- Data types + +INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.11') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION \ No newline at end of file diff --git a/clearing-parent/db-scripts/src/main/resources/db/DATA.sql b/clearing-parent/db-scripts/src/main/resources/db/DICTIONARIES.sql similarity index 92% rename from clearing-parent/db-scripts/src/main/resources/db/DATA.sql rename to clearing-parent/db-scripts/src/main/resources/db/DICTIONARIES.sql index ab95215cc..f27a74ca1 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/DATA.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/DICTIONARIES.sql @@ -1,5 +1,5 @@ --- DB version: 3.11.0.88 --- DATA version: 3.11.0.78 +-- DB version: 3.12 +-- DATA version: 3.12.2.93 /* Dictionaries */ @@ -20,6 +20,8 @@ INSERT INTO SECTION_DICTIONARY(ID, CODE, NAME) values (2, 'FOND', 'Фондов INSERT INTO SECTION_DICTIONARY(ID, CODE, NAME) values (3, 'CURR', 'Валютная секция') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; +INSERT INTO SECTION_DICTIONARY(ID, CODE, NAME) values (4, 'MULT', 'Единая') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + INSERT INTO USER_ROLE_DICTIONARY(ID, CODE, NAME) values (1, 'ADMN', 'Администратор Клиринга МКР') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; INSERT INTO USER_ROLE_DICTIONARY(ID, CODE, NAME) values (2, 'SPVS', 'Супервайзер Клиринга МКР') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; @@ -124,7 +126,7 @@ INSERT INTO DOCUMENT_TYPE_DICTIONARY(ID, CODE, NAME) values (20, 'LICD', 'Док INSERT INTO DOCUMENT_TYPE_DICTIONARY(ID, CODE, NAME) values (21, 'LICT', 'Документ о лицензии по управлению ЦБ') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; -INSERT INTO DOCUMENT_TYPE_DICTIONARY(ID, CODE, NAME) values (22, 'LICС', 'Документ о лицензии по брокерской деятельности ПФИ (производных финансовых инструментов)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; +INSERT INTO DOCUMENT_TYPE_DICTIONARY(ID, CODE, NAME) values (22, 'LICC', 'Документ о лицензии по брокерской деятельности ПФИ (производных финансовых инструментов)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; INSERT INTO DOCUMENT_TYPE_DICTIONARY(ID, CODE, NAME) values (23, 'LICF', 'Документ о лицензии форекс-дилера') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; @@ -152,7 +154,7 @@ INSERT INTO COMPANY_SYMBOL_DICTIONARY(ID, CODE, NAME, SHORTNAME) values (10, 'LI INSERT INTO COMPANY_SYMBOL_DICTIONARY(ID, CODE, NAME, SHORTNAME) values (11, 'LICT', 'Номер лицензии по управлению ЦБ', 'Управление ценными бумагами') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, SHORTNAME = EXCLUDED.SHORTNAME; -INSERT INTO COMPANY_SYMBOL_DICTIONARY(ID, CODE, NAME, SHORTNAME) values (12, 'LICС', 'Номер лицензии по брокерской деятельности ПФИ (производных финансовых инструментов)', 'Брокерская деятельность ПФИ') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, SHORTNAME = EXCLUDED.SHORTNAME; +INSERT INTO COMPANY_SYMBOL_DICTIONARY(ID, CODE, NAME, SHORTNAME) values (12, 'LICC', 'Номер лицензии по брокерской деятельности ПФИ (производных финансовых инструментов)', 'Брокерская деятельность ПФИ') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, SHORTNAME = EXCLUDED.SHORTNAME; INSERT INTO COMPANY_SYMBOL_DICTIONARY(ID, CODE, NAME, SHORTNAME) values (13, 'LICF', 'Номер лицензии форекс-дилера', 'Деятельность форекс-дилера') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, SHORTNAME = EXCLUDED.SHORTNAME; @@ -194,11 +196,31 @@ INSERT INTO CURRENCY_CODE_DICTIONARY(ID, CODE, NAME) values (978, 'EUR', 'Евр INSERT INTO CURRENCY_CODE_DICTIONARY(ID, CODE, NAME) values (156, 'CNY', 'Китайский Юань') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; +INSERT INTO CURRENCY_CODE_DICTIONARY(ID, CODE, NAME) values (860, 'UZS', 'Узбекский сум') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + +INSERT INTO CURRENCY_CODE_DICTIONARY(ID, CODE, NAME) values (398, 'KZT', 'Тенге') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + +INSERT INTO CURRENCY_CODE_DICTIONARY(ID, CODE, NAME) values (51, 'AMD', 'Армянский драм') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + +INSERT INTO CURRENCY_CODE_DICTIONARY(ID, CODE, NAME) values (417, 'KGS', 'Сом') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + +INSERT INTO CURRENCY_CODE_DICTIONARY(ID, CODE, NAME) values (933, 'BYN', 'Белорусский рубль') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + INSERT INTO CURRENCY_PAIR_DICTIONARY(ID, CODE, BASE_CURRENCY, QUOTE_CURRENCY, MAJOR_SIGN) values (1, 'EUR/RUB', 'EUR', 'RUB', 'CONV') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, BASE_CURRENCY = EXCLUDED.BASE_CURRENCY, QUOTE_CURRENCY = EXCLUDED.QUOTE_CURRENCY, MAJOR_SIGN = EXCLUDED.MAJOR_SIGN; INSERT INTO CURRENCY_PAIR_DICTIONARY(ID, CODE, BASE_CURRENCY, QUOTE_CURRENCY, MAJOR_SIGN) values (2, 'USD/RUB', 'USD', 'RUB', 'CONV') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, BASE_CURRENCY = EXCLUDED.BASE_CURRENCY, QUOTE_CURRENCY = EXCLUDED.QUOTE_CURRENCY, MAJOR_SIGN = EXCLUDED.MAJOR_SIGN; -INSERT INTO CURRENCY_PAIR_DICTIONARY(ID, CODE, BASE_CURRENCY, QUOTE_CURRENCY, MAJOR_SIGN) values (3, 'CNY/RUВ', 'CNY', 'RUВ', 'CONV') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, BASE_CURRENCY = EXCLUDED.BASE_CURRENCY, QUOTE_CURRENCY = EXCLUDED.QUOTE_CURRENCY, MAJOR_SIGN = EXCLUDED.MAJOR_SIGN; +INSERT INTO CURRENCY_PAIR_DICTIONARY(ID, CODE, BASE_CURRENCY, QUOTE_CURRENCY, MAJOR_SIGN) values (3, 'CNY/RUB', 'CNY', 'RUB', 'CONV') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, BASE_CURRENCY = EXCLUDED.BASE_CURRENCY, QUOTE_CURRENCY = EXCLUDED.QUOTE_CURRENCY, MAJOR_SIGN = EXCLUDED.MAJOR_SIGN; + +INSERT INTO CURRENCY_PAIR_DICTIONARY(ID, CODE, BASE_CURRENCY, QUOTE_CURRENCY, MAJOR_SIGN) values (4, 'UZS/RUB', 'UZS', 'RUB', 'CONV') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, BASE_CURRENCY = EXCLUDED.BASE_CURRENCY, QUOTE_CURRENCY = EXCLUDED.QUOTE_CURRENCY, MAJOR_SIGN = EXCLUDED.MAJOR_SIGN; + +INSERT INTO CURRENCY_PAIR_DICTIONARY(ID, CODE, BASE_CURRENCY, QUOTE_CURRENCY, MAJOR_SIGN) values (6, 'KGS/RUB', 'KGS', 'RUB', 'CONV') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, BASE_CURRENCY = EXCLUDED.BASE_CURRENCY, QUOTE_CURRENCY = EXCLUDED.QUOTE_CURRENCY, MAJOR_SIGN = EXCLUDED.MAJOR_SIGN; + +INSERT INTO CURRENCY_PAIR_DICTIONARY(ID, CODE, BASE_CURRENCY, QUOTE_CURRENCY, MAJOR_SIGN) values (7, 'KZT/RUB', 'KZT', 'RUB', 'CONV') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, BASE_CURRENCY = EXCLUDED.BASE_CURRENCY, QUOTE_CURRENCY = EXCLUDED.QUOTE_CURRENCY, MAJOR_SIGN = EXCLUDED.MAJOR_SIGN; + +INSERT INTO CURRENCY_PAIR_DICTIONARY(ID, CODE, BASE_CURRENCY, QUOTE_CURRENCY, MAJOR_SIGN) values (8, 'BYN/RUB', 'BYN', 'RUB', 'CONV') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, BASE_CURRENCY = EXCLUDED.BASE_CURRENCY, QUOTE_CURRENCY = EXCLUDED.QUOTE_CURRENCY, MAJOR_SIGN = EXCLUDED.MAJOR_SIGN; + +INSERT INTO CURRENCY_PAIR_DICTIONARY(ID, CODE, BASE_CURRENCY, QUOTE_CURRENCY, MAJOR_SIGN) values (9, 'AMD/RUB', 'AMD', 'RUB', 'CONV') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, BASE_CURRENCY = EXCLUDED.BASE_CURRENCY, QUOTE_CURRENCY = EXCLUDED.QUOTE_CURRENCY, MAJOR_SIGN = EXCLUDED.MAJOR_SIGN; INSERT INTO INSTRUMENT_TYPE_DICTIONARY(ID, CODE, NAME) values (1, 'RATE', 'Инструмент Денежного рынка') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; @@ -330,66 +352,6 @@ INSERT INTO REGISTRY_UNIT_DICTIONARY(ID, CODE, NAME) values (5, 'I', 'Списа INSERT INTO REGISTRY_UNIT_DICTIONARY(ID, CODE, NAME) values (7, 'V', 'Выписка') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (1, 'AMAT', 'Денежные средства - общие') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (2, 'AMAF', 'Денежные средства - свободные') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (3, 'AMAB', 'Денежные средства - блокированные') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (4, 'TMAT', 'Требования по деньгам') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (5, 'OSAT', 'Обязательства по бумагам') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (6, 'OMAT', 'Обязательства по деньгам') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (7, 'TSAT', 'Требования по бумагам') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (8, 'CMAT', 'Рассчитанные требования по деньгам') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (9, 'LSAT', 'Рассчитанные обязательства по бумагам') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (10, 'LMAT', 'Рассчитанные обязательства по деньгам') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (11, 'CSAT', 'Рассчитанные требования по бумагам') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (12, 'AMBT', 'Денежные средства клиента - общие') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (13, 'AMBF', 'Денежные средства клиента - свободные') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (14, 'AMBB', 'Денежные средства клиента - блокированные') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (15, 'TMBT', 'Требования по деньгам (кл)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (16, 'OSBT', 'Обязательства по бумагам (кл)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (17, 'OMBT', 'Обязательства по деньгам (кл)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (18, 'TSBT', 'Требования по бумагам (кл)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (19, 'CMBT', 'Рассчитанные требования по деньгам (кл)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (20, 'LSBT', 'Рассчитанные обязательства по бумагам (кл)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (21, 'LMBT', 'Рассчитанные обязательства по деньгам (кл)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (22, 'CSBT', 'Рассчитанные требования по бумагам (кл)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (23, 'DMAT', 'Возврат депозита') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (24, 'DMBT', 'Возврат депозита (кл)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (25, 'ASAT', 'Ценные бумаги - общие') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (26, 'ASAF', 'Ценные бумаги - свободные') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (27, 'ASAB', 'Ценные бумаги - блокированные') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (28, 'DMAX', 'Возврат инициатору') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (29, 'DMBX', 'Возврат инициатору (кл)') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - -INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (30, 'DMAU', 'Денежные средства - невыясненные') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; - INSERT INTO REGISTRY_STATUS_DICTIONARY(ID, CODE, NAME) values (1, 'OK', 'Рассчитано') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; INSERT INTO REGISTRY_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'UNCV', 'Не исполнено') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; @@ -590,6 +552,8 @@ INSERT INTO SESSION_TYPE_DICTIONARY(ID, CODE, NAME) values (8, 'IPO0', 'Перв INSERT INTO SESSION_TYPE_DICTIONARY(ID, CODE, NAME) values (9, 'CURR', 'Валютные торги') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; +INSERT INTO SESSION_TYPE_DICTIONARY(ID, CODE, NAME) values (10, 'UNIT', 'Клиринговая сессия Т0') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + INSERT INTO MONEY_FLOW_SIDE_DICTIONARY(ID, CODE, NAME) values (1, 'BUY', 'Привлечь') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; INSERT INTO MONEY_FLOW_SIDE_DICTIONARY(ID, CODE, NAME) values (2, 'SELL', 'Разместить') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; @@ -882,6 +846,16 @@ INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5025, 'ACNT', 'Нео INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5026, 'ACNT', 'Счет %S не валютный.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5027, 'ACNT', 'У компании %s отсутствует категория.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5028, 'ACNT', 'Указанный ТКР не найден в клиринговой системе.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5029, 'ACNT', 'Счет %s не найден в клиринговой системе.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5030, 'ACNT', 'Компания %s не найдена в клиринговой системе.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5031, 'ACNT', 'Для данной валюты в ТКР уже задан счет.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5200, 'BLNC', 'Общая ошибка модуля balance-service.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5210, 'BLNC', 'Клиринговая сессия неактивна.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; diff --git a/clearing-parent/db-scripts/src/main/resources/db/readme.txt b/clearing-parent/db-scripts/src/main/resources/db/readme.txt index 3e1d23335..7b030f3b4 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/readme.txt +++ b/clearing-parent/db-scripts/src/main/resources/db/readme.txt @@ -13,4 +13,4 @@ rm -fr /opt/clearing/db/clearing.db "exit;" 4. Input initial data and dictionary values -cat DATA.sql | /opt/firebird/bin/isql -user SYSDBA -password SYSDBA /opt/clearing/db/clearing.db +cat DICTIONARIES.sql | /opt/firebird/bin/isql -user SYSDBA -password SYSDBA /opt/clearing/db/clearing.db diff --git a/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.12.sql b/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.12.sql new file mode 100644 index 000000000..663a280ea --- /dev/null +++ b/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.12.sql @@ -0,0 +1,34 @@ +-- DB version: 3.11 -> 3.12 + +-- == alter exist tables == +ALTER TABLE REGISTRY ADD COLUMN IF NOT EXISTS SECTION varchar(4); +ALTER TABLE REGISTRY_HISTORY ADD COLUMN IF NOT EXISTS SECTION varchar(4); +ALTER TABLE BANK_ACCOUNT ADD COLUMN IF NOT EXISTS INTERMEDIARY_SWIFT_CODE varchar(255); +ALTER TABLE BANK_ACCOUNT_HISTORY ADD COLUMN IF NOT EXISTS INTERMEDIARY_SWIFT_CODE varchar(255); +COMMENT ON COLUMN REGISTRY.SECTION IS 'Код секции (linked to section)'; +COMMENT ON COLUMN REGISTRY_HISTORY.SECTION IS 'Код секции (linked to section)'; +COMMENT ON COLUMN BANK_ACCOUNT.INTERMEDIARY_SWIFT_CODE IS 'Код SWIFT посредника'; +COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.INTERMEDIARY_SWIFT_CODE IS 'Код SWIFT посредника'; +COMMENT ON TABLE BANK_ACCOUNT IS 'Счета вывода средств'; + + +-- rename +ALTER TABLE S_DF06 RENAME COLUMN _DOC__NUM TO DOC_NUM; +ALTER TABLE S_DF06 RENAME COLUMN _DOC__DATE TO DOC_DATE; +ALTER TABLE S_DF07 RENAME COLUMN _DOC__NUM TO DOC_NUM; +ALTER TABLE S_DF07 RENAME COLUMN _DOC__DATE TO DOC_DATE; +ALTER TABLE S_DF54 RENAME COLUMN _DOC__NUM TO DOC_NUM; +ALTER TABLE S_DF54 RENAME COLUMN _DOC__DATE TO DOC_DATE; +ALTER TABLE S_DF54 RENAME COLUMN _VALUE_DATE TO VALUE_DATE; +ALTER TABLE S_DF54 RENAME COLUMN _SWIFT_BEN TO SWIFT_BEN; +ALTER TABLE S_DF54 RENAME COLUMN _SWIFT_INT TO SWIFT_INT; +ALTER TABLE S_DF55 RENAME COLUMN _DOC__NUM TO DOC_NUM; +ALTER TABLE S_DF55 RENAME COLUMN _DOC__DATE TO DOC_DATE; +ALTER TABLE S_DF55 RENAME COLUMN _VALUE_DATE TO VALUE_DATE; +ALTER TABLE S_DF55 RENAME COLUMN _SWIFT_BEN TO SWIFT_BEN; +ALTER TABLE S_DF55 RENAME COLUMN _SWIFT_INT TO SWIFT_INT; +ALTER TABLE S_DF57 RENAME COLUMN _DOC__NUM TO DOC_NUM; +ALTER TABLE S_DF57 RENAME COLUMN _DOC__DATE TO DOC_DATE; + + +INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.12') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION \ No newline at end of file diff --git a/clearing-parent/dbf-exporter/pom.xml b/clearing-parent/dbf-exporter/pom.xml index f718662c5..1debc78de 100644 --- a/clearing-parent/dbf-exporter/pom.xml +++ b/clearing-parent/dbf-exporter/pom.xml @@ -7,12 +7,12 @@ dbf-exporter dbf-exporter DBF exporter for DBF files - SPCEX-3.11.0.0 + SPCEX-3.12.7 clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/SFTPConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/SFTPConfig.java index 2402aa45c..636a9f201 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/SFTPConfig.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/SFTPConfig.java @@ -1,19 +1,23 @@ package ru.spcex.clearing.dbf.exporter.config; +import java.io.File; +import java.util.List; import com.jcraft.jsch.ChannelSftp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.integration.annotation.Gateway; -import org.springframework.integration.annotation.MessagingGateway; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway; +import static org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway.Command.LS; import org.springframework.integration.file.remote.session.CachingSessionFactory; import org.springframework.integration.file.remote.session.SessionFactory; +import org.springframework.integration.gateway.AnnotationGatewayProxyFactoryBean; import org.springframework.integration.sftp.gateway.SftpOutboundGateway; import org.springframework.integration.sftp.outbound.SftpMessageHandler; import org.springframework.integration.sftp.session.DefaultSftpSessionFactory; @@ -24,11 +28,7 @@ import org.springframework.messaging.handler.annotation.Header; import org.springframework.messaging.handler.annotation.Payload; import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings; -import java.io.File; -import java.util.List; - -import static org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway.Command.LS; - +@Profile("!test") @Configuration public class SFTPConfig { protected Logger log = LoggerFactory.getLogger(getClass()); @@ -60,7 +60,11 @@ public class SFTPConfig { return handler; } - @MessagingGateway + // https://stackoverflow.com/questions/53655208/profile-doesnt-work-with-messaging-gateway + @Bean("dbfGateway") + public AnnotationGatewayProxyFactoryBean dbfGateway() { + return new AnnotationGatewayProxyFactoryBean(DbfGateway.class); + } public interface DbfGateway { @Gateway(requestChannel = "toSftpChannel") void sendToSftp(@Payload File file, @Header("path") String path); diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/SFTPMockConfig.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/SFTPMockConfig.java new file mode 100644 index 000000000..7ee6e2ec0 --- /dev/null +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/config/SFTPMockConfig.java @@ -0,0 +1,32 @@ +package ru.spcex.clearing.dbf.exporter.config; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.integration.sftp.session.SftpFileInfo; + +@Profile("test") +@Configuration +public class SFTPMockConfig { + @Bean("dbfGateway") + public SFTPConfig.DbfGateway dbfGateway(){ + return new DGateway(); + } + + public static class DGateway implements SFTPConfig.DbfGateway{ + + @Override + public void sendToSftp(File file, String path) { + + } + + @Override + public List listFiles(String dir) { + return new ArrayList<>(); + } + } + +} 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 482e4aef8..eeaf67dd0 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 @@ -1,7 +1,17 @@ package ru.spcex.clearing.dbf.exporter.logic.stages; +import java.io.File; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Supplier; import com.linuxense.javadbf.DBFWriter; 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.SFTPConfig; import ru.spcex.clearing.dbf.exporter.config.settings.ExportDBFServiceSettings; @@ -10,6 +20,8 @@ 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.services.converters.DFConverter; +import static ru.spcex.clearing.dbf.exporter.services.converters.DFConverter.ruCurrency; +import static ru.spcex.clearing.platform.messaging.domain.Consts.PAIR_SDF; import ru.spcex.clearing.platform.messaging.domain.cud.utilities.PairSdfRequest; import ru.spcex.clearing.platform.messaging.serialization.LogFormatter; import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; @@ -18,14 +30,6 @@ import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import java.io.File; -import java.nio.charset.Charset; -import java.util.*; -import java.util.function.Supplier; - -import static ru.spcex.clearing.dbf.exporter.services.converters.DFConverter.ruCurrency; -import static ru.spcex.clearing.platform.messaging.domain.Consts.PAIR_SDF; - /** * Выгрузка данных из мапы hazelcast и их запись в файлы */ @@ -41,7 +45,7 @@ public class ExportFromHazelcast extends Stage implements InitializingBean { public ExportFromHazelcast(ExportDBFServiceSettings settings, ImdgProvider imdgProvider, - SFTPConfig.DbfGateway gateway, + @Qualifier("dbfGateway") SFTPConfig.DbfGateway gateway, List converters, Supplier kafkaSender) { this.settings = settings; 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 253f0b6a4..c38ddd3f7 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,6 +1,17 @@ package ru.spcex.clearing.dbf.exporter.logic.stages; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.integration.sftp.session.SftpFileInfo; import org.springframework.stereotype.Component; import ru.spcex.clearing.dbf.exporter.config.SFTPConfig; @@ -10,13 +21,6 @@ import ru.spcex.clearing.dbf.exporter.logic.data.enums.FilenameTemplate; import ru.spcex.clearing.dbf.exporter.logic.data.enums.StageResult; import ru.spcex.clearing.dbf.exporter.logic.data.enums.Table; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.time.LocalDateTime; -import java.util.*; - /** * Создание DBF файла */ @@ -27,7 +31,8 @@ public class PrepareDBFFile extends Stage implements InitializingBean { public static String outDir; private final SFTPConfig.DbfGateway gateway; - public PrepareDBFFile(ExportDBFServiceSettings settings, SFTPConfig.DbfGateway gateway) { + public PrepareDBFFile(ExportDBFServiceSettings settings, + @Qualifier("dbfGateway") SFTPConfig.DbfGateway gateway) { this.settings = settings; this.gateway = gateway; } @@ -42,6 +47,8 @@ public class PrepareDBFFile extends Stage implements InitializingBean { List files = new ArrayList<>(); log.trace("Get files from SFTP paths: {}", settings.getStore().getOutPayValDir().values()); for (String path : settings.getStore().getOutPayValDir().values()) { + if (!path.endsWith("/")) // без "/" на конце папки пишет ошибку: Caused by: com.jcraft.jsch.SftpException: No such file + path += "/"; files.addAll(gateway.listFiles(path)); } log.info("There are {} files on the sFTP server in the search directories.", files.size()); diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF07_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF07_Converter.java index 6b4401b50..ed9749564 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF07_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF07_Converter.java @@ -28,8 +28,8 @@ public class S_DF07_Converter extends DFConverter { values.add(typeMatch(entity.getSpec())); values.add(typeMatch(entity.getNumber())); values.add(typeMatch(entity.getResult())); - values.add(typeMatch(entity.getDoc_Num())); - values.add(typeMatch(entity.getDoc_Date())); + values.add(typeMatch(entity.getDoc_num())); + values.add(typeMatch(entity.getDoc_date())); values.add(typeMatch(entity.getPay_val())); return values.toArray(Object[]::new); } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java index 1fbfc8a1b..ffd17ede1 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF54_Converter.java @@ -58,8 +58,8 @@ public class S_DF54_Converter extends DFConverter { values.add(typeMatch(entity.getSpecif_1())); values.add(typeMatch(entity.getSend_type())); values.add(typeMatch(entity.getDoc_result())); - values.add(typeMatch(entity.getDoc_Num())); - values.add(typeMatch(entity.getDoc_Date())); + values.add(typeMatch(entity.getDoc_num())); + values.add(typeMatch(entity.getDoc_date())); values.add(typeMatch(entity.getValue_date())); values.add(typeMatch(entity.getSwift_ben())); values.add(typeMatch(entity.getSwift_int())); diff --git a/clearing-parent/dbf-exporter/src/main/resources/application.properties b/clearing-parent/dbf-exporter/src/main/resources/application.properties index 0bdbdcaa5..1f8e20723 100644 --- a/clearing-parent/dbf-exporter/src/main/resources/application.properties +++ b/clearing-parent/dbf-exporter/src/main/resources/application.properties @@ -7,10 +7,10 @@ export-dbf-service.hazelcast.password=dev-pass export-dbf-service.common.encoding=cp866 export-dbf-service.common.threads-count=10 -export-dbf-service.store.local-temp-dir=D:\\docs and T3\\clearing\\dbf\\ +export-dbf-service.store.local-temp-dir=D:\\docs and T3\\clearing\\dbf # код валюты должен быть в верхнем регистре, например для рублей - "RUB" (*.RUB=export/rub/).RUB=export/rub/ -export-dbf-service.store.out-pay-val-dir.RUB=export/rub/ -export-dbf-service.store.out-pay-val-dir.EUR=export/eur/ +export-dbf-service.store.out-pay-val-dir.RUB=export/rub +export-dbf-service.store.out-pay-val-dir.EUR=export/eur export-dbf-service.store.user:tester export-dbf-service.store.password=password export-dbf-service.store.server-ip=10.230.238.53 diff --git a/clearing-parent/dbf-importer/pom.xml b/clearing-parent/dbf-importer/pom.xml index ff41ca5e1..f362d6c5c 100644 --- a/clearing-parent/dbf-importer/pom.xml +++ b/clearing-parent/dbf-importer/pom.xml @@ -8,12 +8,12 @@ dbf-importer dbf-importer DBF loader for DBF files - SPCEX-3.11.0.0 + SPCEX-3.12.7 clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/SFTPConfig.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/SFTPConfig.java index 593108f98..072af77b6 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/SFTPConfig.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/SFTPConfig.java @@ -1,41 +1,34 @@ package ru.spcex.clearing.dbf.importer.config; +import java.io.File; +import java.util.List; import com.jcraft.jsch.ChannelSftp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; import org.springframework.integration.annotation.Gateway; -import org.springframework.integration.annotation.MessagingGateway; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway; +import static org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway.Command.MGET; import org.springframework.integration.file.remote.session.CachingSessionFactory; import org.springframework.integration.file.remote.session.SessionFactory; +import org.springframework.integration.gateway.AnnotationGatewayProxyFactoryBean; import org.springframework.integration.sftp.gateway.SftpOutboundGateway; import org.springframework.integration.sftp.session.DefaultSftpSessionFactory; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; import ru.spcex.clearing.dbf.importer.config.settings.ImportDBFServiceSettings; -import java.io.File; -import java.util.List; - -import static org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway.Command.MGET; - +@Profile("!test") @Configuration public class SFTPConfig { private final Logger log = LoggerFactory.getLogger(getClass()); - private final ImportDBFServiceSettings settings; - - @Autowired - public SFTPConfig(ImportDBFServiceSettings settings) { - this.settings = settings; - } @Bean - public SessionFactory sftpSessionFactory() { + public SessionFactory sftpSessionFactory(ImportDBFServiceSettings settings) { DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true); factory.setHost(settings.getStore().getSftpIn().getServerIp()); factory.setPort(settings.getStore().getSftpIn().getServerPort()); @@ -45,7 +38,12 @@ public class SFTPConfig { return new CachingSessionFactory<>(factory); } - @MessagingGateway + // https://stackoverflow.com/questions/53655208/profile-doesnt-work-with-messaging-gateway + @Bean("dbfGateway") + public AnnotationGatewayProxyFactoryBean dbfGateway() { + return new AnnotationGatewayProxyFactoryBean(DbfGateway.class); + } + public interface DbfGateway { @Gateway(requestChannel = "listSftpChannel") List listFiles(String dir); diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/SFTPMockConfig.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/SFTPMockConfig.java new file mode 100644 index 000000000..d46cb4952 --- /dev/null +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/config/SFTPMockConfig.java @@ -0,0 +1,26 @@ +package ru.spcex.clearing.dbf.importer.config; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Profile("test") +@Configuration +public class SFTPMockConfig { + @Bean("dbfGateway") + public SFTPConfig.DbfGateway dbfGateway(){ + return new DGateway(); + } + + public static class DGateway implements SFTPConfig.DbfGateway{ + + @Override + public List listFiles(String dir) { + return new ArrayList<>(); + } + } + +} diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf06Table.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf06Table.java index 706394403..7f2e53cee 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf06Table.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf06Table.java @@ -29,8 +29,8 @@ public class SDf06Table extends AbstractTable { result.setBic(anyToString(entity[7])); result.setSpec((String) entity[8]); result.setNumber(anyNumberToBigDecimal(entity[9])); - result.setDoc_Num((String) entity[10]); - result.setDoc_Date((String) entity[11]); + result.setDoc_num((String) entity[10]); + result.setDoc_date((String) entity[11]); result.setPay_val((String) entity[12]); result.setFileName(filename); result.setGenerationTime(Instant.now()); diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf55Table.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf55Table.java index 3852f3764..6c9f425b2 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf55Table.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf55Table.java @@ -59,8 +59,8 @@ public class SDf55Table extends AbstractTable { result.setSpecif_1((String) entity[37]); result.setSend_type((String) entity[38]); result.setDoc_result((String) entity[39]); - result.setDoc_Num((String) entity[40]); - result.setDoc_Date((String) entity[41]); + result.setDoc_num((String) entity[40]); + result.setDoc_date((String) entity[41]); result.setValue_date((String) entity[42]); result.setSwift_ben((String) entity[43]); result.setSwift_int((String) entity[44]); diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf57Table.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf57Table.java index bb3d34b62..f2ce982fa 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf57Table.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/data/tables/SDf57Table.java @@ -70,8 +70,8 @@ public class SDf57Table extends AbstractTable { result.setKpp_cred((String) entity[34]); result.setAcc_kr((String) entity[35]); result.setSpecif((String) entity[36]); - result.setDoc_Num((String) entity[37]); - result.setDoc_Date((String) entity[38]); + result.setDoc_num((String) entity[37]); + result.setDoc_date((String) entity[38]); result.setDt_in((String) entity[39]); result.setKt_in((String) entity[40]); result.setDt_out((String) entity[41]); 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 ad20d9537..47ab54498 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,21 +1,27 @@ package ru.spcex.clearing.dbf.importer.services; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; -import ru.spcex.clearing.dbf.importer.config.SFTPConfig; -import ru.spcex.clearing.dbf.importer.config.settings.ImportDBFServiceSettings; -import ru.spcex.clearing.dbf.importer.logic.data.enums.ETable; -import ru.spcex.platform.utils.log.ExceptionUtils; - import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.EnumMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; +import ru.spcex.clearing.dbf.importer.config.SFTPConfig; +import ru.spcex.clearing.dbf.importer.config.settings.ImportDBFServiceSettings; +import ru.spcex.clearing.dbf.importer.logic.data.enums.ETable; +import ru.spcex.platform.utils.log.ExceptionUtils; @Service("fileChecker") public class FileChecker { @@ -23,7 +29,7 @@ public class FileChecker { private final Logger log = LoggerFactory.getLogger(this.getClass()); private final SFTPConfig.DbfGateway gateway; - public FileChecker(SFTPConfig.DbfGateway gateway, + public FileChecker(@Qualifier("dbfGateway") SFTPConfig.DbfGateway gateway, ImportDBFServiceSettings settings) { this.gateway = gateway; this.settings = settings; @@ -72,6 +78,8 @@ public class FileChecker { List files = new ArrayList<>(); log.trace("Load from SFTP paths: {}", settings.getStore().getSftpIn().getSftpSrcPayValDir().values()); for (String path : settings.getStore().getSftpIn().getSftpSrcPayValDir().values()) { + if (!path.endsWith("/")) // без "/" на конце папки пишет ошибку: Caused by: com.jcraft.jsch.SftpException: No such file + path += "/"; files.addAll(gateway.listFiles(path)); } if (files.size() > 0) log.info("Loaded from SFTP files count={}", files.size()); diff --git a/clearing-parent/dbf-importer/src/main/resources/application.properties b/clearing-parent/dbf-importer/src/main/resources/application.properties index 7957a0c9e..d077d0320 100644 --- a/clearing-parent/dbf-importer/src/main/resources/application.properties +++ b/clearing-parent/dbf-importer/src/main/resources/application.properties @@ -14,8 +14,8 @@ import-dbf-service.common.insert-batch-size=100 import-dbf-service.common.threads-count=10 #sftpSrcDir -import-dbf-service.store.sftp-in.sftp-src-pay-val-dir.rub=clearing_importer_sftp/rub/ -import-dbf-service.store.sftp-in.sftp-src-pay-val-dir.eur=clearing_importer_sftp/eur/ +import-dbf-service.store.sftp-in.sftp-src-pay-val-dir.rub=clearing_importer_sftp/rub +import-dbf-service.store.sftp-in.sftp-src-pay-val-dir.eur=clearing_importer_sftp/eur import-dbf-service.store.sftp-in.sftp-src-dir=clearing_importer_sftp import-dbf-service.store.sftp-in.user=user import-dbf-service.store.sftp-in.password=********* diff --git a/clearing-parent/dictionary/pom.xml b/clearing-parent/dictionary/pom.xml index a06164a39..250ca3da7 100644 --- a/clearing-parent/dictionary/pom.xml +++ b/clearing-parent/dictionary/pom.xml @@ -8,12 +8,12 @@ Clearing dictionary Clearing dictionary jar - SPCEX-3.11.0.0 + SPCEX-3.12.7 clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 diff --git a/clearing-parent/extdb-importer/pom.xml b/clearing-parent/extdb-importer/pom.xml index 5d8fa3431..ddb282898 100644 --- a/clearing-parent/extdb-importer/pom.xml +++ b/clearing-parent/extdb-importer/pom.xml @@ -4,12 +4,12 @@ ru.spcex.clearing clearing-parent - SPCEX-3.11.0.0 + SPCEX-3.12.7 extdb-importer extdb-importer Extdb importer module. Аналог trade-importer. - SPCEX-3.11.0.0 + SPCEX-3.12.7 jar diff --git a/clearing-parent/gateway-api/pom.xml b/clearing-parent/gateway-api/pom.xml index e8fae9d63..bab9c53d7 100644 --- a/clearing-parent/gateway-api/pom.xml +++ b/clearing-parent/gateway-api/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 4.0.0 @@ -80,6 +80,10 @@ test-clearing test + + jakarta.validation + jakarta.validation-api + diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/config/deserializers/LocalDateTimeDeserializer.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/config/deserializers/LocalDateTimeDeserializer.java new file mode 100644 index 000000000..38bc9f6aa --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/config/deserializers/LocalDateTimeDeserializer.java @@ -0,0 +1,22 @@ +package ru.spcex.clearing.gatewayapi.config.deserializers; + + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +public class LocalDateTimeDeserializer extends JsonDeserializer { + private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss:SSS"); + + @Override + public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + String date = p.getText(); + if (date == null || date.trim().length() == 0) { + return null; + } + return LocalDateTime.parse(date, formatter); + } +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/GatewayController.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/GatewayController.java index 47bfb56d9..00a253ba4 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/GatewayController.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/GatewayController.java @@ -3,13 +3,23 @@ package ru.spcex.clearing.gatewayapi.controller; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import java.time.Instant; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ExecutorService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.ExceptionHandler; +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 org.springframework.web.bind.annotation.ResponseStatus; import ru.spcex.clearing.gatewayapi.controller.inbound.request.CommonRequest; import ru.spcex.clearing.gatewayapi.controller.inbound.request.company.CompaniesRequest; import ru.spcex.clearing.gatewayapi.controller.inbound.request.limit.LimitRequest; @@ -17,22 +27,19 @@ import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.curr.mkr. import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.FondListingsRequest; import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.mkr.MMListingsRequest; import ru.spcex.clearing.gatewayapi.controller.inbound.request.operations.OperationsRequest; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.tkr.request.TkrRequest; import ru.spcex.clearing.gatewayapi.controller.inbound.response.CommonResponse; import ru.spcex.clearing.gatewayapi.exception.GatewayException; import ru.spcex.clearing.gatewayapi.service.NotificationService; import ru.spcex.clearing.gatewayapi.service.OperationService; +import ru.spcex.clearing.gatewayapi.service.TkrService; import ru.spcex.clearing.gatewayapi.service.processor.CompanyProcessor; import ru.spcex.clearing.gatewayapi.service.processor.ListingCurrProcessor; import ru.spcex.clearing.gatewayapi.service.processor.ListingFondProcessor; import ru.spcex.clearing.gatewayapi.service.processor.ListingMMProcessor; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; - -import java.time.Instant; -import java.util.Arrays; -import java.util.List; -import java.util.UUID; -import java.util.concurrent.ExecutorService; +import ru.spcex.platform.utils.log.ExceptionUtils; @Controller @RequestMapping("/") @@ -47,6 +54,7 @@ public class GatewayController { private final ExecutorService executor; private final OperationService operationService; private final NotificationService notificationService; + private final TkrService tkrService; private List validTypes = Arrays.asList("DAY_START", "ON_DEMAND"); @@ -57,7 +65,8 @@ public class GatewayController { ListingCurrProcessor listingCurrProcessor, @Qualifier("gatewayExecutor") ExecutorService executor, OperationService operationService, - NotificationService notificationService) { + NotificationService notificationService, + TkrService tkrService) { this.messageResolver = messageResolver; this.companiesProcessor = companiesProcessor; this.listingFondProcessor = listingFondProcessor; @@ -66,6 +75,7 @@ public class GatewayController { this.executor = executor; this.operationService = operationService; this.notificationService = notificationService; + this.tkrService = tkrService; } @@ -83,7 +93,13 @@ public class GatewayController { @ResponseBody public CommonResponse listingsFond(@RequestBody FondListingsRequest request) { // request.validate(validTypes, List.of(Section.FOND)); - executor.submit(() -> listingFondProcessor.process(request)); + executor.submit(() -> { + try { + listingFondProcessor.process(request); + } catch (Throwable e) { + log.error("At process /listing_fond has error: {}", ExceptionUtils.getStackTrace(e)); + } + }); return createResponse(request, true); } @@ -102,7 +118,13 @@ public class GatewayController { @ResponseBody public CommonResponse listingsMM(@RequestBody MMListingsRequest request) { // request.validate(validTypes, List.of(Section.MKR)); - executor.submit(() -> listingMMProcessor.process(request)); + executor.submit(() -> { + try { + listingMMProcessor.process(request); + } catch (Throwable e) { + log.error("At process /listing_mm has error: {}", ExceptionUtils.getStackTrace(e)); + } + }); return createResponse(request, true); } @@ -121,7 +143,13 @@ public class GatewayController { @ResponseBody public CommonResponse listingsCurr(@RequestBody CurrListingsRequest request) { // request.validate(validTypes, List.of(Section.CURR)); - executor.submit(() -> listingCurrProcessor.process(request)); + executor.submit(() -> { + try { + listingCurrProcessor.process(request); + } catch (Throwable e) { + log.error("At process /listing_curr has error: {}", ExceptionUtils.getStackTrace(e)); + } + }); return createResponse(request, true); } @@ -140,7 +168,13 @@ public class GatewayController { @ResponseBody public CommonResponse companies(@RequestBody CompaniesRequest request) { // request.validate(validTypes, Collections.emptyList()); - executor.submit(() -> companiesProcessor.process(request)); + executor.submit(() -> { + try { + companiesProcessor.process(request); + } catch (Throwable e) { + log.error("At process /companies has error: {}", ExceptionUtils.getStackTrace(e)); + } + }); return createResponse(request, true); } @@ -158,7 +192,13 @@ public class GatewayController { @ResponseBody public CommonResponse limits(@RequestBody LimitRequest request) { log.debug("Received message: {}", request); - executor.submit(() -> notificationService.sendLimitNotification(request)); + executor.submit(() -> { + try { + notificationService.sendLimitNotification(request); + } catch (Throwable e) { + log.error("At process /limits has error: {}", ExceptionUtils.getStackTrace(e)); + } + }); return createCommonResponse(request.getId()); } @@ -176,8 +216,36 @@ public class GatewayController { public CommonResponse operations(@RequestBody OperationsRequest request) { log.debug("Received message: {}", request); executor.submit(() -> { - operationService.checkAssetsAndSendMessage(request); - notificationService.updateGatewayResultInMap(request); + try { + operationService.checkAssetsAndSendMessage(request); + notificationService.sendToJournal(request); + } catch (Throwable e) { + log.error("At process /operations has error: {}", ExceptionUtils.getStackTrace(e)); + } + }); + return createCommonResponse(request.getId()); + } + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK", response = CommonResponse.class), + @ApiResponse(code = 400, message = "Ошибка валидации", response = CommonResponse.class) + }) + @RequestMapping( + path = "/member_request_tkr", + method = RequestMethod.POST, + consumes = MediaType.APPLICATION_JSON_VALUE, + produces = MediaType.APPLICATION_JSON_VALUE + ) + @ResponseBody + public CommonResponse requestTkr(@RequestBody TkrRequest request) { + log.debug("Received message: {}", request); + executor.submit(() -> { + try { + tkrService.processedTkrRequest(request); + notificationService.sendToJournal(request); + } catch (Throwable e) { + log.error("At process /member_request_tkr has error: {}", ExceptionUtils.getStackTrace(e)); + } }); return createCommonResponse(request.getId()); } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/WithId.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/WithId.java new file mode 100644 index 000000000..20b815104 --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/WithId.java @@ -0,0 +1,7 @@ +package ru.spcex.clearing.gatewayapi.controller.inbound.request; + +import java.util.UUID; + +public interface WithId { + UUID getId(); +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/WithResult.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/WithResult.java new file mode 100644 index 000000000..15cb83155 --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/WithResult.java @@ -0,0 +1,5 @@ +package ru.spcex.clearing.gatewayapi.controller.inbound.request; + +public interface WithResult { + Boolean getResult(); +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/limit/LimitRequest.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/limit/LimitRequest.java index 12af846e5..330a689bc 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/limit/LimitRequest.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/limit/LimitRequest.java @@ -1,10 +1,11 @@ package ru.spcex.clearing.gatewayapi.controller.inbound.request.limit; -import com.fasterxml.jackson.annotation.JsonProperty; - import java.util.UUID; +import com.fasterxml.jackson.annotation.JsonProperty; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.WithId; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.WithResult; -public class LimitRequest { +public class LimitRequest implements WithId, WithResult { @JsonProperty("result") private Boolean result; @JsonProperty("description") @@ -16,6 +17,7 @@ public class LimitRequest { @JsonProperty("error_file") private String errorFile; + @Override public Boolean getResult() { return result; } @@ -32,6 +34,7 @@ public class LimitRequest { this.description = description; } + @Override public UUID getId() { return id; } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/operations/OperationsRequest.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/operations/OperationsRequest.java index 41a9a3d24..34eb6f62e 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/operations/OperationsRequest.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/operations/OperationsRequest.java @@ -1,10 +1,11 @@ package ru.spcex.clearing.gatewayapi.controller.inbound.request.operations; -import com.fasterxml.jackson.annotation.JsonProperty; - import java.util.UUID; +import com.fasterxml.jackson.annotation.JsonProperty; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.WithId; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.WithResult; -public class OperationsRequest { +public class OperationsRequest implements WithId, WithResult { @JsonProperty("id") private UUID id; @JsonProperty("result") @@ -12,6 +13,7 @@ public class OperationsRequest { @JsonProperty("description") private String description; + @Override public UUID getId() { return id; } @@ -20,6 +22,7 @@ public class OperationsRequest { this.id = id; } + @Override public Boolean getResult() { return result; } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/request/InfoAccount.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/request/InfoAccount.java new file mode 100644 index 000000000..02d9a6c05 --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/request/InfoAccount.java @@ -0,0 +1,87 @@ +package ru.spcex.clearing.gatewayapi.controller.inbound.request.tkr.request; + +import java.util.List; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class InfoAccount { + @JsonProperty("type_operation_client") + private String typeOperationClient; + @JsonProperty("company_id") + private String companyId; + @JsonProperty("trading_code") + private Long tradingCode; + @JsonProperty("client_code") + private String clientCode; + @JsonProperty("enabled") + private Boolean enabled; + @JsonProperty("tkr_code") + private String tkrCode; + @JsonProperty("depo_account") + private String depoAccount; + @JsonProperty("money_account") + private List moneyAccounts; + + public String getTypeOperationClient() { + return typeOperationClient; + } + + public void setTypeOperationClient(String typeOperationClient) { + this.typeOperationClient = typeOperationClient; + } + + public String getCompanyId() { + return companyId; + } + + public void setCompanyId(String companyId) { + this.companyId = companyId; + } + + public Long getTradingCode() { + return tradingCode; + } + + public void setTradingCode(Long tradingCode) { + this.tradingCode = tradingCode; + } + + public String getClientCode() { + return clientCode; + } + + public void setClientCode(String clientCode) { + this.clientCode = clientCode; + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public String getTkrCode() { + return tkrCode; + } + + public void setTkrCode(String tkrCode) { + this.tkrCode = tkrCode; + } + + public String getDepoAccount() { + return depoAccount; + } + + public void setDepoAccount(String depoAccount) { + this.depoAccount = depoAccount; + } + + public List getMoneyAccounts() { + return moneyAccounts; + } + + public void setMoneyAccounts(List moneyAccounts) { + this.moneyAccounts = moneyAccounts; + } +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/request/MoneyAccount.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/request/MoneyAccount.java new file mode 100644 index 000000000..e0b916aa7 --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/request/MoneyAccount.java @@ -0,0 +1,46 @@ +package ru.spcex.clearing.gatewayapi.controller.inbound.request.tkr.request; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class MoneyAccount { + @JsonProperty("curr_code") + private String currCode; + @JsonProperty("account") + private String account; + @JsonProperty("eks_account") + private String eksAccount; + @JsonProperty("status") + private String status; + + public String getCurrCode() { + return currCode; + } + + public void setCurrCode(String currCode) { + this.currCode = currCode; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getEksAccount() { + return eksAccount; + } + + public void setEksAccount(String eksAccount) { + this.eksAccount = eksAccount; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/request/TkrError.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/request/TkrError.java new file mode 100644 index 000000000..aa2b1a303 --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/request/TkrError.java @@ -0,0 +1,46 @@ +package ru.spcex.clearing.gatewayapi.controller.inbound.request.tkr.request; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class TkrError { + @JsonProperty("trading_code") + private Integer tradingCode; + @JsonProperty("client_code") + private String clientCode; + @JsonProperty("tkr_code") + private String tkrCode; + @JsonProperty("error_message") + private String errorMessage; + + public Integer getTradingCode() { + return tradingCode; + } + + public void setTradingCode(Integer tradingCode) { + this.tradingCode = tradingCode; + } + + public String getClientCode() { + return clientCode; + } + + public void setClientCode(String clientCode) { + this.clientCode = clientCode; + } + + public String getTkrCode() { + return tkrCode; + } + + public void setTkrCode(String tkrCode) { + this.tkrCode = tkrCode; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/request/TkrRequest.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/request/TkrRequest.java new file mode 100644 index 000000000..af5425a37 --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/request/TkrRequest.java @@ -0,0 +1,77 @@ +package ru.spcex.clearing.gatewayapi.controller.inbound.request.tkr.request; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import ru.spcex.clearing.gatewayapi.config.deserializers.LocalDateTimeDeserializer; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.WithId; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.WithResult; + +public class TkrRequest implements WithId, WithResult { + @JsonProperty("id") + private UUID id; + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + @JsonProperty("datetime") + private LocalDateTime datetime; + @JsonProperty("type") + private String type; + @JsonProperty("sent_info_accounts") + private List infoAccount; + @JsonProperty("errors") + private List errors; + @JsonProperty("result") + private Boolean result; + + @Override + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public LocalDateTime getDatetime() { + return datetime; + } + + public void setDatetime(LocalDateTime datetime) { + this.datetime = datetime; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List getInfoAccount() { + return infoAccount; + } + + public void setInfoAccount(List infoAccount) { + this.infoAccount = infoAccount; + } + + public List getErrors() { + + return errors; + } + + public void setErrors(List errors) { + this.errors = errors; + } + + @Override + public Boolean getResult() { + return result; + } + + public void setResult(Boolean result) { + this.result = result; + } +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/response/MoneyAccountResponse.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/response/MoneyAccountResponse.java new file mode 100644 index 000000000..7e2d7e041 --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/response/MoneyAccountResponse.java @@ -0,0 +1,10 @@ +package ru.spcex.clearing.gatewayapi.controller.inbound.request.tkr.response; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class MoneyAccountResponse { + @JsonProperty("curr_code") + private String currCode; + @JsonProperty("account") + private String account; +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/response/TkrElemResponse.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/response/TkrElemResponse.java new file mode 100644 index 000000000..e92b1a6f8 --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/inbound/request/tkr/response/TkrElemResponse.java @@ -0,0 +1,23 @@ +package ru.spcex.clearing.gatewayapi.controller.inbound.request.tkr.response; + +import java.util.List; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class TkrElemResponse { + @JsonProperty("company_id") + private String companyId; + @JsonProperty("trading_code") + private Long tradingCode; + @JsonProperty("client_code") + private String clientCode; + @JsonProperty("tkr_code") + private String tkrCode; + @JsonProperty("tkr_type") + private String tkrType; + @JsonProperty("account_type_name") + private String accountTypeName; + @JsonProperty("depo_account") + private String depoAccount; + @JsonProperty("money_account") + private List moneyAccounts; +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/outbound/response/ErrorResponse.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/outbound/response/ErrorResponse.java index ab67bbe2a..589f5ce4b 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/outbound/response/ErrorResponse.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/controller/outbound/response/ErrorResponse.java @@ -1,14 +1,14 @@ package ru.spcex.clearing.gatewayapi.controller.outbound.response; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; - import java.util.HashMap; import java.util.Map; import java.util.UUID; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.WithId; -public class ErrorResponse { +public class ErrorResponse implements WithId { @JsonProperty("id") private UUID id; @JsonProperty("message") @@ -22,6 +22,7 @@ public class ErrorResponse { unknownProperties.put(key, value); } + @Override public UUID getId() { return id; } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/enums/OutboundRequestType.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/enums/OutboundRequestType.java index 92cbed4f9..89208ce66 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/enums/OutboundRequestType.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/enums/OutboundRequestType.java @@ -11,6 +11,7 @@ public enum OutboundRequestType implements IEnumKey { PFX65("PFX65"), REPORT_KS_TMP("REPORT_KS_TMP"), REPORT_KS_FINAL("REPORT_KS_FINAL"), + MEMBER_RESPONSE_TKR("MEMBER_RESPONSE_TKR"), ; private final String key; diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/enums/TypeOperations.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/enums/TypeOperations.java new file mode 100644 index 000000000..45f0c4f3a --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/enums/TypeOperations.java @@ -0,0 +1,25 @@ +package ru.spcex.clearing.gatewayapi.enums; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum TypeOperations implements IEnumKey{ + CHECK("CHECK"), + ADD("ADD"), + UPDATE("UPD"); + + private final String key; + + TypeOperations(String key) { + this.key = key; + } + + @Override + public String getKey() { + return this.key; + } + + @Override + public boolean equalsByKey(String key) { + return IEnumKey.super.equalsByKey(key); + } +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/GatewayService.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/GatewayService.java index 87389b7e5..9234f6239 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/GatewayService.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/GatewayService.java @@ -1,5 +1,14 @@ package ru.spcex.clearing.gatewayapi.service; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.regex.Pattern; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; @@ -7,7 +16,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.http.*; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import ru.clearing.classes.statics.data.register.GatewayResult; @@ -27,6 +40,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.clearing.AssetOperationRe import ru.spcex.clearing.platform.messaging.domain.cud.gateway.GatewayTaskRequest; import ru.spcex.clearing.platform.messaging.domain.cud.gateway.ReportPart; import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SendReportRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SendTkrRequest; import ru.spcex.clearing.platform.messaging.domain.cud.utilities.LimExportedRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; @@ -39,10 +53,6 @@ import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.IEnumKey; -import java.math.BigDecimal; -import java.util.*; -import java.util.regex.Pattern; - @Service public class GatewayService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -75,20 +85,23 @@ public class GatewayService extends QueueConsumer implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { callback(GatewayTaskRequest.class) - .setConsumer(this::requestOnDemandCompany) - .forDestination(Task.loadParty_LOCM.topic(), callbacks::put); + .setConsumer(this::requestOnDemandCompany) + .forDestination(Task.loadParty_LOCM.topic(), callbacks::put); callback(GatewayTaskRequest.class) - .setConsumer(this::requestOnDemandSecurity) - .forDestination(Task.loadIssue_LOSC.topic(), callbacks::put); + .setConsumer(this::requestOnDemandSecurity) + .forDestination(Task.loadIssue_LOSC.topic(), callbacks::put); callback(LimExportedRequest.class) - .setConsumer(this::requestOnLimit) - .forDestination(Consts.LIM_EXPORTED, callbacks::put); + .setConsumer(this::requestOnLimit) + .forDestination(Consts.LIM_EXPORTED, callbacks::put); callback(AssetOperationListRequest.class) - .setConsumer(this::requestOnAsset) - .forDestination(Consts.ASSET_OPERATION, callbacks::put); + .setConsumer(this::requestOnAsset) + .forDestination(Consts.ASSET_OPERATION, callbacks::put); callback(SendReportRequest.class) - .setConsumer(this::requestOnReport) - .forDestination(Consts.REPORTS_TO_GATEWAY, callbacks::put); + .setConsumer(this::requestOnReport) + .forDestination(Consts.REPORTS_TO_GATEWAY, callbacks::put); + callback(SendTkrRequest.class) + .setConsumer(this::requestOnTkr) + .forDestination(Consts.ACCOUNTS_TO_GATEWAY, callbacks::put); init(); } @@ -103,8 +116,8 @@ public class GatewayService extends QueueConsumer implements InitializingBean { String url = formingInboundUrl(inboundServerSettings.getPathLOCM()); OutboundRequest outboundFondRequest = OutboundRequestBuilder.builder() - .type(OutboundRequestType.MEMBER_ON_DEMAND.getKey()) - .build(); + .type(OutboundRequestType.MEMBER_ON_DEMAND.getKey()) + .build(); HttpEntity request = makeDefaultRequest(outboundFondRequest); outboundRequestByUuid.put(outboundFondRequest.getId(), outboundFondRequest); @@ -122,10 +135,10 @@ public class GatewayService extends QueueConsumer implements InitializingBean { Map content = Map.of("file", exportedRequest.getLimFileName()); OutboundRequest outboundFondRequest = OutboundRequestBuilder.builder() - .section(exportedRequest.getSection()) - .type(OutboundRequestType.FILL_LIMITS.getKey()) - .content(content) - .build(); + .section(exportedRequest.getSection()) + .type(OutboundRequestType.FILL_LIMITS.getKey()) + .content(content) + .build(); HttpEntity request = makeDefaultRequest(outboundFondRequest); outboundRequestByUuid.put(outboundFondRequest.getId(), outboundFondRequest); @@ -148,19 +161,19 @@ public class GatewayService extends QueueConsumer implements InitializingBean { String url = formingInboundUrl(inboundServerSettings.getPathLOCM()); OutboundRequest outboundFondRequest = OutboundRequestBuilder.builder() - .section(Section.FOND.getKey()) - .type(OutboundRequestType.ON_DEMAND.getKey()) - .build(); + .section(Section.FOND.getKey()) + .type(OutboundRequestType.ON_DEMAND.getKey()) + .build(); OutboundRequest outboundMkrRequest = OutboundRequestBuilder.builder() - .section(Section.MKR.getKey()) - .type(OutboundRequestType.ON_DEMAND.getKey()) - .build(); + .section(Section.MKR.getKey()) + .type(OutboundRequestType.ON_DEMAND.getKey()) + .build(); OutboundRequest outboundCurrRequest = OutboundRequestBuilder.builder() - .section(Section.CURR.getKey()) - .type(OutboundRequestType.ON_DEMAND.getKey()) - .build(); + .section(Section.CURR.getKey()) + .type(OutboundRequestType.ON_DEMAND.getKey()) + .build(); HttpEntity requestFond = makeDefaultRequest(outboundFondRequest); HttpEntity requestMKR = makeDefaultRequest(outboundMkrRequest); @@ -206,9 +219,9 @@ public class GatewayService extends QueueConsumer implements InitializingBean { } OutboundRequest outboundRequest = OutboundRequestBuilder.builder() - .section(assetOperation.getAmount() != null ? Section.MKR.getKey() : Section.FOND.getKey()) - .type(OutboundRequestType.ASSET_OPERATION.getKey()) - .content(content).build(); + .section(assetOperation.getAmount() != null ? Section.MKR.getKey() : Section.FOND.getKey()) + .type(OutboundRequestType.ASSET_OPERATION.getKey()) + .content(content).build(); gatewayBuilder.outboundRequest(outboundRequest); String url = formingInboundUrl(inboundServerSettings.getPathLOCM()); @@ -245,9 +258,9 @@ public class GatewayService extends QueueConsumer implements InitializingBean { Map content = new HashMap<>(); reportRequest.getReports().forEach(reportPart -> makeContentByReportRequest(content, reportPart)); OutboundRequest outboundRequest = OutboundRequestBuilder.builder() - .section(Section.FOND.getKey()) - .type(reportType.getKey()) - .content(content).build(); + .section(Section.FOND.getKey()) + .type(reportType.getKey()) + .content(content).build(); String url = formingInboundUrl(inboundServerSettings.getPathLOCM()); HttpEntity r = makeDefaultRequest(outboundRequest); @@ -258,6 +271,30 @@ public class GatewayService extends QueueConsumer implements InitializingBean { } } + public void requestOnTkr(BaseRequest request) { + SendTkrRequest reportRequest = request.getRequestPayload(); + Map content = new HashMap<>(); + content.put("tkr_list", reportRequest.getTkrs()); + OutboundRequest outboundRequest = OutboundRequestBuilder.builder() + .type(OutboundRequestType.MEMBER_RESPONSE_TKR.getKey()) + .content(content) + .build(); + if (reportRequest.getRequestId() != null) { + outboundRequest.setId(reportRequest.getRequestId()); + } + GatewayResult gatewayResult = GatewayResultBuilder.builder() + .outboundRequest(outboundRequest) + .build(); + gatewayResultImdg.insert(gatewayResult); + String url = formingInboundUrl(inboundServerSettings.getPathLOCM()); + HttpEntity r = makeDefaultRequest(outboundRequest); + ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, r, SuccessResponse.class); + SuccessResponse bodyResponse = response.getBody(); + if (bodyResponse != null) { + log.debug("Response from service: {}", bodyResponse); + } + } + protected void makeContentByReportRequest(Map content, ReportPart reportPart) { ReportKeys reportKey = IEnumKey.getEnumByKey(ReportKeys.class, reportPart.getReportType()); if (reportKey == null) { @@ -289,10 +326,10 @@ public class GatewayService extends QueueConsumer implements InitializingBean { public String formingInboundUrl(String path) { return "%s://%s:%s/%s".formatted( - inboundServerSettings.getEnableSsl() ? "https" : "http", - inboundServerSettings.getHost(), - inboundServerSettings.getPort(), - path + inboundServerSettings.getEnableSsl() ? "https" : "http", + inboundServerSettings.getHost(), + inboundServerSettings.getPort(), + path ); } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/NotificationService.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/NotificationService.java index 157e85c4b..e02f84168 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/NotificationService.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/NotificationService.java @@ -1,11 +1,16 @@ package ru.spcex.clearing.gatewayapi.service; +import java.time.Instant; +import java.util.List; +import java.util.Map; +import java.util.UUID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.register.GatewayResult; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.WithId; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.WithResult; import ru.spcex.clearing.gatewayapi.controller.inbound.request.limit.LimitRequest; -import ru.spcex.clearing.gatewayapi.controller.inbound.request.operations.OperationsRequest; import ru.spcex.clearing.gatewayapi.controller.outbound.request.OutboundRequest; import ru.spcex.clearing.gatewayapi.controller.outbound.response.ErrorResponse; import ru.spcex.clearing.gatewayapi.enums.OutboundRequestType; @@ -20,11 +25,6 @@ import ru.spcex.platform.enumeration.ResultStatuses; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import java.time.Instant; -import java.util.List; -import java.util.Map; -import java.util.UUID; - @Service public class NotificationService { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -50,9 +50,9 @@ public class NotificationService { return; } log.info("Receive request: uuid = {}, file = {} with result = {} and sending section = {}.", - request.getId(), request.getLogFile(), request.getResult(), outboundReq.getSection()); + request.getId(), request.getLogFile(), request.getResult(), outboundReq.getSection()); - updateGatewayResultInMap(request); + sendToJournal(request); newRequest.setObjectType(ObjectType.rgst.getKey()); newRequest.setComment(request.getDescription()); @@ -67,63 +67,12 @@ public class NotificationService { kafkaSender.sendRequestToQueue(Consts.NOTIFICATION_NEW, newRequest); } - public void updateGatewayResultInMap(LimitRequest request) { - if (request.getId() == null || request.getResult() == null) { - log.warn("GatewayResult not found because LimitRequest not valid: {}", LogFormatter.toString(request)); - return; - } - GatewayResult gatewayResult = gatewayResultImdg.getFirstObjectByFieldValues(Map.of("requestId", request.getId().toString())); - if (gatewayResult == null) { - log.warn("GatewayResult by requestId = {} not found in map", request.getId().toString()); - return; - } - gatewayResult.setUpdated(Instant.now()); - gatewayResult.setGatewayResultStatus(request.getResult() ? ResultStatuses.success.getKey() : ResultStatuses.notSuccess.getKey()); - gatewayResult.setResult(LogFormatter.toString(request)); - gatewayResultImdg.update(gatewayResult); - log.info("Updated gatewayResult: {} in map", LogFormatter.toString(gatewayResult)); - } - - public void updateGatewayResultInMap(OperationsRequest request) { - if (request.getId() == null || request.getResult() == null) { - log.warn("GatewayResult not found because OperationsRequest not valid: {}", LogFormatter.toString(request)); - return; - } - GatewayResult gatewayResult = gatewayResultImdg.getFirstObjectByFieldValues(Map.of("requestId", request.getId().toString())); - if (gatewayResult == null) { - log.warn("GatewayResult by requestId = {} not found in map", request.getId().toString()); - return; - } - gatewayResult.setUpdated(Instant.now()); - gatewayResult.setGatewayResultStatus(request.getResult() ? ResultStatuses.success.getKey() : ResultStatuses.notSuccess.getKey()); - gatewayResult.setResult(LogFormatter.toString(request)); - gatewayResultImdg.update(gatewayResult); - log.info("Updated gatewayResult: {} in map", LogFormatter.toString(gatewayResult)); - } - - public void updateGatewayResultInMap(ErrorResponse response) { - if (response.getId() == null) { - log.warn("GatewayResult not found because OperationsRequest not valid: {}", LogFormatter.toString(response)); - return; - } - GatewayResult gatewayResult = gatewayResultImdg.getFirstObjectByFieldValues(Map.of("requestId", response.getId().toString())); - if (gatewayResult == null) { - log.warn("GatewayResult by requestId = {} not found in map", response.getId().toString()); - return; - } - gatewayResult.setUpdated(Instant.now()); - gatewayResult.setGatewayResultStatus(ResultStatuses.notSuccess.getKey()); - gatewayResult.setResult(LogFormatter.toString(response)); - gatewayResultImdg.update(gatewayResult); - log.info("Updated gatewayResult: {} in map", LogFormatter.toString(gatewayResult)); - } - public void sendErrorNotification(ErrorResponse response, OutboundRequest request) { NotificationNewRequest newRequest = new NotificationNewRequest(); - updateGatewayResultInMap(response); + sendErrorToJournal(response); if (OutboundRequestType.FILL_LIMITS.equalsByKey(request.getType()) && request.getContent() != null && request.getContent().size() > 0) log.info("Receive ErrorResponse: uuid = {}, file = {}, sending type = {} and section = {}.", - response.getId(), request.getContent().get("file"), request.getType(), request.getSection()); + response.getId(), request.getContent().get("file"), request.getType(), request.getSection()); else log.info("Receive ErrorResponse: uuid = {}, sending type = {} and section = {}.", response.getId(), request.getType(), request.getSection()); newRequest.setObjectType(ObjectType.rgst.getKey()); @@ -133,6 +82,40 @@ public class NotificationService { kafkaSender.sendRequestToQueue(Consts.NOTIFICATION_NEW, newRequest); } + public void sendToJournal(T request) { + if (request.getResult() == null) { + log.warn("GatewayResult not found because LimitRequest not valid: {}", LogFormatter.toString(request)); + return; + } + updateResult(request, ResultStatuses.successOrNot(request.getResult())); + } + + public void sendErrorToJournal(ErrorResponse response) { + updateResult(response, ResultStatuses.notSuccess); + } + + private void updateResult(T request, ResultStatuses resultStatus) { + if (request.getId() == null) { + log.warn("Request without id: {}; skipping...", LogFormatter.toString(request)); + return; + } + GatewayResult gatewayResult = gatewayResultImdg.getFirstObjectByFieldValues(Map.of("requestId", request.getId().toString())); + if (gatewayResult == null) { + log.warn("GatewayResult by requestId = {} not found in map", request.getId().toString()); + return; + } + log.debug("Update gatewayResult.id={} by requestId={}", gatewayResult.getId(), request.getId()); + gatewayResult.setUpdated(Instant.now()); + gatewayResult.setGatewayResultStatus(resultStatus.getKey()); + String res = LogFormatter.toString(request); + if (res.length() > 1000){ + res = res.substring(0, 1000); + } + gatewayResult.setResult(res); + gatewayResultImdg.update(gatewayResult); + log.info("Updated gatewayResult: {} in map", LogFormatter.toString(gatewayResult)); + } + public boolean canProcess(String type) { return supportedTypes.contains(type); } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/TkrService.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/TkrService.java new file mode 100644 index 000000000..2aad05490 --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/TkrService.java @@ -0,0 +1,68 @@ +package ru.spcex.clearing.gatewayapi.service; + +import java.util.List; +import java.util.Objects; +import org.springframework.stereotype.Service; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.tkr.request.TkrRequest; +import ru.spcex.clearing.gatewayapi.enums.TypeOperations; +import ru.spcex.clearing.gatewayapi.service.adapter.TkrAdapter; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount; +import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccountsGatewayRequest; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; + +@Service +public class TkrService { + private final KafkaSender kafkaSender; + private final TkrAdapter tkrAdapter; + + public TkrService(KafkaSender kafkaSender, + TkrAdapter tkrAdapter) { + this.kafkaSender = kafkaSender; + this.tkrAdapter = tkrAdapter; + } + + public void processedTkrRequest(TkrRequest tkrRequest) { + if (tkrRequest.getErrors() != null && !tkrRequest.getErrors().isEmpty()) { + return; + } + List tkrAccountsForCheck = tkrRequest.getInfoAccount() + .stream().filter(infoAccount -> TypeOperations.CHECK.equalsByKey(infoAccount.getTypeOperationClient())) + .map(tkrAdapter::toTkrResponse) + .filter(Objects::nonNull) + .toList(); + + List tkrAccountsForNew = tkrRequest.getInfoAccount() + .stream().filter(infoAccount -> TypeOperations.ADD.equalsByKey(infoAccount.getTypeOperationClient())) + .map(tkrAdapter::toTkrResponse) + .filter(Objects::nonNull) + .toList(); + + List tkrAccountsForUpdate = tkrRequest.getInfoAccount() + .stream().filter(infoAccount -> TypeOperations.UPDATE.equalsByKey(infoAccount.getTypeOperationClient())) + .map(tkrAdapter::toTkrResponse) + .filter(Objects::nonNull) + .toList(); + + if (!tkrAccountsForCheck.isEmpty()) { + TkrAccountsGatewayRequest tkrAccountsRequest = new TkrAccountsGatewayRequest(); + tkrAccountsRequest.setRequestId(tkrRequest.getId()); + tkrAccountsRequest.setAccounts(tkrAccountsForCheck); + kafkaSender.sendRequestToQueue(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_CHECK, tkrAccountsRequest); + } + + if (!tkrAccountsForNew.isEmpty()) { + TkrAccountsGatewayRequest tkrAccountsRequest = new TkrAccountsGatewayRequest(); + tkrAccountsRequest.setRequestId(tkrRequest.getId()); + tkrAccountsRequest.setAccounts(tkrAccountsForNew); + kafkaSender.sendRequestToQueue(Consts.DESTINATION_CLIENT_CODE_NEW_FROM_GATEWAY, tkrAccountsRequest); + } + + if (!tkrAccountsForUpdate.isEmpty()) { + TkrAccountsGatewayRequest tkrAccountsRequest = new TkrAccountsGatewayRequest(); + tkrAccountsRequest.setRequestId(tkrRequest.getId()); + tkrAccountsRequest.setAccounts(tkrAccountsForUpdate); + kafkaSender.sendRequestToQueue(Consts.DESTINATION_CLIENT_CODE_UPDATE_FROM_GATEWAY, tkrAccountsRequest); + } + } +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/TkrAdapter.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/TkrAdapter.java new file mode 100644 index 000000000..ff7f04e9a --- /dev/null +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/adapter/TkrAdapter.java @@ -0,0 +1,59 @@ +package ru.spcex.clearing.gatewayapi.service.adapter; + +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.tkr.request.InfoAccount; +import ru.spcex.clearing.gatewayapi.controller.inbound.request.tkr.request.MoneyAccount; +import ru.spcex.clearing.gatewayapi.enums.TypeOperations; +import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest; + +@Service +public class TkrAdapter { + private final Logger log = LoggerFactory.getLogger(getClass()); + + public TkrAccount toTkrResponse(InfoAccount infoAccount) { + TkrAccount tkrResponse = new TkrAccount(); + tkrResponse.setCompanyId(infoAccount.getCompanyId()); + tkrResponse.setTradingCode(infoAccount.getTradingCode()); + tkrResponse.setClientCode(infoAccount.getClientCode()); + tkrResponse.setEnabled(infoAccount.getEnabled()); + if (TypeOperations.CHECK.equalsByKey(infoAccount.getTypeOperationClient()) && + !StringUtils.hasText(infoAccount.getTkrCode())) { + log.warn("For check action trk_code is required, skip this account.client_code: {}", + infoAccount.getClientCode()); + return null; + } + if (TypeOperations.ADD.equalsByKey(infoAccount.getTypeOperationClient()) && + !StringUtils.hasText(infoAccount.getClientCode()) && StringUtils.hasText(infoAccount.getTkrCode())) { + log.warn("For add action client_code is required and tkr_code should be empty, skip this account.company_id: {}", + infoAccount.getCompanyId()); + return null; + } + if (TypeOperations.UPDATE.equalsByKey(infoAccount.getTypeOperationClient()) && + !StringUtils.hasText(infoAccount.getClientCode()) && !StringUtils.hasText(infoAccount.getTkrCode())) { + log.warn("For update action client_code and tkr_code is required, skip this account.company_id: {}", + infoAccount.getCompanyId()); + return null; + } + tkrResponse.setTkrCode(infoAccount.getTkrCode()); + tkrResponse.setDepoAccount(infoAccount.getDepoAccount()); + + if (infoAccount.getMoneyAccounts() != null) { + List moneyAccountMsgs = infoAccount.getMoneyAccounts().stream() + .map(this::toMoneyAccountMsg).toList(); + tkrResponse.setMoneyAccounts(moneyAccountMsgs); + } + return tkrResponse; + } + + private MoneyAccountMsgRequest toMoneyAccountMsg(MoneyAccount moneyAccount) { + MoneyAccountMsgRequest moneyAccountMsg = new MoneyAccountMsgRequest(); + moneyAccountMsg.setAccount(moneyAccount.getAccount()); + moneyAccountMsg.setCurrCode(moneyAccount.getCurrCode()); + return moneyAccountMsg; + } +} diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/builders/GatewayResultBuilder.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/builders/GatewayResultBuilder.java index 4f7a77464..fc48dd78a 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/builders/GatewayResultBuilder.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/builders/GatewayResultBuilder.java @@ -1,5 +1,6 @@ package ru.spcex.clearing.gatewayapi.service.builders; +import java.time.Instant; import ru.clearing.classes.statics.data.register.GatewayResult; import ru.spcex.clearing.gatewayapi.controller.outbound.request.OutboundRequest; import ru.spcex.clearing.gatewayapi.enums.OutboundRequestType; @@ -7,9 +8,6 @@ import ru.spcex.clearing.platform.messaging.domain.cud.clearing.AssetOperationRe import ru.spcex.clearing.platform.messaging.serialization.LogFormatter; import ru.spcex.platform.enumeration.InOutDirection; import ru.spcex.platform.enumeration.Section; - -import java.time.Instant; - import static ru.spcex.platform.utils.enumeration.IEnumKey.getEnumByKey; public class GatewayResultBuilder { @@ -39,6 +37,8 @@ public class GatewayResultBuilder { this.nameRequest = getNameReqByAsset(section, direction); else if (OutboundRequestType.FILL_LIMITS.equalsByKey(outboundRequest.getType())) this.nameRequest = getNameReqByLim(section); + else if (OutboundRequestType.MEMBER_RESPONSE_TKR.equalsByKey(outboundRequest.getType())) + this.nameRequest = "Выгрузка ТКР"; return this; } @@ -49,6 +49,9 @@ public class GatewayResultBuilder { outboundRequest.setUpdated(now); outboundRequest.setRequestId(requestId); outboundRequest.setNameRequest(nameRequest); + if (request.length() > 1000){ + request = request.substring(0, 1000); + } outboundRequest.setRequest(request); return outboundRequest; } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/CompanyProcessor.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/CompanyProcessor.java index c23c4aebd..4eb9a4cb4 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/CompanyProcessor.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/CompanyProcessor.java @@ -72,6 +72,7 @@ public class CompanyProcessor { log.error("{}", ExceptionUtils.getStackTrace(e)); } } + log.debug("process CompaniesRequest done"); } private List groupByCompanyId(List listToProcess, UUID companyId) { diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/ListingCurrProcessor.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/ListingCurrProcessor.java index d4d0b4b57..5d50064f2 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/ListingCurrProcessor.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/ListingCurrProcessor.java @@ -66,5 +66,6 @@ public class ListingCurrProcessor { log.error("currencyInstrumentId={}: {}", currencyInstrumentId, ExceptionUtils.getStackTrace(e)); } } + log.debug("process CurrListingsRequest done"); } } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/ListingFondProcessor.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/ListingFondProcessor.java index 73fac2122..a282b5020 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/ListingFondProcessor.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/ListingFondProcessor.java @@ -1,5 +1,7 @@ package ru.spcex.clearing.gatewayapi.service.processor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import ru.spcex.clearing.gatewayapi.controller.inbound.request.listing.fond.FondListingsRequest; import ru.spcex.clearing.gatewayapi.service.IssueCompanyService; @@ -7,6 +9,7 @@ import ru.spcex.clearing.gatewayapi.service.SecurityService; @Service public class ListingFondProcessor { + private final Logger log = LoggerFactory.getLogger(getClass()); private final IssueCompanyService issueCompanyProcessor; private final SecurityService securityService; @@ -18,5 +21,6 @@ public class ListingFondProcessor { public void process(FondListingsRequest request) { issueCompanyProcessor.sendRequest(request); securityService.sendRequest(request); + log.debug("process FondListingsRequest done"); } } diff --git a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/ListingMMProcessor.java b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/ListingMMProcessor.java index 91647e82d..c439134d0 100644 --- a/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/ListingMMProcessor.java +++ b/clearing-parent/gateway-api/src/main/java/ru/spcex/clearing/gatewayapi/service/processor/ListingMMProcessor.java @@ -58,5 +58,6 @@ public class ListingMMProcessor { log.error("{}", ExceptionUtils.getStackTrace(e)); } } + log.debug("process MMListingsRequest done"); } } diff --git a/clearing-parent/imdg-hist/pom.xml b/clearing-parent/imdg-hist/pom.xml index 22d48a734..39a06dddb 100644 --- a/clearing-parent/imdg-hist/pom.xml +++ b/clearing-parent/imdg-hist/pom.xml @@ -5,12 +5,12 @@ 4.0.0 imdg-hist jar - SPCEX-3.11.0.0 + SPCEX-3.12.7 clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 @@ -36,13 +36,13 @@ ru.spcex.clearing classes - SPCEX-3.11.0.0 + SPCEX-3.12.7 compile ru.spcex.clearing dictionary - SPCEX-3.11.0.0 + SPCEX-3.12.7 compile @@ -82,7 +82,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.11.0.0 + SPCEX-3.12.7 compile diff --git a/clearing-parent/imdg/pom.xml b/clearing-parent/imdg/pom.xml index 977632dba..47de68642 100644 --- a/clearing-parent/imdg/pom.xml +++ b/clearing-parent/imdg/pom.xml @@ -7,12 +7,12 @@ imdg Clearing in memory data grid jar - SPCEX-3.11.0.0 + SPCEX-3.12.7 clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 @@ -32,13 +32,13 @@ ru.spcex.clearing classes - SPCEX-3.11.0.0 + SPCEX-3.12.7 compile ru.spcex.clearing dictionary - SPCEX-3.11.0.0 + SPCEX-3.12.7 compile @@ -89,7 +89,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.11.0.0 + SPCEX-3.12.7 compile diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/BankAccountHistoryMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/BankAccountHistoryMapStore.java index b06c486d4..2463e5b25 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/BankAccountHistoryMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/BankAccountHistoryMapStore.java @@ -28,7 +28,7 @@ public class BankAccountHistoryMapStore extends TemplateEventMapStore { @@ -78,7 +77,7 @@ public class ExecutionCurrencyMapStore extends TemplateMapStore { public ExecutionDepositMapStore(JdbcTemplate jdbcTemplate) { @@ -96,7 +95,7 @@ public class ExecutionDepositMapStore extends TemplateMapStore TimeUtil.toDateFromInstant(object.getCreated()), TimeUtil.toDateFromInstant(object.getUpdated()), object.getExchangeExecutionId(), - TimeUtil.toDateFromInstant(object.getExchangeExecutionTime()), + TimeUtil.toTimestampFromInstant(object.getExchangeExecutionTime()), TimeUtil.toDateFromLocalDate(object.getTradingDate()), object.getTradingClearingRegistryId(), object.getPartyTradingClearingRegistry(), diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/ExecutionFondMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/ExecutionFondMapStore.java index c5b970f2a..177dbb3f7 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/ExecutionFondMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/ExecutionFondMapStore.java @@ -1,15 +1,14 @@ package ru.spcex.clearing.imdg.businessobject; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Component; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.clearing.classes.statics.data.execution.ExecutionFond; -import ru.spcex.clearing.imdg.base.TemplateMapStore; -import ru.spcex.platform.utils.time.TimeUtil; - import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.SQLException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; +import ru.clearing.classes.statics.data.execution.ExecutionFond; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.imdg.base.TemplateMapStore; +import ru.spcex.platform.utils.time.TimeUtil; @Component public class ExecutionFondMapStore extends TemplateMapStore { @@ -103,7 +102,7 @@ public class ExecutionFondMapStore extends TemplateMapStore { object.getSettlementAmount(), object.getLots(), object.getQuantity(), - TimeUtil.toDateFromInstant(object.getExchangeExecutionTime()), + TimeUtil.toTimestampFromInstant(object.getExchangeExecutionTime()), object.getDuration(), object.getTradingClearingRegistryId(), object.getPartyTradingClearingRegistry(), diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/RegistryMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/RegistryMapStore.java index a4842e0a5..e3a66679e 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/RegistryMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/RegistryMapStore.java @@ -68,7 +68,7 @@ public class RegistryMapStore extends TemplateMapStore { @Override public String[] getFields() { return new String[]{ - "COMPANY_ID", "TRADING_CODE", "CLEARING_CODE", "SHORT_NAME", "FULL_NAME", "ACCOUNT_ID", "ACCOUNT_TYPE", "ACCOUNT", "REGISTRY_DESIGNATION", "REGISTRY_INSTRUMENT_TYPE", "REGISTRY_CAPACITY", "REGISTRY_UNIT", "REGISTRY_CODE", "TRADING_CLEARING_REGISTRY_ID", "TRADING_CLEARING_REGISTRY", "REGISTRY_STATUS", "SECURITY_ID", "SECURITY_SYMBOL", "BALANCE", "OPEN_BALANCE", "CLOSE_BALANCE", "CREDIT", "DEBIT", "SETTLED_CREDIT", "SETTLED_DEBIT", "CHECK_BALANCE", "DIFF_BALANCE", "PLAN_BALANCE", "BALANCE_DIMENSION", "SETTLEMENT_DATE", "SETTLEMENT_CODE", "TRADING_DATE", "CLEARING_DATE", "REFUND_DATE", "VALUE_DATE", "PRICE", "CONTRACT", "COUNTER_PARTY_ID", "COMMENT", "PARENT_ID", "GROUP_ID", "SESSION_ID", "SESSION_TYPE", "PAYMENT_ID", "ID", "CREATED_AT", "UPDATED_AT" + "COMPANY_ID", "TRADING_CODE", "CLEARING_CODE", "SHORT_NAME", "FULL_NAME", "ACCOUNT_ID", "ACCOUNT_TYPE", "ACCOUNT", "REGISTRY_DESIGNATION", "REGISTRY_INSTRUMENT_TYPE", "REGISTRY_CAPACITY", "REGISTRY_UNIT", "REGISTRY_CODE", "TRADING_CLEARING_REGISTRY_ID", "TRADING_CLEARING_REGISTRY", "REGISTRY_STATUS", "SECURITY_SYMBOL", "BALANCE", "OPEN_BALANCE", "CLOSE_BALANCE", "CREDIT", "DEBIT", "SETTLED_CREDIT", "SETTLED_DEBIT", "CHECK_BALANCE", "DIFF_BALANCE", "PLAN_BALANCE", "BALANCE_DIMENSION", "SETTLEMENT_DATE", "SETTLEMENT_CODE", "TRADING_DATE", "CLEARING_DATE", "REFUND_DATE", "VALUE_DATE", "PRICE", "CONTRACT", "COUNTER_PARTY_ID", "COMMENT", "PARENT_ID", "GROUP_ID", "SESSION_ID", "SESSION_TYPE", "PAYMENT_ID", "ID", "CREATED_AT", "UPDATED_AT", "SECURITY_ID", "SECTION" }; } @@ -91,7 +91,6 @@ public class RegistryMapStore extends TemplateMapStore { object.setTradingClearingRegistryId(resultSet.getObject("TRADING_CLEARING_REGISTRY_ID", Long.class)); object.setTradingClearingRegistry(resultSet.getObject("TRADING_CLEARING_REGISTRY", String.class)); object.setRegistryStatus(resultSet.getObject("REGISTRY_STATUS", String.class)); - object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class)); object.setSecuritySymbol(resultSet.getObject("SECURITY_SYMBOL", String.class)); object.setBalance(resultSet.getObject("BALANCE", BigDecimal.class)); object.setOpenBalance(resultSet.getObject("OPEN_BALANCE", BigDecimal.class)); @@ -122,6 +121,8 @@ public class RegistryMapStore extends TemplateMapStore { object.setId(resultSet.getObject("ID", Long.class)); object.setCreated(getInstantFromTimestamp(resultSet, "CREATED_AT")); object.setUpdated(getInstantFromTimestamp(resultSet, "UPDATED_AT")); + object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class)); + object.setSection(resultSet.getObject("SECTION", String.class)); return object; } @@ -144,7 +145,6 @@ public class RegistryMapStore extends TemplateMapStore { object.getTradingClearingRegistryId(), object.getTradingClearingRegistry(), object.getRegistryStatus(), - object.getSecurityId(), object.getSecuritySymbol(), object.getBalance(), object.getOpenBalance(), @@ -174,7 +174,9 @@ public class RegistryMapStore extends TemplateMapStore { object.getPaymentId(), object.getId(), TimeUtil.toDateFromInstant(object.getCreated()), - TimeUtil.toDateFromInstant(object.getUpdated()) + TimeUtil.toDateFromInstant(object.getUpdated()), + object.getSecurityId(), + object.getSection() }; return args; } diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/BankAccountMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/BankAccountMapStore.java index 69ad384e8..87fdcd057 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/BankAccountMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/BankAccountMapStore.java @@ -33,7 +33,7 @@ public class BankAccountMapStore extends TemplateMapStore { @Override public String[] getFields() { return new String[]{ - "ID", "ACCOUNT_ID", "BANK_IDENTIFICATION_CODE", "BANK_NAME", "CORRESPONDENT_ACCOUNT", "CORRESPONDENT_ACCOUNT_NAME", "CURRENCY", "DESTINATION", "IBAN", "INTERNATIONAL_TRANSFER_SIGN", "SWIFT_CODE", "TAXPAYER_IDENTIFICATION_NUMBER", "TAX_REGISTRATION_REASON_CODE", "ACCOUNT", "COMPANY_ID" + "ID", "ACCOUNT_ID", "BANK_IDENTIFICATION_CODE", "BANK_NAME", "CORRESPONDENT_ACCOUNT", "CORRESPONDENT_ACCOUNT_NAME", "CURRENCY", "DESTINATION", "IBAN", "INTERNATIONAL_TRANSFER_SIGN", "SWIFT_CODE", "TAXPAYER_IDENTIFICATION_NUMBER", "TAX_REGISTRATION_REASON_CODE", "ACCOUNT", "COMPANY_ID", "INTERMEDIARY_SWIFT_CODE" }; } @@ -55,6 +55,7 @@ public class BankAccountMapStore extends TemplateMapStore { object.setTaxRegistrationReasonCode(resultSet.getObject("TAX_REGISTRATION_REASON_CODE", String.class)); object.setAccount(resultSet.getObject("ACCOUNT", String.class)); object.setCompanyId(resultSet.getObject("COMPANY_ID", Long.class)); + object.setIntermediarySwiftCode(resultSet.getObject("INTERMEDIARY_SWIFT_CODE", String.class)); return object; } @@ -76,6 +77,7 @@ public class BankAccountMapStore extends TemplateMapStore { object.getTaxRegistrationReasonCode(), object.getAccount(), object.getCompanyId(), + object.getIntermediarySwiftCode() }; return args; } diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf06MapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf06MapStore.java index ae486edd7..6fb56f919 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf06MapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf06MapStore.java @@ -34,7 +34,7 @@ public class SDf06MapStore extends TemplateMapStore { @Override public String[] getFields() { return new String[]{ - "ID", "ACCOUNT", "SUM", "MARKET", "TYPE", "DEAL", "CLIENT_N", "INN", "BIC", "SPEC", "NUMBER", "FILE_NAME", "GENERATION_TIME", "GENERATION_ID", "_DOC__NUM", "_DOC__DATE", "PAY_VAL" + "ID", "ACCOUNT", "SUM", "MARKET", "TYPE", "DEAL", "CLIENT_N", "INN", "BIC", "SPEC", "NUMBER", "FILE_NAME", "GENERATION_TIME", "GENERATION_ID", "DOC_NUM", "DOC_DATE", "PAY_VAL" }; } @@ -70,8 +70,8 @@ public class SDf06MapStore extends TemplateMapStore { object.setFileName(resultSet.getObject("FILE_NAME", String.class)); object.setGenerationTime(getInstantFromTimestamp(resultSet, "GENERATION_TIME")); object.setGenerationId(resultSet.getObject("GENERATION_ID", Long.class)); - object.setDoc_Num(resultSet.getObject("_DOC__NUM", String.class)); - object.setDoc_Date(resultSet.getObject("_DOC__DATE", String.class)); + object.setDoc_num(resultSet.getObject("DOC_NUM", String.class)); + object.setDoc_date(resultSet.getObject("DOC_DATE", String.class)); object.setPay_val(resultSet.getObject("PAY_VAL", String.class)); return object; } @@ -93,8 +93,8 @@ public class SDf06MapStore extends TemplateMapStore { object.getFileName(), TimeUtil.toDateFromInstant(object.getGenerationTime()), object.getGenerationId(), - object.getDoc_Num(), - object.getDoc_Date(), + object.getDoc_num(), + object.getDoc_date(), object.getPay_val() }; return args; diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf07MapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf07MapStore.java index c90c4c6af..6f0ed55a8 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf07MapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf07MapStore.java @@ -35,7 +35,7 @@ public class SDf07MapStore extends TemplateMapStore { public String[] getFields() { return new String[]{ "ID", "ACCOUNT", "SUM", "MARKET", "TYPE", "DEAL", "CLIENT_N", "INN", "BIC", "SPEC", "NUMBER", "RESULT", - "FILE_NAME", "GENERATION_TIME", "GENERATION_ID", "IN_S_DF_ID", "_DOC__NUM", "_DOC__DATE", "PAY_VAL" + "FILE_NAME", "GENERATION_TIME", "GENERATION_ID", "IN_S_DF_ID", "DOC_NUM", "DOC_DATE", "PAY_VAL" }; } @@ -73,8 +73,8 @@ public class SDf07MapStore extends TemplateMapStore { object.setGenerationTime(getInstantFromTimestamp(resultSet, "GENERATION_TIME")); object.setGenerationId(resultSet.getObject("GENERATION_ID", Long.class)); object.setInSDfId(resultSet.getObject("IN_S_DF_ID", Long.class)); - object.setDoc_Num(resultSet.getObject("_DOC__NUM", String.class)); - object.setDoc_Date(resultSet.getObject("_DOC__DATE", String.class)); + object.setDoc_num(resultSet.getObject("DOC_NUM", String.class)); + object.setDoc_date(resultSet.getObject("DOC_DATE", String.class)); object.setPay_val(resultSet.getObject("PAY_VAL", String.class)); return object; } @@ -98,8 +98,8 @@ public class SDf07MapStore extends TemplateMapStore { TimeUtil.toDateFromInstant(object.getGenerationTime()), object.getGenerationId(), object.getInSDfId(), - object.getDoc_Num(), - object.getDoc_Date(), + object.getDoc_num(), + object.getDoc_date(), object.getPay_val() }; return args; diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf54MapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf54MapStore.java index f5a917171..300e11166 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf54MapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf54MapStore.java @@ -33,7 +33,7 @@ public class SDf54MapStore extends TemplateMapStore { @Override public String[] getFields() { return new String[]{ - "ID", "SEG_TYPE", "DOC_TYPE", "DOCNM_REF", "DOCNMPREV", "SBANKCODE", "C_ACC_DEB", "SBANKNAM1", "SBANKNAM2", "SBANKNAM3", "SBANKNAM4", "SBANKNAM5", "RBANKCODE", "C_ACC_CRED", "RBANKNAM1", "RBANKNAM2", "RBANKNAM3", "RBANKNAM4", "RBANKNAM5", "OP_TYPE", "OP_ORDER", "PAY_DATE", "PAY_VAL", "SUM_DEB", "SCLIENTN1", "SCLIENTN2", "SCLIENTN3", "SCLIENTN4", "INN_DEB", "KPP_DEB", "ACC_DEB", "RCLIENTN1", "RCLIENTN2", "RCLIENTN3", "RCLIENTN4", "INN_CRED", "KPP_CRED", "ACC_KR_1", "SPECIF_1", "SEND_TYPE", "DOC_RESULT", "GENERATION_TIME", "GENERATION_ID", "_DOC__NUM", "_DOC__DATE", "_VALUE_DATE", "_SWIFT_BEN", "_SWIFT_INT" + "ID", "SEG_TYPE", "DOC_TYPE", "DOCNM_REF", "DOCNMPREV", "SBANKCODE", "C_ACC_DEB", "SBANKNAM1", "SBANKNAM2", "SBANKNAM3", "SBANKNAM4", "SBANKNAM5", "RBANKCODE", "C_ACC_CRED", "RBANKNAM1", "RBANKNAM2", "RBANKNAM3", "RBANKNAM4", "RBANKNAM5", "OP_TYPE", "OP_ORDER", "PAY_DATE", "PAY_VAL", "SUM_DEB", "SCLIENTN1", "SCLIENTN2", "SCLIENTN3", "SCLIENTN4", "INN_DEB", "KPP_DEB", "ACC_DEB", "RCLIENTN1", "RCLIENTN2", "RCLIENTN3", "RCLIENTN4", "INN_CRED", "KPP_CRED", "ACC_KR_1", "SPECIF_1", "SEND_TYPE", "DOC_RESULT", "GENERATION_TIME", "GENERATION_ID", "DOC_NUM", "DOC_DATE", "VALUE_DATE", "SWIFT_BEN", "SWIFT_INT" }; } @@ -98,11 +98,11 @@ public class SDf54MapStore extends TemplateMapStore { object.setDoc_result(resultSet.getObject("DOC_RESULT", String.class)); object.setGenerationTime(getInstantFromTimestamp(resultSet, "GENERATION_TIME")); object.setGenerationId(resultSet.getObject("GENERATION_ID", Long.class)); - object.setDoc_Num(resultSet.getObject("_DOC__NUM", String.class)); - object.setDoc_Date(resultSet.getObject("_DOC__DATE", String.class)); - object.setValue_date(resultSet.getObject("_VALUE_DATE", String.class)); - object.setSwift_ben(resultSet.getObject("_SWIFT_BEN", String.class)); - object.setSwift_int(resultSet.getObject("_SWIFT_INT", String.class)); + object.setDoc_num(resultSet.getObject("DOC_NUM", String.class)); + object.setDoc_date(resultSet.getObject("DOC_DATE", String.class)); + object.setValue_date(resultSet.getObject("VALUE_DATE", String.class)); + object.setSwift_ben(resultSet.getObject("SWIFT_BEN", String.class)); + object.setSwift_int(resultSet.getObject("SWIFT_INT", String.class)); return object; } @@ -152,8 +152,8 @@ public class SDf54MapStore extends TemplateMapStore { object.getDoc_result(), TimeUtil.toDateFromInstant(object.getGenerationTime()), object.getGenerationId(), - object.getDoc_Num(), - object.getDoc_Date(), + object.getDoc_num(), + object.getDoc_date(), object.getValue_date(), object.getSwift_ben(), object.getSwift_int() diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf55MapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf55MapStore.java index c7ab16f4a..cf27999c8 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf55MapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf55MapStore.java @@ -40,7 +40,7 @@ public class SDf55MapStore extends TemplateMapStore { "ACC_DEB", "RCLIENTN1", "RCLIENTN2", "RCLIENTN3", "RCLIENTN4", "INN_CRED", "KPP_CRED", "ACC_KR_1", "SPECIF_1", "SEND_TYPE", "DOC_RESULT", "FILE_NAME", "GENERATION_TIME", "GENERATION_ID", - "_DOC__NUM", "_DOC__DATE", "_VALUE_DATE", "_SWIFT_BEN", "_SWIFT_INT" + "DOC_NUM", "DOC_DATE", "VALUE_DATE", "SWIFT_BEN", "SWIFT_INT" }; } @@ -106,11 +106,11 @@ public class SDf55MapStore extends TemplateMapStore { object.setFileName(resultSet.getObject("FILE_NAME", String.class)); object.setGenerationTime(getInstantFromTimestamp(resultSet, "GENERATION_TIME")); object.setGenerationId(resultSet.getObject("GENERATION_ID", Long.class)); - object.setDoc_Num(resultSet.getObject("_DOC__NUM", String.class)); - object.setDoc_Date(resultSet.getObject("_DOC__DATE", String.class)); - object.setValue_date(resultSet.getObject("_VALUE_DATE", String.class)); - object.setSwift_ben(resultSet.getObject("_SWIFT_BEN", String.class)); - object.setSwift_int(resultSet.getObject("_SWIFT_INT", String.class)); + object.setDoc_num(resultSet.getObject("DOC_NUM", String.class)); + object.setDoc_date(resultSet.getObject("DOC_DATE", String.class)); + object.setValue_date(resultSet.getObject("VALUE_DATE", String.class)); + object.setSwift_ben(resultSet.getObject("SWIFT_BEN", String.class)); + object.setSwift_int(resultSet.getObject("SWIFT_INT", String.class)); return object; } @@ -161,8 +161,8 @@ public class SDf55MapStore extends TemplateMapStore { object.getFileName(), TimeUtil.toDateFromInstant(object.getGenerationTime()), object.getGenerationId(), - object.getDoc_Num(), - object.getDoc_Date(), + object.getDoc_num(), + object.getDoc_date(), object.getValue_date(), object.getSwift_ben(), object.getSwift_int() diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf57MapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf57MapStore.java index 1b62b8cee..cd96df6f0 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf57MapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf57MapStore.java @@ -32,7 +32,7 @@ public class SDf57MapStore extends TemplateMapStore { @Override public String[] getFields() { return new String[]{ - "GENERATION_TIME", "ID", "DBF_ID", "DEAL_DEB", "DEAL_CRED", "SBANKCODE", "C_ACC_DEB", "SBANKNAM1", "SBANKNAM2", "SBANKNAM3", "SBANKNAM4", "SBANKNAM5", "RBANKCODE", "C_ACC_CRED", "RBANKNAM1", "RBANKNAM2", "RBANKNAM3", "RBANKNAM4", "RBANKNAM5", "OP_TYPE", "PAY_DATE", "EXT_DATE", "PAY_VAL", "SUM_DEB", "SCLIENTN1", "SCLIENTN2", "SCLIENTN3", "SCLIENTN4", "INN_DEB", "KPP_DEB", "ACC_DEB", "RCLIENTN1", "RCLIENTN2", "RCLIENTN3", "RCLIENTN4", "INN_CRED", "KPP_CRED", "ACC_KR", "SPECIF", "FILE_NAME", "GENERATION_ID", "_DOC__NUM", "_DOC__DATE", "DT_IN", "KT_IN", "DT_OUT", "KT_OUT" + "GENERATION_TIME", "ID", "DBF_ID", "DEAL_DEB", "DEAL_CRED", "SBANKCODE", "C_ACC_DEB", "SBANKNAM1", "SBANKNAM2", "SBANKNAM3", "SBANKNAM4", "SBANKNAM5", "RBANKCODE", "C_ACC_CRED", "RBANKNAM1", "RBANKNAM2", "RBANKNAM3", "RBANKNAM4", "RBANKNAM5", "OP_TYPE", "PAY_DATE", "EXT_DATE", "PAY_VAL", "SUM_DEB", "SCLIENTN1", "SCLIENTN2", "SCLIENTN3", "SCLIENTN4", "INN_DEB", "KPP_DEB", "ACC_DEB", "RCLIENTN1", "RCLIENTN2", "RCLIENTN3", "RCLIENTN4", "INN_CRED", "KPP_CRED", "ACC_KR", "SPECIF", "FILE_NAME", "GENERATION_ID", "DOC_NUM", "DOC_DATE", "DT_IN", "KT_IN", "DT_OUT", "KT_OUT" }; } @@ -94,8 +94,8 @@ public class SDf57MapStore extends TemplateMapStore { object.setSpecif(resultSet.getObject("SPECIF", String.class)); object.setFileName(resultSet.getObject("FILE_NAME", String.class)); object.setGenerationId(resultSet.getObject("GENERATION_ID", Long.class)); - object.setDoc_Num(resultSet.getObject("_DOC__NUM", String.class)); - object.setDoc_Date(resultSet.getObject("_DOC__DATE", String.class)); + object.setDoc_num(resultSet.getObject("DOC_NUM", String.class)); + object.setDoc_date(resultSet.getObject("DOC_DATE", String.class)); object.setDt_in(resultSet.getObject("DT_IN", String.class)); object.setKt_in(resultSet.getObject("KT_IN", String.class)); object.setDt_out(resultSet.getObject("DT_OUT", String.class)); @@ -147,8 +147,8 @@ public class SDf57MapStore extends TemplateMapStore { object.getSpecif(), object.getFileName(), object.getGenerationId(), - object.getDoc_Num(), - object.getDoc_Date(), + object.getDoc_num(), + object.getDoc_date(), object.getDt_in(), object.getKt_in(), object.getDt_out(), diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/STradesMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/STradesMapStore.java index 6a8c95582..ec3645a21 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/STradesMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/STradesMapStore.java @@ -49,6 +49,10 @@ public class STradesMapStore extends TemplateMapStore { return defaultLoadAllKeysOnTodayByField("trade_date", false); } + public String[] getIndexingField() { + return new String[]{"tradeNum"}; + } + @Override public STrades objectReader(ResultSet resultSet) throws SQLException { STrades object = new STrades(); diff --git a/clearing-parent/lim-exporter/pom.xml b/clearing-parent/lim-exporter/pom.xml index 43bc08597..6fe0cd2a4 100644 --- a/clearing-parent/lim-exporter/pom.xml +++ b/clearing-parent/lim-exporter/pom.xml @@ -3,13 +3,13 @@ 4.0.0 lim-exporter Lim exporter - SPCEX-3.11.0.0 + SPCEX-3.12.7 jar ru.spcex.clearing clearing-parent - SPCEX-3.11.0.0 + SPCEX-3.12.7 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.11.0.0 + SPCEX-3.12.7 compile diff --git a/clearing-parent/pom.xml b/clearing-parent/pom.xml index a5862f508..726e6591f 100644 --- a/clearing-parent/pom.xml +++ b/clearing-parent/pom.xml @@ -7,12 +7,12 @@ _parent_clearing Clearing parent module pom - SPCEX-3.11.0.0 + SPCEX-3.12.7 clearing ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 diff --git a/clearing-parent/registry-service/README.md b/clearing-parent/registry-service/README.md new file mode 100644 index 000000000..2bf44faa9 --- /dev/null +++ b/clearing-parent/registry-service/README.md @@ -0,0 +1,38 @@ +registry-service +================ + +Описание +-------- +Утилита для создания отчётов за разные даты registry-service. Использует jdbc (прямое соединение с базой) вместо imdg. + +Запуск +------ +java -jar registry-service.jar "--spring.config.location=E:\MFD_GIT_REPO\clearing\registry-service" --report --startDate=24.01.2024 --endDate=31.01.2024 + +#####Параметры запуска +* --service запуск в режиме сервиса (по умолчанию) +* --report запуск для формирования одного отчёта, выключиться по завершении +* --startDate=24.01.2024 в режиме --report дата начала (включительно) +* --endDate=31.01.2024 в режиме --report дата завершения (включительно) + +Для запуска в режиме сервиса надо добавить в настройки параметры кафки. + +Настройки в application.properties. +registry-service.kafka-consumer.* и registry-service.kafka-producer.* не обязательны, если не запускается в режиме --service + +Структура кода +-------------- + +* RegisterUtilityRunner - порядок выгрузки и создания отчётов +* loaders/* - загрузчики данных, почти как MapStore, но грузят все связанные объекты. +* builders/* - построители отчётов +* bean/* - классы, enum + +Соответствие отчётам +-------------------- +executionDepositLoader + executionFondLoader = executionRegisterReportBuilder (contract_register) +depoInstructionLoader = depoPaymentInstructionBuilder (rdc_register) +moneyPaymentInstructionLoader = moneyPaymentInstructionRegisterReportBuilder (prc_register) +moneyBalanceLoader = moneyBalanceRegisterReportBuilder (money_register) +depoBalanceLoader = depoBalanceRegisterReportBuilder (security_register) +registryLoader = liabilitiesRegistryReportBuilder (registry) diff --git a/clearing-parent/registry-service/pom.xml b/clearing-parent/registry-service/pom.xml index fefdbd928..0e7e5efc9 100644 --- a/clearing-parent/registry-service/pom.xml +++ b/clearing-parent/registry-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 4.0.0 @@ -15,46 +15,63 @@ 17 17 5.2.5 + UTF-8 + + ru.spcex.platform platform-messaging + 1.0.0 ru.spcex.platform - platform-imdg-api-hazelcast-impl + platform-enum - ru.spcex.clearing - classes + ru.spcex.platform + platform-classes-base + + + + org.springframework.boot spring-boot-starter - com.fasterxml.jackson.core - jackson-databind + org.springframework + spring-jdbc + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.springframework.boot + spring-boot-starter-data-ldap org.springframework.integration spring-integration-sftp + + - org.springframework.boot - spring-boot-starter-test - test + com.mchange + c3p0 + 0.9.5.5 - ru.spcex.clearing - dictionary - - - ru.spcex.clearing - test-clearing - test + org.postgresql + postgresql @@ -76,7 +93,56 @@ ${poi.version} - + + + ru.spcex.clearing + test-clearing + test + + + org.junit.jupiter + junit-jupiter + test + + + org.mockito + mockito-core + test + + + org.springframework.boot + spring-boot-test + test + + + org.springframework.boot + spring-boot-starter-test + test + + + com.h2database + h2 + test + + + + + org.slf4j + slf4j-api + + + ch.qos.logback + logback-classic + + + com.fasterxml.jackson.core + jackson-databind + + + org.apache.commons + commons-lang3 + 3.7 + net.logstash.logback logstash-logback-encoder diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/RegistryServiceApplication.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/RegistryServiceApplication.java index 5f596d2bd..4700ce559 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/RegistryServiceApplication.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/RegistryServiceApplication.java @@ -1,12 +1,60 @@ package ru.spcex.clearing.registry; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; +import ru.spcex.clearing.registry.service.RegisterUtilityRunner; +import ru.spcex.clearing.registry.service.RegisterUtilityService; +import java.util.Arrays; + +/** + * Параметры запуска: + * --service запуск как сервис (по умолчанию); + * --report запустить один раз, выполнить все отчёты и завершиться. + */ @SpringBootApplication -public class RegistryServiceApplication { +public class RegistryServiceApplication implements CommandLineRunner { + final Logger log = LoggerFactory.getLogger(getClass()); + private final RegisterUtilityRunner runner; + @Autowired + ConfigurableApplicationContext context; + + public RegistryServiceApplication(RegisterUtilityRunner runner) { + this.runner = runner; + } + public static void main(String[] args) { - SpringApplication springApplication = new SpringApplication(RegistryServiceApplication.class); - springApplication.run(args); + SpringApplication.run(RegistryServiceApplication.class, args); + } + + @Override + public void run(String... args) throws InterruptedException { + log.info("{} start with CMD: \"{}\"", this.getClass().getSimpleName(), Arrays.toString(args)); + log.info("Available CMD option: --report or --service"); + boolean asService = true; + for (String arg : args) { + if ("--service".equalsIgnoreCase(arg)) + asService = true; + if ("--report".equalsIgnoreCase(arg)) + asService = false; + } + try { + if (!asService) { + log.info("Запуск всех отчётов."); + runner.process(); + } else { + log.info("Запуск в режиме ожидания команд, как сервис."); + RegisterUtilityService service = context.getBean(RegisterUtilityService.class); + } + } catch (Throwable e) { + log.error("{}", ExceptionUtils.getStackTrace(e)); + throw e; + } } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/BindByName.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/BindByName.java new file mode 100644 index 000000000..a95db0d4b --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/BindByName.java @@ -0,0 +1,12 @@ +package ru.spcex.clearing.registry.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface BindByName { + String column(); +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/BindByPosition.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/BindByPosition.java new file mode 100644 index 000000000..86d629123 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/BindByPosition.java @@ -0,0 +1,12 @@ +package ru.spcex.clearing.registry.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface BindByPosition { + int position(); +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/ReportDate.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/ReportDate.java new file mode 100644 index 000000000..19fba754b --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/ReportDate.java @@ -0,0 +1,12 @@ +package ru.spcex.clearing.registry.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface ReportDate { + String value() default "yyyyMMdd'T'HHmmss"; +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/ReportNumber.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/ReportNumber.java new file mode 100644 index 000000000..821e09255 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/annotation/ReportNumber.java @@ -0,0 +1,12 @@ +package ru.spcex.clearing.registry.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface ReportNumber { + String value(); +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/BeanConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/BeanConfig.java new file mode 100644 index 000000000..74838b877 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/BeanConfig.java @@ -0,0 +1,57 @@ +package ru.spcex.clearing.registry.conf; + +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.clearing.registry.exceptions.ConfigurationException; +import ru.spcex.clearing.registry.service.RegisterUtilityRunner; +import ru.spcex.clearing.registry.service.RegisterUtilityService; + +import java.io.File; + +@Configuration +public class BeanConfig { + Logger log = LoggerFactory.getLogger(getClass()); + + @Bean("outFolder") + public File outFolder(AProperties properties) { + File outFolder = new File(properties.getOutFolder()); + if (outFolder.exists() && !outFolder.isDirectory()) + throw new ConfigurationException("Путь %s не является директорией".formatted(properties.getOutFolder())); + if (!outFolder.exists()) { + boolean mkdirs = outFolder.mkdirs(); + if (!mkdirs) throw new ConfigurationException("Не удалось создать директорию для отчетов"); + } + return outFolder; + } + + @Autowired(required = false) + @Lazy + @Bean + public RegisterUtilityService RegisterUtilityService(RegisterUtilityRunner runner, + AProperties properties, CmdArgsParser cmdArgsParser, + Consumer kafkaQueue, + Producer kafkaResponseQueue) { + if (kafkaQueue == null) { + log.info("KafkaQueue was not configured."); + return null; + } + if (kafkaResponseQueue == null) { + log.info("kafkaResponseQueue was not configured."); + return null; + } + if (runner == null) + throw new IllegalStateException("Required bean RegisterUtilityRunner"); + if (properties == null) + throw new IllegalStateException("Required bean AProperties"); + RegisterUtilityService service = new RegisterUtilityService(runner, properties, cmdArgsParser, + kafkaQueue, kafkaResponseQueue); + return service; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/CmdArgsParser.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/CmdArgsParser.java new file mode 100644 index 000000000..ac150836d --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/CmdArgsParser.java @@ -0,0 +1,76 @@ +package ru.spcex.clearing.registry.conf; + +import org.springframework.boot.ApplicationArguments; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.conf.properties.PeriodProperties; +import ru.spcex.clearing.registry.exceptions.CmdArgsParserException; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Set; + +@Component +public class CmdArgsParser { + private final ApplicationArguments applicationArguments; + public final String START_DATE_OPTION = "startDate"; + public final String END_DATE_OPTION = "endDate"; + + public CmdArgsParser(ApplicationArguments applicationArguments) { + this.applicationArguments = applicationArguments; + } + + public PeriodProperties parsePeriodProperties() { + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); + Set optionNames = applicationArguments.getOptionNames(); + PeriodProperties periodProperties = new PeriodProperties(); + String startDateStr; + String endDateStr; + for (String option : optionNames) { + if (option.equalsIgnoreCase(START_DATE_OPTION)) { + if (periodProperties.getStartDate() != null) throw new CmdArgsParserException("Более одной опции --start"); + List optionValues = applicationArguments.getOptionValues(option); + if (optionValues.size() != 1) + throw new CmdArgsParserException("Для опции --"+START_DATE_OPTION+" должно быть указано одно значение в формате ДД.ММ.ГГГГ"); + startDateStr = optionValues.iterator().next(); + try { + LocalDate startDate = LocalDate.parse(startDateStr, dateFormatter); + periodProperties.setStartDate(startDate); + } catch (Exception e) { + throw new CmdArgsParserException("Опция --"+START_DATE_OPTION+" должна быть указана в формате ДД.ММ.ГГГГ"); + } + } + if (option.equalsIgnoreCase(END_DATE_OPTION)) { + if (periodProperties.getEndDate() != null) throw new CmdArgsParserException("Более одной опции --end"); + List optionValues = applicationArguments.getOptionValues(option); + if (optionValues.size() != 1) + throw new CmdArgsParserException("Для опции --"+END_DATE_OPTION+" должно быть указано одно значение в формате ДД.ММ.ГГГГ"); + endDateStr = optionValues.iterator().next(); + try { + LocalDate endDate = LocalDate.parse(endDateStr, dateFormatter); + periodProperties.setEndDate(endDate); + } catch (Exception e) { + throw new CmdArgsParserException("Опция --"+END_DATE_OPTION+" должна быть указана в формате ДД.ММ.ГГГГ"); + } + } + } + if (periodProperties.getStartDate() == null && periodProperties.getEndDate() == null) { + periodProperties.setStartDate(LocalDate.now()); + periodProperties.setEndDate(LocalDate.now()); + } + if (periodProperties.getEndDate() == null) periodProperties.setEndDate(periodProperties.getStartDate()); + validatePeriodProperties(periodProperties); + + return periodProperties; + } + + public void validatePeriodProperties(PeriodProperties periodProperties) throws CmdArgsParserException { + if (periodProperties.getStartDate()==null) + throw new CmdArgsParserException("Дата " + START_DATE_OPTION + " должна быть указана."); + if (periodProperties.getEndDate()==null) + throw new CmdArgsParserException("Дата " + END_DATE_OPTION + " должна быть указана."); + if (periodProperties.getStartDate().isAfter(periodProperties.getEndDate())) { + throw new CmdArgsParserException("Дата " + START_DATE_OPTION + "=" + periodProperties.getStartDate() + " должна быть до " + END_DATE_OPTION + "=" + periodProperties.getEndDate()); + } + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/DBConfiguration.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/DBConfiguration.java new file mode 100644 index 000000000..e23c4116e --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/DBConfiguration.java @@ -0,0 +1,36 @@ +package ru.spcex.clearing.registry.conf; + +import com.mchange.v2.c3p0.ComboPooledDataSource; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.clearing.registry.conf.properties.DevProperties; + +import javax.sql.DataSource; +import java.beans.PropertyVetoException; + +@Configuration +public class DBConfiguration { + + @Bean("indicJdbcTemplate") + public NamedParameterJdbcTemplate indicJdbcTemplate(@Qualifier("clearingDataSource") DataSource indicDataSource) { + return new NamedParameterJdbcTemplate(indicDataSource); + } + + @Bean("clearingDataSource") + public DataSource indicDataSource(AProperties properties, DevProperties devProperties) throws PropertyVetoException { + ComboPooledDataSource clearingDataSource = new ComboPooledDataSource(); + clearingDataSource.setDriverClass(properties.getDbClearing().getDriver()); + clearingDataSource.setJdbcUrl(properties.getDbClearing().getUrl()); + clearingDataSource.setUser(properties.getDbClearing().getUsername()); + clearingDataSource.setPassword(properties.getDbClearing().getPassword()); + clearingDataSource.setAcquireIncrement(devProperties.getC3p0AcquireIncrement()); + clearingDataSource.setInitialPoolSize(devProperties.getC3p0InitialPoolSize()); + clearingDataSource.setMinPoolSize(devProperties.getC3p0MinPoolSize()); + clearingDataSource.setMaxPoolSize(devProperties.getC3p0MaxPoolSize()); + return clearingDataSource; + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/KafkaConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/KafkaConfig.java new file mode 100644 index 000000000..efbc424ec --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/KafkaConfig.java @@ -0,0 +1,59 @@ +package ru.spcex.clearing.registry.conf; + +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.core.ProducerFactory; +import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory; +import ru.spcex.clearing.platform.messaging.config.KafkaProducerFactory; +import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings; +import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings; +import ru.spcex.clearing.registry.conf.properties.AProperties; + +@Configuration +public class KafkaConfig { + @Autowired + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + @Bean + public Consumer createConsumer(AProperties settings) { + KafkaConsumerSettings kafkaSettings = settings.getKafkaConsumer(); + if (kafkaSettings == null || kafkaSettings.getBootstrapServers() == null) { + return null; + } + return KafkaConsumerFactory.consumer(kafkaSettings); + } + + @Autowired + @Bean + public Producer createProducer(AProperties settings) { + KafkaProducerSettings kafkaSettings = settings.getKafkaProducer(); + if (kafkaSettings == null || kafkaSettings.getBootstrapServers() == null) { + return null; + } + return KafkaProducerFactory.producer(kafkaSettings); + } + + @Autowired + @Bean + public ProducerFactory pf(AProperties settings) { + KafkaProducerSettings kafkaSettings = settings.getKafkaProducer(); + if (kafkaSettings == null || kafkaSettings.getBootstrapServers() == null) { + return null; + } + return KafkaProducerFactory.producerFactory(kafkaSettings); + } + + @Autowired(required = false) + @Bean + public KafkaTemplate kafkaTemplate(ProducerFactory pf) { + if (pf == null) + return null; + return new KafkaTemplate<>(pf); + } + +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/SFTPReportsConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/SFTPReportsConfig.java new file mode 100644 index 000000000..de4bdaa5f --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/SFTPReportsConfig.java @@ -0,0 +1,127 @@ +package ru.spcex.clearing.registry.conf; + +import com.jcraft.jsch.ChannelSftp; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.expression.common.LiteralExpression; +import org.springframework.integration.annotation.Gateway; +import org.springframework.integration.annotation.MessagingGateway; +import org.springframework.integration.annotation.ServiceActivator; +import org.springframework.integration.channel.DirectChannel; +import org.springframework.integration.dsl.IntegrationFlow; +import org.springframework.integration.dsl.IntegrationFlows; +import org.springframework.integration.file.remote.session.CachingSessionFactory; +import org.springframework.integration.file.remote.session.SessionFactory; +import org.springframework.integration.sftp.gateway.SftpOutboundGateway; +import org.springframework.integration.sftp.outbound.SftpMessageHandler; +import org.springframework.integration.sftp.session.DefaultSftpSessionFactory; +import org.springframework.integration.sftp.session.SftpFileInfo; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.MessageHandler; +import ru.spcex.clearing.registry.conf.properties.AProperties; + +import java.io.File; +import java.util.List; + +import static org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway.Command.LS; + +//@Configuration +public class SFTPReportsConfig { +// protected Logger log = LoggerFactory.getLogger(getClass()); +// private final AProperties settings; +// +// @Autowired(required = false) +// public SFTPReportsConfig(AProperties settings) { +// this.settings = settings; +// } +// +// @Bean("reportsSftpSessionFactory") +// public SessionFactory sftpSessionFactory() { +// if (settings.getReportsStore()==null) { +// log.info("SFTP reports-store not set in config. Disabled."); +// return null; +// } +// DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true); +// factory.setHost(settings.getReportsStore().getServerIp()); +// factory.setPort(settings.getReportsStore().getServerPort()); +// factory.setUser(settings.getReportsStore().getUser()); +// factory.setPassword(settings.getReportsStore().getPassword()); +// factory.setAllowUnknownKeys(true); +// return new CachingSessionFactory<>(factory); +// } +// +// @Bean("reportsSftpHandler") +// @Autowired(required = false) +// @ServiceActivator(inputChannel = "reportsToSftpChannel") +// public MessageHandler handler(@Qualifier("reportsSftpSessionFactory") SessionFactory sessionFactory) { +// if (sessionFactory == null || settings.getReportsStore()==null) { +// log.info("reportsToSftpChannel disabled."); +// return null; +// } +// SftpMessageHandler handler = new SftpMessageHandler(sessionFactory); +// handler.setRemoteDirectoryExpression(new LiteralExpression(settings.getReportsStore().getOutDir())); +// log.info("Configure sftp output directory \"{}\"", settings.getReportsStore().getOutDir()); +// handler.setAutoCreateDirectory(true); +// handler.setFileNameGenerator(message -> { +// if (message.getPayload() instanceof File) { +// return ((File) message.getPayload()).getName(); +// } else { +// throw new IllegalArgumentException("File must expected as payload."); +// } +// }); +// return handler; +// } +// +// @Autowired(required = false) +// @Bean("reportsListSftpChannel") +// public MessageChannel listSftpChannel(@Qualifier("reportsSftpHandlerList") MessageHandler handler) { +// if (handler==null) +// return null; +// DirectChannel dc = new DirectChannel(); +// dc.subscribe(handler); +// return dc; +// } +// +// @Autowired(required = false) +// @Bean("reportsToSftpChannel") +// public MessageChannel toSftpChannel(@Qualifier("reportsSftpHandler") MessageHandler handler) { +// if (handler==null) +// return null; +// DirectChannel dc = new DirectChannel(); +// dc.subscribe(handler); +// return dc; +// } +// +// @Autowired(required = false) +// @Bean("reportsSftpHandlerList") +// @ServiceActivator(inputChannel = "reportsListSftpChannel") +// public MessageHandler handlerList(@Qualifier("reportsSftpSessionFactory") SessionFactory sessionFactory) { +// if (sessionFactory==null) +// return null; +// String expression = "'/%s'".formatted(settings.getReportsStore().getOutDir()); +// return new SftpOutboundGateway(sessionFactory, LS.getCommand(), expression); +// } +// +// @Autowired(required = false) +// @Bean("reportsSftpOutboundListFlow") +// public IntegrationFlow sftpOutboundListFlow(@Qualifier("reportsSftpSessionFactory") SessionFactory sessionFactory) { +// if (sessionFactory==null) +// return null; +// return IntegrationFlows.from("reportsListSftpChannel") +// .handle(new SftpOutboundGateway(sessionFactory, "ls", "payload")) +// .get(); +// } +// + @MessagingGateway(name = "reportsSftpGateway") + public interface ReportsGateway { + @Gateway(requestChannel = "reportsToSftpChannel") + void sendToSftp(File file); + + @Gateway(requestChannel = "reportsListSftpChannel") + List listFiles(String dir); + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/AProperties.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/AProperties.java new file mode 100644 index 000000000..0b71a626d --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/AProperties.java @@ -0,0 +1,78 @@ +package ru.spcex.clearing.registry.conf.properties; + +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings; +import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings; +import ru.spcex.clearing.registry.conf.CmdArgsParser; + +@Configuration +@ConfigurationProperties(prefix = "registry-service") +@PropertySource(value = {"file:${spring.config.location}/application.properties"}) +public class AProperties { + private DBProperties dbClearing; + private PeriodProperties period; + private ReportsStore reportsStore; // localTempDir + + private KafkaConsumerSettings kafkaConsumer; + private KafkaProducerSettings kafkaProducer; + + @Value("${registry-service.outFolder}") + private String outFolder; + + public AProperties(CmdArgsParser argsParser) { + period = argsParser.parsePeriodProperties(); + LoggerFactory.getLogger(getClass()).info("Period from CMD: {}", period); + } + + public DBProperties getDbClearing() { + return dbClearing; + } + + public void setDbClearing(DBProperties dbClearing) { + this.dbClearing = dbClearing; + } + + public PeriodProperties getPeriod() { + return period; + } + + public void setPeriod(PeriodProperties period) { + this.period = period; + } + + public String getOutFolder() { + return outFolder; + } + + public void setOutFolder(String outFolder) { + this.outFolder = outFolder; + } + + public ReportsStore getReportsStore() { + return reportsStore; + } + + public void setReportsStore(ReportsStore reportsStore) { + this.reportsStore = reportsStore; + } + + public KafkaConsumerSettings getKafkaConsumer() { + return kafkaConsumer; + } + + public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) { + this.kafkaConsumer = kafkaConsumer; + } + + public KafkaProducerSettings getKafkaProducer() { + return kafkaProducer; + } + + public void setKafkaProducer(KafkaProducerSettings kafkaProducer) { + this.kafkaProducer = kafkaProducer; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/DBProperties.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/DBProperties.java new file mode 100644 index 000000000..06aa27a90 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/DBProperties.java @@ -0,0 +1,40 @@ +package ru.spcex.clearing.registry.conf.properties; + +public class DBProperties { + private String url; + private String driver; + private String username; + private String password; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getDriver() { + return driver; + } + + public void setDriver(String driver) { + this.driver = driver; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/DevProperties.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/DevProperties.java new file mode 100644 index 000000000..3ee16f968 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/DevProperties.java @@ -0,0 +1,48 @@ +package ru.spcex.clearing.registry.conf.properties; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +@Configuration +@ConfigurationProperties(prefix = "registry-service.dev") +@PropertySource(value = "classpath:dev.properties") +public class DevProperties { + private int c3p0MinPoolSize; + private int c3p0MaxPoolSize; + private int c3p0InitialPoolSize; + private int c3p0AcquireIncrement; + + + public int getC3p0MinPoolSize() { + return c3p0MinPoolSize; + } + + public void setC3p0MinPoolSize(int c3p0MinPoolSize) { + this.c3p0MinPoolSize = c3p0MinPoolSize; + } + + public int getC3p0MaxPoolSize() { + return c3p0MaxPoolSize; + } + + public void setC3p0MaxPoolSize(int c3p0MaxPoolSize) { + this.c3p0MaxPoolSize = c3p0MaxPoolSize; + } + + public int getC3p0InitialPoolSize() { + return c3p0InitialPoolSize; + } + + public void setC3p0InitialPoolSize(int c3p0InitialPoolSize) { + this.c3p0InitialPoolSize = c3p0InitialPoolSize; + } + + public int getC3p0AcquireIncrement() { + return c3p0AcquireIncrement; + } + + public void setC3p0AcquireIncrement(int c3p0AcquireIncrement) { + this.c3p0AcquireIncrement = c3p0AcquireIncrement; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/PeriodProperties.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/PeriodProperties.java new file mode 100644 index 000000000..edc5e964e --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/PeriodProperties.java @@ -0,0 +1,29 @@ +package ru.spcex.clearing.registry.conf.properties; + +import java.time.LocalDate; + +public class PeriodProperties { + private LocalDate startDate; + private LocalDate endDate; + + public LocalDate getStartDate() { + return startDate; + } + + public void setStartDate(LocalDate startDate) { + this.startDate = startDate; + } + + public LocalDate getEndDate() { + return endDate; + } + + public void setEndDate(LocalDate endDate) { + this.endDate = endDate; + } + + @Override + public String toString() { + return "[startDate=" + startDate + ", endDate=" + endDate + "]"; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/settings/ReportsStore.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/ReportsStore.java similarity index 81% rename from clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/settings/ReportsStore.java rename to clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/ReportsStore.java index 4415f3abf..318dcd746 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/settings/ReportsStore.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/conf/properties/ReportsStore.java @@ -1,8 +1,8 @@ -package ru.spcex.clearing.registry.config.settings; +package ru.spcex.clearing.registry.conf.properties; public class ReportsStore { private String outDir; - private String localTempDir; +// private String localTempDir; private String user; private String password; private String serverIp; @@ -58,11 +58,4 @@ public class ReportsStore { this.outDir = outDir; } - public String getLocalTempDir() { - return localTempDir; - } - - public void setLocalTempDir(String localTempDir) { - this.localTempDir = localTempDir; - } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/KafkaConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/KafkaConfig.java deleted file mode 100644 index 30c26317b..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/KafkaConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package ru.spcex.clearing.registry.config; - -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.producer.Producer; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; -import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory; -import ru.spcex.clearing.platform.messaging.config.KafkaProducerFactory; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; - -@Configuration -public class KafkaConfig { - @Autowired - @Bean - @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) - public Consumer createConsumer(RegistryServiceSettings settings) { - return KafkaConsumerFactory.consumer(settings.getKafkaConsumer()); - } - - @Autowired - @Bean - public Producer createProducer(RegistryServiceSettings settings) { - return KafkaProducerFactory.producer(settings.getKafkaProducer()); - } - -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/RegistryServiceConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/RegistryServiceConfig.java deleted file mode 100644 index e3239957e..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/RegistryServiceConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package ru.spcex.clearing.registry.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; - -import java.io.File; - -@Configuration -public class RegistryServiceConfig { - @Bean("reportOutDir") - public File outDir(RegistryServiceSettings settings) { - File outFolder = new File(settings.getReportsStore().getLocalTempDir()); - if (!outFolder.exists()) { - boolean mkDirOk = outFolder.mkdirs(); - if (!mkDirOk) throw new IllegalStateException("Can't create output directory for reports, registry-service was terminated"); - } else if (!outFolder.isDirectory()) { - throw new IllegalStateException("Output reports path from settings is not directory!"); - } - return outFolder; - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/RegistryServiceImdgConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/RegistryServiceImdgConfig.java deleted file mode 100644 index a9c630a41..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/RegistryServiceImdgConfig.java +++ /dev/null @@ -1,47 +0,0 @@ -package ru.spcex.clearing.registry.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; - -@Configuration -public class RegistryServiceImdgConfig { - private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) { - ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); - if (maxPoolSz > 2) { - pool.setKeepAliveSeconds(60); - pool.setAllowCoreThreadTimeOut(true); - } - pool.setCorePoolSize(maxPoolSz); - pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion); - return pool; - } - - @Bean(name = "taskExecutorHazelcastClientInitializer") - public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() { - return createThreadPoolTaskExecutor(1, true); - } - - @Bean(name = "taskExecutorIdGeneratorAwaiter") - public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() { - return createThreadPoolTaskExecutor(1, false); - } - - @Autowired - @Bean - public ImdgProvider imdgProvider( - @Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, - @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, - RegistryServiceSettings settings - ) { - return new HazelcastService(taskExecutorHazelcastClientInitializer, - taskExecutorIdGeneratorAwaiter, - settings.getHazelcast()); - } - -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/SFTPReportsConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/SFTPReportsConfig.java deleted file mode 100644 index 12d1be495..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/SFTPReportsConfig.java +++ /dev/null @@ -1,104 +0,0 @@ -package ru.spcex.clearing.registry.config; - -import com.jcraft.jsch.ChannelSftp; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.expression.common.LiteralExpression; -import org.springframework.integration.annotation.Gateway; -import org.springframework.integration.annotation.MessagingGateway; -import org.springframework.integration.annotation.ServiceActivator; -import org.springframework.integration.channel.DirectChannel; -import org.springframework.integration.dsl.IntegrationFlow; -import org.springframework.integration.dsl.IntegrationFlows; -import org.springframework.integration.file.remote.session.CachingSessionFactory; -import org.springframework.integration.file.remote.session.SessionFactory; -import org.springframework.integration.sftp.gateway.SftpOutboundGateway; -import org.springframework.integration.sftp.outbound.SftpMessageHandler; -import org.springframework.integration.sftp.session.DefaultSftpSessionFactory; -import org.springframework.integration.sftp.session.SftpFileInfo; -import org.springframework.messaging.MessageChannel; -import org.springframework.messaging.MessageHandler; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; - -import java.io.File; -import java.util.List; - -import static org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway.Command.LS; - -@Configuration -public class SFTPReportsConfig { - protected Logger log = LoggerFactory.getLogger(getClass()); - private final RegistryServiceSettings settings; - - public SFTPReportsConfig(RegistryServiceSettings settings) { - this.settings = settings; - } - - @Bean("reportsSftpSessionFactory") - public SessionFactory sftpSessionFactory() { - DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true); - factory.setHost(settings.getReportsStore().getServerIp()); - factory.setPort(settings.getReportsStore().getServerPort()); - factory.setUser(settings.getReportsStore().getUser()); - factory.setPassword(settings.getReportsStore().getPassword()); - factory.setAllowUnknownKeys(true); - return new CachingSessionFactory<>(factory); - } - - @Bean("reportsSftpHandler") - @ServiceActivator(inputChannel = "reportsToSftpChannel") - public MessageHandler handler(@Qualifier("reportsSftpSessionFactory") SessionFactory sessionFactory) { - SftpMessageHandler handler = new SftpMessageHandler(sessionFactory); - handler.setRemoteDirectoryExpression(new LiteralExpression(settings.getReportsStore().getOutDir())); - log.info("Configure sftp output directory \"{}\"", settings.getReportsStore().getOutDir()); - handler.setAutoCreateDirectory(true); - handler.setFileNameGenerator(message -> { - if (message.getPayload() instanceof File) { - return ((File) message.getPayload()).getName(); - } else { - throw new IllegalArgumentException("File must expected as payload."); - } - }); - return handler; - } - - @Bean("reportsListSftpChannel") - public MessageChannel listSftpChannel(@Qualifier("reportsSftpHandlerList") MessageHandler handler) { - DirectChannel dc = new DirectChannel(); - dc.subscribe(handler); - return dc; - } - - @Bean("reportsToSftpChannel") - public MessageChannel toSftpChannel(@Qualifier("reportsSftpHandler") MessageHandler handler) { - DirectChannel dc = new DirectChannel(); - dc.subscribe(handler); - return dc; - } - - @Bean("reportsSftpHandlerList") - @ServiceActivator(inputChannel = "reportsListSftpChannel") - public MessageHandler handlerList(@Qualifier("reportsSftpSessionFactory") SessionFactory sessionFactory) { - String expression = "'/%s'".formatted(settings.getReportsStore().getOutDir()); - return new SftpOutboundGateway(sessionFactory, LS.getCommand(), expression); - } - - @Bean("reportsSftpOutboundListFlow") - public IntegrationFlow sftpOutboundListFlow(@Qualifier("reportsSftpSessionFactory") SessionFactory sessionFactory) { - return IntegrationFlows.from("reportsListSftpChannel") - .handle(new SftpOutboundGateway(sessionFactory, "ls", "payload")) - .get(); - } - - @MessagingGateway(name = "reportsSftpGateway") - public interface ReportsGateway { - @Gateway(requestChannel = "reportsToSftpChannel") - void sendToSftp(File file); - - @Gateway(requestChannel = "reportsListSftpChannel") - List listFiles(String dir); - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/ValidationConfig.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/ValidationConfig.java deleted file mode 100644 index 7bbaca4fc..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/ValidationConfig.java +++ /dev/null @@ -1,26 +0,0 @@ -package ru.spcex.clearing.registry.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import ru.spcex.clearing.registry.validation.ValuesOfMapNonNullRule; -import ru.spcex.platform.imdg.validation.ImdgValidationContext; -import ru.spcex.platform.utils.validation.IValidator; -import ru.spcex.platform.utils.validation.ValidatorImpl; - -import java.util.Map; -import java.util.function.Function; - -@Configuration -public class ValidationConfig { - - @Bean("fieldValuesValidator") - public Function, IValidator> fieldValuesValidator() { - return map -> { - ImdgValidationContext> context = new ImdgValidationContext<>(); - context.setValidatedObject(map); - return new ValidatorImpl<>(context, - new ValuesOfMapNonNullRule() - ); - }; - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/settings/RegistryServiceSettings.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/settings/RegistryServiceSettings.java deleted file mode 100644 index 439d99cbb..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/config/settings/RegistryServiceSettings.java +++ /dev/null @@ -1,59 +0,0 @@ -package ru.spcex.clearing.registry.config.settings; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.PropertySource; -import org.springframework.stereotype.Component; -import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings; -import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings; -import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; - -@Component -@PropertySource("file:${spring.config.location}/application.properties") -@ConfigurationProperties("registry-service") -public class RegistryServiceSettings { - private HazelcastClientParams hazelcast; - private KafkaConsumerSettings kafkaConsumer; - private KafkaProducerSettings kafkaProducer; - private ReportsStore reportsStore; - private boolean csvMode = false; - - public HazelcastClientParams getHazelcast() { - return hazelcast; - } - - public void setHazelcast(HazelcastClientParams hazelcast) { - this.hazelcast = hazelcast; - } - - public KafkaConsumerSettings getKafkaConsumer() { - return kafkaConsumer; - } - - public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) { - this.kafkaConsumer = kafkaConsumer; - } - - public KafkaProducerSettings getKafkaProducer() { - return kafkaProducer; - } - - public void setKafkaProducer(KafkaProducerSettings kafkaProducer) { - this.kafkaProducer = kafkaProducer; - } - - public ReportsStore getReportsStore() { - return reportsStore; - } - - public void setReportsStore(ReportsStore reportsStore) { - this.reportsStore = reportsStore; - } - - public boolean isCsvMode() { - return csvMode; - } - - public void setCsvMode(boolean csvMode) { - this.csvMode = csvMode; - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/exceptions/CmdArgsParserException.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/exceptions/CmdArgsParserException.java new file mode 100644 index 000000000..cb7ff0b69 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/exceptions/CmdArgsParserException.java @@ -0,0 +1,9 @@ +package ru.spcex.clearing.registry.exceptions; + +public class CmdArgsParserException extends RuntimeException { + public CmdArgsParserException(String message) { + super(message); + } + public CmdArgsParserException() { + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/exceptions/ConfigurationException.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/exceptions/ConfigurationException.java new file mode 100644 index 000000000..a0af402b9 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/exceptions/ConfigurationException.java @@ -0,0 +1,7 @@ +package ru.spcex.clearing.registry.exceptions; + +public class ConfigurationException extends RuntimeException { + public ConfigurationException(String message) { + super(message); + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/ReportUtils.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/ReportUtils.java index 4bf999f7c..91e202e88 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/ReportUtils.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/ReportUtils.java @@ -2,17 +2,38 @@ package ru.spcex.clearing.registry.reports; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; +import ru.spcex.clearing.registry.conf.SFTPReportsConfig; import java.io.File; +import java.sql.Date; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.time.Instant; +import java.time.LocalDate; import java.util.Collection; public class ReportUtils { private final static Logger log = LoggerFactory.getLogger(ReportUtils.class); + public static Instant getInstantFromTimestamp(ResultSet rs, String column) throws SQLException { + Timestamp date = rs.getTimestamp(column); + return date != null ? date.toInstant() : null; + } + + public static LocalDate getLocalDateFromSqlDate(ResultSet rs, String column) throws SQLException { + Date date = rs.getDate(column); + return date != null ? date.toLocalDate() : null; + } + public static void sendFilesToSftp(Collection files, SFTPReportsConfig.ReportsGateway reportsGateway, boolean deleteAfterSend) { + if (reportsGateway == null) { + log.debug("SFTP disabled. Do not send files."); + return; + } + log.debug("Send file {} to SFTP...", files); for (File file : files) { reportsGateway.sendToSftp(file); if (deleteAfterSend) { @@ -23,6 +44,4 @@ public class ReportUtils { } } } - - } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/AbstractDictionary.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/AbstractDictionary.java new file mode 100644 index 000000000..1c87b41f1 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/AbstractDictionary.java @@ -0,0 +1,35 @@ +package ru.spcex.clearing.registry.reports.bean; + +public abstract class AbstractDictionary extends SpcexDBBase implements Dictionary { + protected String code; + protected String name; + + @Override + public String getCode() { + return code; + } + + @Override + public void setCode(String code) { + this.code = code; + } + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "id=" + id + + ", code='" + code + '\'' + + ", name='" + name + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Account.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Account.java new file mode 100644 index 000000000..b022e3198 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Account.java @@ -0,0 +1,31 @@ +package ru.spcex.clearing.registry.reports.bean; + +public class Account { + private Long id; + private String account; + private String accountType; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getAccountType() { + return accountType; + } + + public void setAccountType(String accountType) { + this.accountType = accountType; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/AllowedDictionary.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/AllowedDictionary.java new file mode 100644 index 000000000..db97a00d7 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/AllowedDictionary.java @@ -0,0 +1,7 @@ +package ru.spcex.clearing.registry.reports.bean; + +/** + * Database table: ALLOWED_DICTIONARY + */ +public class AllowedDictionary extends AbstractDictionary { +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/BusinessEvent.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/BusinessEvent.java new file mode 100644 index 000000000..4b8292990 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/BusinessEvent.java @@ -0,0 +1,48 @@ +package ru.spcex.clearing.registry.reports.bean; + +import java.time.Instant; + +public abstract class BusinessEvent extends SpcexDBBase { + + private Instant eventTime; + private Long userId; + private String eventType; + + public Instant getEventTime() { + return eventTime; + } + + public void setEventTime(Instant eventTime) { + this.eventTime = eventTime; + } + + public String getEventType() { + return eventType; + } + + public void setEventType(String eventType) { + this.eventType = eventType; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public abstract T getObject(); + + public abstract void setObject(T object); + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "eventTime=" + eventTime + + "eventType=" + eventType + + ", userId=" + userId + + ", object=" + getObject() + + '}'; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/BusinessObject.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/BusinessObject.java new file mode 100644 index 000000000..327b52b8c --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/BusinessObject.java @@ -0,0 +1,27 @@ +package ru.spcex.clearing.registry.reports.bean; + +import java.time.Instant; + +/** + * UUID - Long based with field object + */ +public abstract class BusinessObject extends SpcexDBBase { + private Instant created; + private Instant updated; + + public Instant getCreated() { + return created; + } + + public void setCreated(Instant created) { + this.created = created; + } + + public Instant getUpdated() { + return updated; + } + + public void setUpdated(Instant updated) { + this.updated = updated; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Company.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Company.java new file mode 100644 index 000000000..a5b05fad4 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Company.java @@ -0,0 +1,31 @@ +package ru.spcex.clearing.registry.reports.bean; + +public class Company { + private Long id; + private String clearingCode; + private String shortName; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getClearingCode() { + return clearingCode; + } + + public void setClearingCode(String clearingCode) { + this.clearingCode = clearingCode; + } + + public String getShortName() { + return shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/CompanySymbol.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/CompanySymbol.java new file mode 100644 index 000000000..eae510af3 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/CompanySymbol.java @@ -0,0 +1,36 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.helpers.IEnumKey; + +public enum CompanySymbol implements IEnumKey { + OCVD("OCVD"), + CPP("CPP"), + OCPO("OCPO"), + OGRN("OGRN"), + INN("INN"), + BIC("BIC"), + CIO("CIO"), + UUID("UUID"), + TRDC("TRDC"), + CLRC("CLRC"), + INTC("INTC"), + RGRC("RGRC"), + LICB("LICB"), + LICR("LICR"), + LICD("LICD"), + LICT("LICT"), + LICC("LICC"), + LICF("LICF"), + ; + + private final String key; + + CompanySymbol(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/CompanySymbols.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/CompanySymbols.java new file mode 100644 index 000000000..8d6cb4ce3 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/CompanySymbols.java @@ -0,0 +1,34 @@ +package ru.spcex.clearing.registry.reports.bean; + +/** + * DB: COMPANY_SYMBOLS + */ +public class CompanySymbols extends SpcexDBBase { + private Long companyId; + private String companySymbol; + private String companySymbolValue; + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } + + public String getCompanySymbol() { + return companySymbol; + } + + public void setCompanySymbol(String companySymbol) { + this.companySymbol = companySymbol; + } + + public String getCompanySymbolValue() { + return companySymbolValue; + } + + public void setCompanySymbolValue(String companySymbolValue) { + this.companySymbolValue = companySymbolValue; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Dictionary.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Dictionary.java new file mode 100644 index 000000000..2b44f0134 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Dictionary.java @@ -0,0 +1,21 @@ +package ru.spcex.clearing.registry.reports.bean; + +import java.io.Serializable; + +/** + * Словарь. + */ +public interface Dictionary extends Serializable { + + Long getId(); + + void setId(Long id); + + String getCode(); + + void setCode(String code); + + String getName(); + + void setName(String name); +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionCommon.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionCommon.java new file mode 100644 index 000000000..da3bbf3a1 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionCommon.java @@ -0,0 +1,320 @@ +package ru.spcex.clearing.registry.reports.bean; + +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; + +public abstract class ExecutionCommon extends BusinessObject { + protected Long exchangeExecutionId; + protected Instant exchangeExecutionTime; + protected LocalDate tradingDate; + protected Long tradingClearingRegistryId; + protected String partyTradingClearingRegistry; + protected String counterPartyTradingClearingRegistry; + protected String market; + protected BigDecimal price; + protected BigDecimal lots; + protected BigDecimal quantity; + protected BigDecimal interestAmount; + protected String side; + protected String settlementCurrency; + protected Long companyId; + protected Long duration; + protected String securityFullName; + protected String securitySymbol; + protected Long securityId; + protected Long counterPartyId; + protected String coverageStatus; + protected Long sessionId; + protected LocalDate clearingDate; + protected Long counterPartyTradingClearingRegistryId; + + // No DB fields + private String sellerTkrCode; + private String buyerTkrCode; + private String counterPartyIdFromCompany; + private String companyIdFromCompany; + + private String buyerCode; + private String sellerCode; + private String buyer; + private String seller; + + private String status; + + + public abstract ExecutionType type(); + + public LocalDate getClearingDate() { + return clearingDate; + } + + public void setClearingDate(LocalDate value) { + this.clearingDate = value; + } + + public Long getExchangeExecutionId() { + return exchangeExecutionId; + } + + public void setExchangeExecutionId(Long value) { + this.exchangeExecutionId = value; + } + + public String getSide() { + return side; + } + + public void setSide(String value) { + this.side = value; + } + + public String getMarket() { + return market; + } + + public void setMarket(String value) { + this.market = value; + } + + public LocalDate getTradingDate() { + return tradingDate; + } + + public void setTradingDate(LocalDate value) { + this.tradingDate = value; + } + + public String getSecuritySymbol() { + return securitySymbol; + } + + public void setSecuritySymbol(String value) { + this.securitySymbol = value; + } + + public Long getSecurityId() { + return securityId; + } + + public void setSecurityId(Long value) { + this.securityId = value; + } + + public BigDecimal getInterestAmount() { + return interestAmount; + } + + public void setInterestAmount(BigDecimal value) { + this.interestAmount = value; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal value) { + this.price = value; + } + + public BigDecimal getLots() { + return lots; + } + + public void setLots(BigDecimal value) { + this.lots = value; + } + + public BigDecimal getQuantity() { + return quantity; + } + + public void setQuantity(BigDecimal value) { + this.quantity = value; + } + + public Instant getExchangeExecutionTime() { + return exchangeExecutionTime; + } + + public void setExchangeExecutionTime(Instant value) { + this.exchangeExecutionTime = value; + } + + public Long getDuration() { + return duration; + } + + public void setDuration(Long value) { + this.duration = value; + } + + public Long getTradingClearingRegistryId() { + return tradingClearingRegistryId; + } + + public void setTradingClearingRegistryId(Long value) { + this.tradingClearingRegistryId = value; + } + + public String getPartyTradingClearingRegistry() { + return partyTradingClearingRegistry; + } + + public void setPartyTradingClearingRegistry(String partyTradingClearingRegistry) { + this.partyTradingClearingRegistry = partyTradingClearingRegistry; + } + + public String getCounterPartyTradingClearingRegistry() { + return counterPartyTradingClearingRegistry; + } + + public void setCounterPartyTradingClearingRegistry(String counterPartyTradingClearingRegistry) { + this.counterPartyTradingClearingRegistry = counterPartyTradingClearingRegistry; + } + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long value) { + this.companyId = value; + } + + public Long getCounterPartyId() { + return counterPartyId; + } + + public void setCounterPartyId(Long value) { + this.counterPartyId = value; + } + + public String getSecurityFullName() { + return securityFullName; + } + + public void setSecurityFullName(String value) { + this.securityFullName = value; + } + + public String getSettlementCurrency() { + return settlementCurrency; + } + + public void setSettlementCurrency(String value) { + this.settlementCurrency = value; + } + + public String getCoverageStatus() { + return coverageStatus; + } + + public void setCoverageStatus(String value) { + this.coverageStatus = value; + } + + public Long getSessionId() { + return sessionId; + } + + public void setSessionId(Long value) { + this.sessionId = value; + } + + public Long getCounterPartyTradingClearingRegistryId() { + return counterPartyTradingClearingRegistryId; + } + + public void setCounterPartyTradingClearingRegistryId(Long counterPartyTradingClearingRegistryId) { + this.counterPartyTradingClearingRegistryId = counterPartyTradingClearingRegistryId; + } + + public String getSellerTkrCode() { + return sellerTkrCode; + } + + public void setSellerTkrCode(String sellerTkrCode) { + this.sellerTkrCode = sellerTkrCode; + } + + public String getCounterPartyIdFromCompany() { + return counterPartyIdFromCompany; + } + + public void setCounterPartyIdFromCompany(String counterPartyIdFromCompany) { + this.counterPartyIdFromCompany = counterPartyIdFromCompany; + } + + public String getCompanyIdFromCompany() { + return companyIdFromCompany; + } + + public void setCompanyIdFromCompany(String companyIdFromCompany) { + this.companyIdFromCompany = companyIdFromCompany; + } + + public String getBuyerCode() { + return buyerCode; + } + + public void setBuyerCode(String buyerCode) { + this.buyerCode = buyerCode; + } + + public String getSellerCode() { + return sellerCode; + } + + public void setSellerCode(String sellerCode) { + this.sellerCode = sellerCode; + } + + public String getBuyer() { + return buyer; + } + + public void setBuyer(String buyer) { + this.buyer = buyer; + } + + public String getSeller() { + return seller; + } + + public void setSeller(String seller) { + this.seller = seller; + } + + public String getBuyerTkrCode() { + return buyerTkrCode; + } + + public void setBuyerTkrCode(String buyerTkrCode) { + this.buyerTkrCode = buyerTkrCode; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ExecutionCommon that = (ExecutionCommon) o; + + return getExchangeExecutionId() != null ? getExchangeExecutionId().equals(that.getExchangeExecutionId()) : that.getExchangeExecutionId() == null; + } + + @Override + public int hashCode() { + int result = 1; + result = 31 * result + (getExchangeExecutionId() != null ? getExchangeExecutionId().hashCode() : 0); + return result; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionCurrency.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionCurrency.java new file mode 100644 index 000000000..b69fe55ad --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionCurrency.java @@ -0,0 +1,78 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.IDBObject; + +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; + +public class ExecutionCurrency extends ExecutionCommon implements IDBObject { + private Long exchangeOrderId; + private BigDecimal settlementAmount; + private String comment; + private Long clientCodeId; + private String settlementCode; + private LocalDate settlementDate; + private Instant exchangeExecutionMicroseconds; + + @Override + public ExecutionType type() { + return ExecutionType.ExecutionCurrency; + } + + public Long getExchangeOrderId() { + return exchangeOrderId; + } + + public void setExchangeOrderId(Long exchangeOrderId) { + this.exchangeOrderId = exchangeOrderId; + } + + public BigDecimal getSettlementAmount() { + return settlementAmount; + } + + public void setSettlementAmount(BigDecimal settlementAmount) { + this.settlementAmount = settlementAmount; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public Long getClientCodeId() { + return clientCodeId; + } + + public void setClientCodeId(Long clientCodeId) { + this.clientCodeId = clientCodeId; + } + + public String getSettlementCode() { + return settlementCode; + } + + public void setSettlementCode(String settlementCode) { + this.settlementCode = settlementCode; + } + + public LocalDate getSettlementDate() { + return settlementDate; + } + + public void setSettlementDate(LocalDate settlementDate) { + this.settlementDate = settlementDate; + } + + public Instant getExchangeExecutionMicroseconds() { + return exchangeExecutionMicroseconds; + } + + public void setExchangeExecutionMicroseconds(Instant exchangeExecutionMicroseconds) { + this.exchangeExecutionMicroseconds = exchangeExecutionMicroseconds; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionDeposit.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionDeposit.java new file mode 100644 index 000000000..c3d406355 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionDeposit.java @@ -0,0 +1,87 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.IDBObject; + +import java.math.BigDecimal; +import java.time.LocalDate; + +public class ExecutionDeposit extends ExecutionCommon implements IDBObject { + private BigDecimal firstLegAmount; + private BigDecimal secondLegAmount; + private LocalDate firstLegSettlementDate; + private LocalDate secondLegSettlementDate; + private String firstLegSettlementCode; + private String secondLegSettlementCode; + private String contract; + private String securityCode; + + @Override + public ExecutionType type() { + return ExecutionType.ExecutionDeposit; + } + + public BigDecimal getFirstLegAmount() { + return firstLegAmount; + } + + public void setFirstLegAmount(BigDecimal firstLegAmount) { + this.firstLegAmount = firstLegAmount; + } + + public BigDecimal getSecondLegAmount() { + return secondLegAmount; + } + + public void setSecondLegAmount(BigDecimal secondLegAmount) { + this.secondLegAmount = secondLegAmount; + } + + public LocalDate getFirstLegSettlementDate() { + return firstLegSettlementDate; + } + + public void setFirstLegSettlementDate(LocalDate firstLegSettlementDate) { + this.firstLegSettlementDate = firstLegSettlementDate; + } + + public LocalDate getSecondLegSettlementDate() { + return secondLegSettlementDate; + } + + public void setSecondLegSettlementDate(LocalDate secondLegSettlementDate) { + this.secondLegSettlementDate = secondLegSettlementDate; + } + + public String getFirstLegSettlementCode() { + return firstLegSettlementCode; + } + + public void setFirstLegSettlementCode(String firstLegSettlementCode) { + this.firstLegSettlementCode = firstLegSettlementCode; + } + + public String getSecondLegSettlementCode() { + return secondLegSettlementCode; + } + + public void setSecondLegSettlementCode(String secondLegSettlementCode) { + this.secondLegSettlementCode = secondLegSettlementCode; + } + + public String getContract() { + return contract; + } + + public void setContract(String contract) { + this.contract = contract; + } + + public String getSecurityCode() { + return securityCode; + } + + public void setSecurityCode(String securityCode) { + this.securityCode = securityCode; + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionFond.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionFond.java new file mode 100644 index 000000000..286876b9e --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionFond.java @@ -0,0 +1,79 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.IDBObject; + +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; + +public class ExecutionFond extends ExecutionCommon implements IDBObject { + private Long exchangeOrderId; + private BigDecimal settlementAmount; + private String comment; + private Long clientCodeId; + private String settlementCode; + private LocalDate settlementDate; + private Instant exchangeExecutionMicroseconds; + + @Override + public ExecutionType type() { + return ExecutionType.ExecutionFond; + } + + public Long getExchangeOrderId() { + return exchangeOrderId; + } + + public void setExchangeOrderId(Long exchangeOrderId) { + this.exchangeOrderId = exchangeOrderId; + } + + public BigDecimal getSettlementAmount() { + return settlementAmount; + } + + public void setSettlementAmount(BigDecimal settlementAmount) { + this.settlementAmount = settlementAmount; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public Long getClientCodeId() { + return clientCodeId; + } + + public void setClientCodeId(Long clientCodeId) { + this.clientCodeId = clientCodeId; + } + + public String getSettlementCode() { + return settlementCode; + } + + public void setSettlementCode(String settlementCode) { + this.settlementCode = settlementCode; + } + + public LocalDate getSettlementDate() { + return settlementDate; + } + + public void setSettlementDate(LocalDate settlementDate) { + this.settlementDate = settlementDate; + } + + public Instant getExchangeExecutionMicroseconds() { + return exchangeExecutionMicroseconds; + } + + public void setExchangeExecutionMicroseconds(Instant exchangeExecutionMicroseconds) { + this.exchangeExecutionMicroseconds = exchangeExecutionMicroseconds; + } + +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionType.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionType.java new file mode 100644 index 000000000..6ade41156 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionType.java @@ -0,0 +1,5 @@ +package ru.spcex.clearing.registry.reports.bean; + +public enum ExecutionType { + ExecutionDeposit, ExecutionFond, ExecutionCurrency; +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/FileReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/FileReport.java deleted file mode 100644 index 223462e4c..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/FileReport.java +++ /dev/null @@ -1,4 +0,0 @@ -package ru.spcex.clearing.registry.reports.bean; - -public interface FileReport { -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyFlowSide.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyFlowSide.java new file mode 100644 index 000000000..0821fa6c9 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyFlowSide.java @@ -0,0 +1,21 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.helpers.IEnumKey; + +public enum MoneyFlowSide implements IEnumKey { + BUY("BUY"), + SELL("SELL"), + ; + + private final String key; + + MoneyFlowSide(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ObjectType.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ObjectType.java new file mode 100644 index 000000000..93fed8100 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ObjectType.java @@ -0,0 +1,5 @@ +package ru.spcex.clearing.registry.reports.bean; + +public enum ObjectType { + EXECUTION_FOND, EXECUTION_DEPOSIT, MONEY_PAYMENT_INSTRUCTION, DEPO_PAYMENT_INSTRUCTION, REGISTRY_HISTORY +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/PaymentInstruction.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/PaymentInstruction.java new file mode 100644 index 000000000..1bb0eef6e --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/PaymentInstruction.java @@ -0,0 +1,360 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.IDBObject; + +import java.math.BigDecimal; +import java.time.Instant; +import java.time.LocalDate; + +public class PaymentInstruction extends BusinessObject implements IDBObject { + private Long senderId; + private Long addresseeId; + private String payeeBic; + private String addresseeBic; + private String payeeBankName; + private String addresseeBankName; + private Instant paymentDate; + private String paymentPurpose; + private LocalDate settlementDate; + private BigDecimal creditLeg_amount; + private BigDecimal debitLeg_amount; + private Long creditLeg_accountId; + private String credit_csAccount; + private String creditLeg_account; + private Long debitLeg_accountId; + private String debit_csAccount; + private String debitLeg_account; + private String creditLeg_direction; + private String debitLeg_direction; + private String creditLeg_currencyCode; + private String debitLeg_currencyCode; + private Long creditLeg_securityId; + private Long debitLeg_securityId; + private String transactionStatus; + private String documentNumber; + private LocalDate clearingDate; + private Long sessionId; + + // No DB fields (for depoInstruction) + private String creditLegAccountStr; + private String debitLegAccountStr; + private String senderCompanyShortName; + private String senderCompanyClearingCode; + private String addresseeCompanyShortName; + private String addresseeCompanyClearingCode; + + // No DB fields (for moneyInstruction) + private String sender; + private String senderClearingCode; + private String addressee; + private String addresseeClearingCode; + + // No DB fields (for depoInstruction) + private String security; + + + + public Long getSenderId() { + return senderId; + } + + public void setSenderId(Long senderId) { + this.senderId = senderId; + } + + public Long getAddresseeId() { + return addresseeId; + } + + public void setAddresseeId(Long addresseeId) { + this.addresseeId = addresseeId; + } + + public String getPayeeBic() { + return payeeBic; + } + + public void setPayeeBic(String payeeBic) { + this.payeeBic = payeeBic; + } + + public String getAddresseeBic() { + return addresseeBic; + } + + public void setAddresseeBic(String addresseeBic) { + this.addresseeBic = addresseeBic; + } + + public String getPayeeBankName() { + return payeeBankName; + } + + public void setPayeeBankName(String payeeBankName) { + this.payeeBankName = payeeBankName; + } + + public String getAddresseeBankName() { + return addresseeBankName; + } + + public void setAddresseeBankName(String addresseeBankName) { + this.addresseeBankName = addresseeBankName; + } + + public Instant getPaymentDate() { + return paymentDate; + } + + public void setPaymentDate(Instant paymentDate) { + this.paymentDate = paymentDate; + } + + public String getPaymentPurpose() { + return paymentPurpose; + } + + public void setPaymentPurpose(String paymentPurpose) { + this.paymentPurpose = paymentPurpose; + } + + public LocalDate getSettlementDate() { + return settlementDate; + } + + public void setSettlementDate(LocalDate settlementDate) { + this.settlementDate = settlementDate; + } + + public BigDecimal getCreditLeg_amount() { + return creditLeg_amount; + } + + public void setCreditLeg_amount(BigDecimal creditLeg_amount) { + this.creditLeg_amount = creditLeg_amount; + } + + public BigDecimal getDebitLeg_amount() { + return debitLeg_amount; + } + + public void setDebitLeg_amount(BigDecimal debitLeg_amount) { + this.debitLeg_amount = debitLeg_amount; + } + + public Long getCreditLeg_accountId() { + return creditLeg_accountId; + } + + public void setCreditLeg_accountId(Long creditLeg_accountId) { + this.creditLeg_accountId = creditLeg_accountId; + } + + public String getCredit_csAccount() { + return credit_csAccount; + } + + public void setCredit_csAccount(String credit_csAccount) { + this.credit_csAccount = credit_csAccount; + } + + public String getCreditLeg_account() { + return creditLeg_account; + } + + public void setCreditLeg_account(String creditLeg_account) { + this.creditLeg_account = creditLeg_account; + } + + public Long getDebitLeg_accountId() { + return debitLeg_accountId; + } + + public void setDebitLeg_accountId(Long debitLeg_accountId) { + this.debitLeg_accountId = debitLeg_accountId; + } + + public String getDebit_csAccount() { + return debit_csAccount; + } + + public void setDebit_csAccount(String debit_csAccount) { + this.debit_csAccount = debit_csAccount; + } + + public String getDebitLeg_account() { + return debitLeg_account; + } + + public void setDebitLeg_account(String debitLeg_account) { + this.debitLeg_account = debitLeg_account; + } + + public String getCreditLeg_direction() { + return creditLeg_direction; + } + + public void setCreditLeg_direction(String creditLeg_direction) { + this.creditLeg_direction = creditLeg_direction; + } + + public String getDebitLeg_direction() { + return debitLeg_direction; + } + + public void setDebitLeg_direction(String debitLeg_direction) { + this.debitLeg_direction = debitLeg_direction; + } + + public String getCreditLeg_currencyCode() { + return creditLeg_currencyCode; + } + + public void setCreditLeg_currencyCode(String creditLeg_currencyCode) { + this.creditLeg_currencyCode = creditLeg_currencyCode; + } + + public String getDebitLeg_currencyCode() { + return debitLeg_currencyCode; + } + + public void setDebitLeg_currencyCode(String debitLeg_currencyCode) { + this.debitLeg_currencyCode = debitLeg_currencyCode; + } + + public Long getCreditLeg_securityId() { + return creditLeg_securityId; + } + + public void setCreditLeg_securityId(Long creditLeg_securityId) { + this.creditLeg_securityId = creditLeg_securityId; + } + + public Long getDebitLeg_securityId() { + return debitLeg_securityId; + } + + public void setDebitLeg_securityId(Long debitLeg_securityId) { + this.debitLeg_securityId = debitLeg_securityId; + } + + public String getTransactionStatus() { + return transactionStatus; + } + + public void setTransactionStatus(String transactionStatus) { + this.transactionStatus = transactionStatus; + } + + public String getDocumentNumber() { + return documentNumber; + } + + public void setDocumentNumber(String documentNumber) { + this.documentNumber = documentNumber; + } + + public LocalDate getClearingDate() { + return clearingDate; + } + + public void setClearingDate(LocalDate clearingDate) { + this.clearingDate = clearingDate; + } + + public Long getSessionId() { + return sessionId; + } + + public void setSessionId(Long sessionId) { + this.sessionId = sessionId; + } + + public String getCreditLegAccountStr() { + return creditLegAccountStr; + } + + public void setCreditLegAccountStr(String creditLegAccountStr) { + this.creditLegAccountStr = creditLegAccountStr; + } + + public String getDebitLegAccountStr() { + return debitLegAccountStr; + } + + public void setDebitLegAccountStr(String debitLegAccountStr) { + this.debitLegAccountStr = debitLegAccountStr; + } + + public String getSenderCompanyShortName() { + return senderCompanyShortName; + } + + public void setSenderCompanyShortName(String senderCompanyShortName) { + this.senderCompanyShortName = senderCompanyShortName; + } + + public String getSenderCompanyClearingCode() { + return senderCompanyClearingCode; + } + + public void setSenderCompanyClearingCode(String senderCompanyClearingCode) { + this.senderCompanyClearingCode = senderCompanyClearingCode; + } + + public String getAddresseeCompanyShortName() { + return addresseeCompanyShortName; + } + + public void setAddresseeCompanyShortName(String addresseeCompanyShortName) { + this.addresseeCompanyShortName = addresseeCompanyShortName; + } + + public String getAddresseeCompanyClearingCode() { + return addresseeCompanyClearingCode; + } + + public void setAddresseeCompanyClearingCode(String addresseeCompanyClearingCode) { + this.addresseeCompanyClearingCode = addresseeCompanyClearingCode; + } + + public String getSender() { + return sender; + } + + public void setSender(String sender) { + this.sender = sender; + } + + public String getAddressee() { + return addressee; + } + + public void setAddressee(String addressee) { + this.addressee = addressee; + } + + public String getSenderClearingCode() { + return senderClearingCode; + } + + public void setSenderClearingCode(String senderClearingCode) { + this.senderClearingCode = senderClearingCode; + } + + public String getAddresseeClearingCode() { + return addresseeClearingCode; + } + + public void setAddresseeClearingCode(String addresseeClearingCode) { + this.addresseeClearingCode = addresseeClearingCode; + } + + public String getSecurity() { + return security; + } + + public void setSecurity(String security) { + this.security = security; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Registry.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Registry.java new file mode 100644 index 000000000..b4d326ddb --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Registry.java @@ -0,0 +1,430 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.IDBObject; + +import java.math.BigDecimal; +import java.time.LocalDate; + +public class Registry extends BusinessObject implements IDBObject { + private Long companyId; + private String tradingCode; + private String clearingCode; + private String shortName; + private String fullName; + private Long accountId; + private String accountType; + private String account; + private String registryDesignation; + private String registryInstrumentType; + private String registryCapacity; + private String registryUnit; + private String registryCode; + private Long tradingClearingRegistryId; + private String tradingClearingRegistry; + private String registryStatus; + private String registryStatus_dictionary; + private Long securityId; + private String securitySymbol; + private BigDecimal balance; + private BigDecimal openBalance; + private BigDecimal closeBalance; + private BigDecimal credit; + private BigDecimal debit; + private BigDecimal settledCredit; + private BigDecimal settledDebit; + private BigDecimal checkBalance; + private BigDecimal diffBalance; + private BigDecimal planBalance; + private String balanceDimension; + private LocalDate settlementDate; + private String settlementCode; + private LocalDate tradingDate; + private LocalDate clearingDate; + private LocalDate refundDate; + private LocalDate valueDate; + private BigDecimal price; + private String contract; + private Long counterPartyId; + private String comment; + private Long parentId; + private Long groupId; + private Long sessionId; + private String sessionType; + private String sessionType_dictionary; + private Long paymentId; + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } + + public String getTradingCode() { + return tradingCode; + } + + public void setTradingCode(String tradingCode) { + this.tradingCode = tradingCode; + } + + public String getClearingCode() { + return clearingCode; + } + + public void setClearingCode(String clearingCode) { + this.clearingCode = clearingCode; + } + + public String getShortName() { + return shortName; + } + + public void setShortName(String shortName) { + this.shortName = shortName; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public Long getAccountId() { + return accountId; + } + + public void setAccountId(Long accountId) { + this.accountId = accountId; + } + + public String getAccountType() { + return accountType; + } + + public void setAccountType(String accountType) { + this.accountType = accountType; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getRegistryDesignation() { + return registryDesignation; + } + + public void setRegistryDesignation(String registryDesignation) { + this.registryDesignation = registryDesignation; + } + + public String getRegistryInstrumentType() { + return registryInstrumentType; + } + + public void setRegistryInstrumentType(String registryInstrumentType) { + this.registryInstrumentType = registryInstrumentType; + } + + public String getRegistryCapacity() { + return registryCapacity; + } + + public void setRegistryCapacity(String registryCapacity) { + this.registryCapacity = registryCapacity; + } + + public String getRegistryUnit() { + return registryUnit; + } + + public void setRegistryUnit(String registryUnit) { + this.registryUnit = registryUnit; + } + + public String getRegistryCode() { + return registryCode; + } + + public void setRegistryCode(String registryCode) { + this.registryCode = registryCode; + } + + public Long getTradingClearingRegistryId() { + return tradingClearingRegistryId; + } + + public void setTradingClearingRegistryId(Long tradingClearingRegistryId) { + this.tradingClearingRegistryId = tradingClearingRegistryId; + } + + public String getTradingClearingRegistry() { + return tradingClearingRegistry; + } + + public void setTradingClearingRegistry(String tradingClearingRegistry) { + this.tradingClearingRegistry = tradingClearingRegistry; + } + + public String getRegistryStatus() { + return registryStatus; + } + + public void setRegistryStatus(String registryStatus) { + this.registryStatus = registryStatus; + } + + public String getRegistryStatus_dictionary() { + return registryStatus_dictionary; + } + + public void setRegistryStatus_dictionary(String registryStatus_dictionary) { + this.registryStatus_dictionary = registryStatus_dictionary; + } + + public Long getSecurityId() { + return securityId; + } + + public void setSecurityId(Long securityId) { + this.securityId = securityId; + } + + public String getSecuritySymbol() { + return securitySymbol; + } + + public void setSecuritySymbol(String securitySymbol) { + this.securitySymbol = securitySymbol; + } + + public BigDecimal getBalance() { + if (balance == null) { + balance = BigDecimal.ZERO; + } + return balance; + } + + public void setBalance(BigDecimal balance) { + if (balance == null) { + balance = BigDecimal.ZERO; + } + this.balance = balance; + } + + public BigDecimal getOpenBalance() { + return openBalance; + } + + public void setOpenBalance(BigDecimal openBalance) { + this.openBalance = openBalance; + } + + public BigDecimal getCloseBalance() { + return closeBalance; + } + + public void setCloseBalance(BigDecimal closeBalance) { + this.closeBalance = closeBalance; + } + + public BigDecimal getCredit() { + return credit; + } + + public void setCredit(BigDecimal credit) { + this.credit = credit; + } + + public BigDecimal getDebit() { + return debit; + } + + public void setDebit(BigDecimal debit) { + this.debit = debit; + } + + public BigDecimal getSettledCredit() { + return settledCredit; + } + + public void setSettledCredit(BigDecimal settledCredit) { + this.settledCredit = settledCredit; + } + + public BigDecimal getSettledDebit() { + return settledDebit; + } + + public void setSettledDebit(BigDecimal settledDebit) { + this.settledDebit = settledDebit; + } + + public BigDecimal getCheckBalance() { + return checkBalance; + } + + public void setCheckBalance(BigDecimal checkBalance) { + this.checkBalance = checkBalance; + } + + public BigDecimal getDiffBalance() { + return diffBalance; + } + + public void setDiffBalance(BigDecimal diffBalance) { + this.diffBalance = diffBalance; + } + + public BigDecimal getPlanBalance() { + return planBalance; + } + + public void setPlanBalance(BigDecimal planBalance) { + this.planBalance = planBalance; + } + + public String getBalanceDimension() { + return balanceDimension; + } + + public void setBalanceDimension(String balanceDimension) { + this.balanceDimension = balanceDimension; + } + + public LocalDate getSettlementDate() { + return settlementDate; + } + + public void setSettlementDate(LocalDate settlementDate) { + this.settlementDate = settlementDate; + } + + public String getSettlementCode() { + return settlementCode; + } + + public void setSettlementCode(String settlementCode) { + this.settlementCode = settlementCode; + } + + public LocalDate getTradingDate() { + return tradingDate; + } + + public void setTradingDate(LocalDate tradingDate) { + this.tradingDate = tradingDate; + } + + public LocalDate getClearingDate() { + return clearingDate; + } + + public void setClearingDate(LocalDate clearingDate) { + this.clearingDate = clearingDate; + } + + public LocalDate getRefundDate() { + return refundDate; + } + + public void setRefundDate(LocalDate refundDate) { + this.refundDate = refundDate; + } + + public LocalDate getValueDate() { + return valueDate; + } + + public void setValueDate(LocalDate valueDate) { + this.valueDate = valueDate; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public String getContract() { + return contract; + } + + public void setContract(String contract) { + this.contract = contract; + } + + public Long getCounterPartyId() { + return counterPartyId; + } + + public void setCounterPartyId(Long counterPartyId) { + this.counterPartyId = counterPartyId; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public Long getGroupId() { + return groupId; + } + + public void setGroupId(Long groupId) { + this.groupId = groupId; + } + + public Long getSessionId() { + return sessionId; + } + + public void setSessionId(Long sessionId) { + this.sessionId = sessionId; + } + + public String getSessionType() { + return sessionType; + } + + public void setSessionType(String sessionType) { + this.sessionType = sessionType; + } + + public String getSessionType_dictionary() { + return sessionType_dictionary; + } + + public void setSessionType_dictionary(String sessionType_dictionary) { + this.sessionType_dictionary = sessionType_dictionary; + } + + public Long getPaymentId() { + return paymentId; + } + + public void setPaymentId(Long paymentId) { + this.paymentId = paymentId; + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryHistory.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryHistory.java new file mode 100644 index 000000000..84fe878cb --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryHistory.java @@ -0,0 +1,37 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.IDBObject; + +public class RegistryHistory extends BusinessEvent implements IDBObject { + private Registry object; + + // No DB fields + private String houseName; + private String account; + + @Override + public Registry getObject() { + return object; + } + + @Override + public void setObject(Registry object) { + this.object = object; + } + + public String getHouseName() { + return houseName; + } + + public void setHouseName(String houseName) { + this.houseName = houseName; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryStatus.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryStatus.java new file mode 100644 index 000000000..6f123b568 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryStatus.java @@ -0,0 +1,28 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.helpers.IEnumKey; + +public enum RegistryStatus implements IEnumKey { + OK("OK"), + CLRD("CLRD"), + PROC("PROC"), + NACK("NACK"), + NACC("NACC"), + FAIL("FAIL"), + UNCV("UNCV"), + MNG("MNG"), + POOL("POOL"), + SPLT("SPLT") + ; + + private final String key; + + RegistryStatus(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryStatusDictionary.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryStatusDictionary.java new file mode 100644 index 000000000..6a7775506 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/RegistryStatusDictionary.java @@ -0,0 +1,11 @@ +package ru.spcex.clearing.registry.reports.bean; + + +/** + * Справочник статусов регистров + * + * Dictionary DB table: REGISTRY_STATUS_DICTIONARY + **/ +public class RegistryStatusDictionary extends AbstractDictionary { + +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Security.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Security.java new file mode 100644 index 000000000..7c596f3e8 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Security.java @@ -0,0 +1,17 @@ +package ru.spcex.clearing.registry.reports.bean; + +/** + * Инструменты + * DB table: SECURITY + **/ +public class Security extends BusinessObject { + private String securitySymbol; + + public String getSecuritySymbol() { + return securitySymbol; + } + + public void setSecuritySymbol(String securitySymbol) { + this.securitySymbol = securitySymbol; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/SessionTypeDictionary.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/SessionTypeDictionary.java new file mode 100644 index 000000000..09c956df4 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/SessionTypeDictionary.java @@ -0,0 +1,10 @@ +package ru.spcex.clearing.registry.reports.bean; + +/** + * Справочник типов клиринговых сессий + * + * Dictionary DB table: SESSION_TYPE_DICTIONARY + **/ +public class SessionTypeDictionary extends AbstractDictionary { + +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Side.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Side.java new file mode 100644 index 000000000..26554b34d --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/Side.java @@ -0,0 +1,21 @@ +package ru.spcex.clearing.registry.reports.bean; + +import ru.spcex.clearing.registry.reports.loaders.helpers.IEnumKey; + +public enum Side implements IEnumKey { + BUY("B"), + SELL("S"), + ; + + private final String key; + + Side(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/SpcexDBBase.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/SpcexDBBase.java new file mode 100644 index 000000000..54faa895f --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/SpcexDBBase.java @@ -0,0 +1,37 @@ +package ru.spcex.clearing.registry.reports.bean; + +import java.io.Serializable; + +public abstract class SpcexDBBase implements Serializable { + + protected Long id; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + @Override + public String toString() { + return String.format("%s{id=%d}", getClass().getSimpleName(), getId()); + } + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + SpcexDBBase clrxObject = (SpcexDBBase) o; + + return id.equals(clrxObject.id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/TradingClearingRegistry.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/TradingClearingRegistry.java new file mode 100644 index 000000000..a3222691d --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/TradingClearingRegistry.java @@ -0,0 +1,18 @@ +package ru.spcex.clearing.registry.reports.bean; + +/** + * Торгово-клиринговый регистр + *

+ * DB table: TRADING_CLEARING_REGISTRY + **/ +public class TradingClearingRegistry extends BusinessObject { + private String code; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } +} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/CSVReportBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/CSVReportBuilder.java deleted file mode 100644 index 55cbb29ae..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/CSVReportBuilder.java +++ /dev/null @@ -1,163 +0,0 @@ -package ru.spcex.clearing.registry.reports.builders; - -import com.opencsv.CSVWriter; -import com.opencsv.ICSVWriter; -import com.opencsv.bean.*; -import com.opencsv.exceptions.CsvBadConverterException; -import com.opencsv.exceptions.CsvChainedException; -import com.opencsv.exceptions.CsvFieldAssignmentException; -import com.opencsv.exceptions.CsvRequiredFieldEmptyException; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import ru.spcex.clearing.registry.reports.bean.FileReport; -import ru.spcex.platform.classes.base.SpcexObjectBase; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.Writer; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.math.BigDecimal; -import java.nio.charset.Charset; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; - -/** - * Класс для построения отчетов в формате CSV - */ -public abstract class CSVReportBuilder { - protected final Logger log = LoggerFactory.getLogger(getClass()); - protected static DateTimeFormatter dateTimeFormatter_YYMMDDHHmmssSSS = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS"); - - /** - * Имя отчета (для имени файла) - */ - protected abstract String reportName(); - - /** - * Преобразовать объект в строку отчета - */ - protected abstract R toRow(I input); - - /** - * Сортировка строк перед формированием отчета - */ - protected Collection sortInput(Collection input) { - return input; - } - - /** - * Сортировка строк после формирования отчета - */ - protected Collection sortOutput(Collection rows) { - return rows; - } - - /** - * Название отчета, используется для формирования имени отчета (без указания формата) - */ - protected String getReportFilename() { - return "%s_%s".formatted(reportName(), dateTimeFormatter_YYMMDDHHmmssSSS.format(LocalDateTime.now())); - } - - /** - * Формирование отчета на основе объектов - */ - public File buildReport(Collection inputObj, File outFolder, Charset outputEncoding) { - assert outFolder != null && outFolder.isDirectory() && inputObj != null; - List rows = new ArrayList<>(inputObj.size()); - inputObj = sortInput(inputObj); - for (I input : inputObj) rows.add(toRow(input)); - rows = sortOutput(rows).stream().toList(); - - File reportFile = new File(outFolder, normalizeFilenameForOS(getReportFilename() + ".csv")); - - try (Writer writer = new FileWriter(reportFile, outputEncoding); - ICSVWriter icsvWriter = new CustomCSVWriter(writer)) { - CustomStrategy customStrategy = new CustomStrategy<>(); - customStrategy.setType(getReportClass()); - StatefulBeanToCsv sbc = new StatefulBeanToCsvBuilder(icsvWriter) - .withMappingStrategy(customStrategy) - .build(); - if (!rows.isEmpty()) sbc.write(rows); - else { - // Для записи заголовков в пустой файл - Constructor constructor = Objects.requireNonNull(getReportClass()).getDeclaredConstructor(); - R obj = constructor.newInstance(); - String[] headers = customStrategy.generateHeader(obj); - writer.write("\"" + String.join("\",\"", headers) + "\""); - } - - } catch (Exception e) { - log.error("Can't create CSV report", e); - return null; - } - - return reportFile; - } - - protected abstract Class getReportClass(); - - protected String normalizeFilenameForOS(String filename) { - if (System.getProperty("os.name").toLowerCase().contains("windows")) - return filename.replace(":", "_"); - return filename; - } - - static class CustomCSVWriter extends CSVWriter { - public CustomCSVWriter(Writer writer) { - super(writer, ',', '\"', '\"', System.lineSeparator()); - } - - @Override - protected void writeNext(String[] nextLine, boolean applyQuotesToAll, Appendable appendable) throws IOException { - if (nextLine != null) { - for (int i = 0; i < nextLine.length; i++) { - if (StringUtils.isEmpty(nextLine[i])) { - nextLine[i] = null; - } - } - } - super.writeNext(nextLine, applyQuotesToAll, appendable); - } - } - - static class CustomStrategy extends ColumnPositionMappingStrategy { - public String[] generateHeader(T bean) throws CsvRequiredFieldEmptyException { - super.generateHeader(bean); - String[] headers = new String[this.getFieldMap().values().size()]; - for (BeanField field : this.getFieldMap().values()) { - CsvBindByPosition positionAnnotation = field.getField().getAnnotation(CsvBindByPosition.class); - CsvBindByName nameAnnotation = field.getField().getAnnotation(CsvBindByName.class); - headers[positionAnnotation.position()] = nameAnnotation.column(); - } - return headers; - } - - @Override - public String[] transmuteBean(T bean) throws CsvFieldAssignmentException, CsvChainedException { - return super.transmuteBean(bean); - } - - @Override - protected CsvConverter determineConverter(Field field, Class elementType, String locale, String writeLocale, Class customConverter) throws CsvBadConverterException { - CsvConverter csvConverter = super.determineConverter(field, elementType, locale, writeLocale, customConverter); - if (csvConverter instanceof ConverterNumber && field.getType() == BigDecimal.class) { - CsvNumber csvNumberAnnotation = field.getAnnotation(CsvNumber.class); - String formatValue = csvNumberAnnotation.value(); - String writeFormat = csvNumberAnnotation.writeFormat(); - csvConverter = new ConverterNumber(BigDecimal.class, - Locale.getDefault().toString(), - Locale.getDefault().toString(), - Locale.getDefault(), - formatValue, - writeFormat); - } - return csvConverter; - } - - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoBalanceRegisterReportBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoBalanceRegisterReportBuilder.java index 6516a836f..e90b645aa 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoBalanceRegisterReportBuilder.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoBalanceRegisterReportBuilder.java @@ -1,32 +1,29 @@ package ru.spcex.clearing.registry.reports.builders; -import ru.clearing.classes.objects.BusinessEvent; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.registry.RegistryHistory; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.registry.reports.bean.DepoBalanceRegisterReport; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.IEnumKey; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.reports.bean.BusinessEvent; +import ru.spcex.clearing.registry.reports.bean.Registry; +import ru.spcex.clearing.registry.reports.bean.RegistryHistory; +import ru.spcex.clearing.registry.reports.loaders.helpers.AccountType; +import ru.spcex.clearing.registry.reports.loaders.helpers.IEnumKey; +import ru.spcex.clearing.registry.reports.report.DepoBalanceRegisterReport; + +import java.io.File; +import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.util.Collection; -import java.util.Comparator; +import java.util.*; import java.util.stream.Collectors; +@Component public class DepoBalanceRegisterReportBuilder extends XLSXReportBuilder { private final static DateTimeFormatter yyyyMMddFormat = DateTimeFormatter.ofPattern("yyyyMMdd"); - - private final Imdg companyImdg; - - public DepoBalanceRegisterReportBuilder(ImdgProvider imdgProvider) { - companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - } + private Map, BigDecimal> previousValues; @Override protected String reportName() { @@ -41,25 +38,47 @@ public class DepoBalanceRegisterReportBuilder extends XLSXReportBuilder key = new ImmutablePair<>(keyId, keyDate); + if (previousValues.containsKey(key) && Objects.equals(previousValues.get(key), value)) + return false; + previousValues.put(key, value); + return true; + } + + @Override + public synchronized File buildReport(Collection inputObj, File outFolder) { + previousValues = new HashMap<>(); + try { + return super.buildReport(inputObj, outFolder); + } finally { + previousValues = null; + } + } + @Override protected Collection sortInput(Collection input) { return input.stream() diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoPaymentInstructionBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoPaymentInstructionBuilder.java new file mode 100644 index 000000000..5874e7a98 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoPaymentInstructionBuilder.java @@ -0,0 +1,48 @@ +package ru.spcex.clearing.registry.reports.builders; + +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.reports.bean.PaymentInstruction; +import ru.spcex.clearing.registry.reports.report.DepoPaymentInstructionRegisterReport; + +import java.time.LocalDateTime; +import java.time.ZoneId; + +@Component +public class DepoPaymentInstructionBuilder extends XLSXReportBuilder { + @Override + protected String reportName() { + return "rdc_register"; + } + + @Override + protected DepoPaymentInstructionRegisterReport toRow(PaymentInstruction input) { + DepoPaymentInstructionRegisterReport entity = new DepoPaymentInstructionRegisterReport(); + + if (input.getSessionId() != null) entity.setNumber(input.getSessionId()); + else entity.setNumber(input.getId()); + + entity.setDate(input.getClearingDate()); + + if (input.getCreated() != null) + entity.setTime(LocalDateTime.from(input.getCreated().atZone(ZoneId.systemDefault()))); + + entity.setAccountSender(input.getCreditLegAccountStr()); + entity.setAccountAddressee(input.getDebitLegAccountStr()); + + entity.setAddressee(input.getAddressee()); + entity.setCodeAddressee(input.getAddresseeClearingCode()); + entity.setSender(input.getSender()); + entity.setCodeSender(input.getSenderClearingCode()); + + entity.setSecurity(input.getSecurity()); + entity.setAmount(input.getCreditLeg_amount()); + + return entity; + } + + @Override + protected Class getReportClass() { + return DepoPaymentInstructionRegisterReport.class; + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoPaymentInstructionRegisterReportBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoPaymentInstructionRegisterReportBuilder.java deleted file mode 100644 index 6d3e4bbdb..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/DepoPaymentInstructionRegisterReportBuilder.java +++ /dev/null @@ -1,95 +0,0 @@ -package ru.spcex.clearing.registry.reports.builders; - -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.payment.PaymentInstruction; -import ru.clearing.classes.statics.data.security.Security; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.registry.reports.bean.DepoPaymentInstructionRegisterReport; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Collection; -import java.util.Comparator; -import java.util.stream.Collectors; - -public class DepoPaymentInstructionRegisterReportBuilder extends XLSXReportBuilder { - - private final Imdg accountImdg; - private final Imdg companyImdg; - private final Imdg securityImdg; - - public DepoPaymentInstructionRegisterReportBuilder(ImdgProvider imdgProvider) { - companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); - securityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Security, Security.class); - } - - @Override - protected String reportName() { - return "rdc_register"; - } - - @Override - protected Class getReportClass() { - return DepoPaymentInstructionRegisterReport.class; - } - - @Override - protected DepoPaymentInstructionRegisterReport toRow(PaymentInstruction input) { - DepoPaymentInstructionRegisterReport entity = new DepoPaymentInstructionRegisterReport(); - - if (input.getSessionId() == null) - entity.setNumber(input.getId()); - else - entity.setNumber(input.getSessionId()); - entity.setDate(input.getClearingDate()); - - if (input.getCreated() != null) entity.setTime(LocalDateTime.from(input.getCreated().atZone(ZoneId.systemDefault()))); - - if (input.getCreditLeg_accountId() != null) { - Account account = accountImdg.getSingleObjectByID(input.getCreditLeg_accountId()); - if (account != null) entity.setAccountSender(account.getAccount()); - } - - if (input.getSenderId() != null) { - Company company = companyImdg.getSingleObjectByID(input.getSenderId()); - if (company != null) { - entity.setSender(company.getShortName()); - entity.setCodeSender(company.getClearingCode()); - } - } - - if (input.getDebitLeg_accountId() != null) { - Account account = accountImdg.getSingleObjectByID(input.getDebitLeg_accountId()); - if (account != null) entity.setAccountAddressee(account.getAccount()); - } - - if (input.getAddresseeId() != null) { - Company company = companyImdg.getSingleObjectByID(input.getAddresseeId()); - if (company != null) { - entity.setAddressee(company.getShortName()); - entity.setCodeAddressee(company.getClearingCode()); - } - } - - - if (input.getCreditLeg_securityId() != null) { - Security security = securityImdg.getSingleObjectByID(input.getCreditLeg_securityId()); - if (security != null) entity.setSecurity(security.getSecuritySymbol()); - } - entity.setAmount(input.getCreditLeg_amount()); - - return entity; - } - - @Override - protected Collection sortInput(Collection input) { - return input.stream() - .sorted(Comparator.comparing(PaymentInstruction::getCreated)) - .collect(Collectors.toList()); - } - -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/ExecutionRegisterReportBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/ExecutionRegisterReportBuilder.java index a8762f3b9..7c4dedbb9 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/ExecutionRegisterReportBuilder.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/ExecutionRegisterReportBuilder.java @@ -1,45 +1,21 @@ package ru.spcex.clearing.registry.reports.builders; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.execution.ExecutionCommon; -import ru.clearing.classes.statics.data.execution.ExecutionDeposit; -import ru.clearing.classes.statics.data.execution.ExecutionFond; -import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; -import ru.clearing.platform.dictionary.AllowedDictionary; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.registry.reports.bean.ExecutionRegisterReport; -import ru.spcex.platform.enumeration.CompanySymbol; -import ru.spcex.platform.enumeration.MoneyFlowSide; -import ru.spcex.platform.enumeration.Side; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.number.BigDecimalUtil; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.reports.bean.ExecutionCommon; +import ru.spcex.clearing.registry.reports.bean.ExecutionCurrency; +import ru.spcex.clearing.registry.reports.bean.ExecutionDeposit; +import ru.spcex.clearing.registry.reports.bean.ExecutionFond; +import ru.spcex.clearing.registry.reports.report.ExecutionRegisterReport; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.Arrays; import java.util.Collection; import java.util.Comparator; -import java.util.Map; import java.util.stream.Collectors; +@Component public class ExecutionRegisterReportBuilder extends XLSXReportBuilder { - private final static DateTimeFormatter yyyyMMddFormat = DateTimeFormatter.ofPattern("yyyyMMdd"); - - private final Imdg companyImdg; - private final Imdg companySymbolsImdg; - private final Imdg allowedDictionaryImdg; - private final Imdg tradingClearingRegistryImdg; - - public ExecutionRegisterReportBuilder(ImdgProvider imdgProvider) { - companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); - allowedDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AllowedDictionary, AllowedDictionary.class); - tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); - } - @Override protected String reportName() { return "contract_register"; @@ -58,64 +34,12 @@ public class ExecutionRegisterReportBuilder extends XLSXReportBuilder { - private final Imdg registryStatusDictionaryImdg; - private final Imdg sessionTypesDictionaryImdg; - - public LiabilitiesRegistryReportBuilder(ImdgProvider imdgProvider) { - registryStatusDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryStatusDictionary, RegistryStatusDictionary.class); - sessionTypesDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SessionTypeDictionary, SessionTypeDictionary.class); - } @Override protected String reportName() { @@ -41,46 +31,21 @@ public class LiabilitiesRegistryReportBuilder extends XLSXReportBuilder sortInput(Collection input) { return input.stream() diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/MoneyBalanceRegisterReportBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/MoneyBalanceRegisterReportBuilder.java index c805b6a55..2c2080b81 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/MoneyBalanceRegisterReportBuilder.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/MoneyBalanceRegisterReportBuilder.java @@ -1,32 +1,28 @@ package ru.spcex.clearing.registry.reports.builders; -import ru.clearing.classes.objects.BusinessEvent; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.registry.RegistryHistory; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.registry.reports.bean.MoneyBalanceRegisterReport; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.IEnumKey; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.reports.bean.BusinessEvent; +import ru.spcex.clearing.registry.reports.bean.Registry; +import ru.spcex.clearing.registry.reports.bean.RegistryHistory; +import ru.spcex.clearing.registry.reports.loaders.helpers.AccountType; +import ru.spcex.clearing.registry.reports.loaders.helpers.IEnumKey; +import ru.spcex.clearing.registry.reports.report.MoneyBalanceRegisterReport; +import java.io.File; +import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.util.Collection; -import java.util.Comparator; +import java.util.*; import java.util.stream.Collectors; +@Component public class MoneyBalanceRegisterReportBuilder extends XLSXReportBuilder { private final static DateTimeFormatter yyyyMMddFormat = DateTimeFormatter.ofPattern("yyyyMMdd"); - - private final Imdg companyImdg; - - public MoneyBalanceRegisterReportBuilder(ImdgProvider imdgProvider) { - companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - } + private Map, BigDecimal> previousValues; @Override protected String reportName() { @@ -44,10 +40,7 @@ public class MoneyBalanceRegisterReportBuilder extends XLSXReportBuilder key = new ImmutablePair<>(keyId, keyDate); + if (previousValues.containsKey(key) && Objects.equals(previousValues.get(key), value)) + return false; + previousValues.put(key, value); + return true; + } + + @Override + public synchronized File buildReport(Collection inputObj, File outFolder) { + previousValues = new HashMap<>(); + try { + return super.buildReport(inputObj, outFolder); + } finally { + previousValues = null; + } + } + @Override protected Collection sortInput(Collection input) { return input.stream() diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/MoneyPaymentInstructionRegisterReportBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/MoneyPaymentInstructionRegisterReportBuilder.java index 88a6e1fd7..4644947fc 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/MoneyPaymentInstructionRegisterReportBuilder.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/MoneyPaymentInstructionRegisterReportBuilder.java @@ -1,12 +1,8 @@ package ru.spcex.clearing.registry.reports.builders; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.payment.PaymentInstruction; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.registry.reports.bean.MoneyPaymentInstructionRegisterReport; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.reports.bean.PaymentInstruction; +import ru.spcex.clearing.registry.reports.report.MoneyPaymentInstructionRegisterReport; import java.time.LocalDateTime; import java.time.ZoneId; @@ -14,16 +10,9 @@ import java.util.Collection; import java.util.Comparator; import java.util.stream.Collectors; +@Component public class MoneyPaymentInstructionRegisterReportBuilder extends XLSXReportBuilder { - private final Imdg accountImdg; - private final Imdg companyImdg; - - public MoneyPaymentInstructionRegisterReportBuilder(ImdgProvider imdgProvider) { - companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); - } - @Override protected String reportName() { return "prc_register"; @@ -38,39 +27,19 @@ public class MoneyPaymentInstructionRegisterReportBuilder extends XLSXReportBuil protected MoneyPaymentInstructionRegisterReport toRow(PaymentInstruction input) { MoneyPaymentInstructionRegisterReport entity = new MoneyPaymentInstructionRegisterReport(); - if (input.getSessionId() == null) - entity.setNumber(input.getId()); - else - entity.setNumber(input.getSessionId()); + if (input.getSessionId() != null) entity.setNumber(input.getSessionId()); + else entity.setNumber(input.getId()); + entity.setDate(input.getClearingDate()); if (input.getCreated() != null) entity.setTime(LocalDateTime.from(input.getCreated().atZone(ZoneId.systemDefault()))); - if (input.getCreditLeg_accountId() != null) { - Account account = accountImdg.getSingleObjectByID(input.getCreditLeg_accountId()); - if (account != null) entity.setAccountSender(account.getAccount()); - } - - if (input.getSenderId() != null) { - Company company = companyImdg.getSingleObjectByID(input.getSenderId()); - if (company != null) { - entity.setSender(company.getShortName()); - entity.setCodeSender(company.getClearingCode()); - } - } - - if (input.getDebitLeg_accountId() != null) { - Account account = accountImdg.getSingleObjectByID(input.getDebitLeg_accountId()); - if (account != null) entity.setAccountAddressee(account.getAccount()); - } - - if (input.getAddresseeId() != null) { - Company company = companyImdg.getSingleObjectByID(input.getAddresseeId()); - if (company != null) { - entity.setAddressee(company.getShortName()); - entity.setCodeAddressee(company.getClearingCode()); - } - } + entity.setAccountSender(input.getCreditLegAccountStr()); + entity.setSender(input.getSender()); + entity.setCodeSender(input.getSenderClearingCode()); + entity.setAccountAddressee(input.getDebitLegAccountStr()); + entity.setAddressee(input.getAddressee()); + entity.setCodeAddressee(input.getAddresseeClearingCode()); entity.setCurrencyCode(input.getCreditLeg_currencyCode()); entity.setSum(input.getCreditLeg_amount()); diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/XLSXReportBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/XLSXReportBuilder.java index 88cd78c03..8cf88b8f3 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/XLSXReportBuilder.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/builders/XLSXReportBuilder.java @@ -1,15 +1,15 @@ package ru.spcex.clearing.registry.reports.builders; -import com.opencsv.bean.CsvBindByName; -import com.opencsv.bean.CsvBindByPosition; -import com.opencsv.bean.CsvDate; -import com.opencsv.bean.CsvNumber; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import ru.spcex.clearing.registry.reports.bean.FileReport; -import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.clearing.registry.annotation.BindByName; +import ru.spcex.clearing.registry.annotation.BindByPosition; +import ru.spcex.clearing.registry.annotation.ReportDate; +import ru.spcex.clearing.registry.annotation.ReportNumber; +import ru.spcex.clearing.registry.reports.bean.SpcexDBBase; +import ru.spcex.clearing.registry.reports.report.FileReport; import java.io.File; import java.io.FileOutputStream; @@ -24,7 +24,7 @@ import java.util.*; /** * Класс для построения отчетов в формате CSV */ -public abstract class XLSXReportBuilder { +public abstract class XLSXReportBuilder { protected final Logger log = LoggerFactory.getLogger(getClass()); protected static DateTimeFormatter dateTimeFormatter_YYMMDDHHmmssSSS = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS"); @@ -64,10 +64,18 @@ public abstract class XLSXReportBuilder inputObj, File outFolder) { assert outFolder != null && outFolder.isDirectory() && inputObj != null; - List rows = new ArrayList<>(inputObj.size()); - inputObj = sortInput(inputObj); - for (I input : inputObj) rows.add(toRow(input)); - rows = sortOutput(rows).stream().toList(); + List rows; + try { + rows = new ArrayList<>(inputObj.size()); + inputObj = sortInput(inputObj); + for (I input : inputObj) { + R row = toRow(input); + if (row != null) rows.add(row); + } + rows = sortOutput(rows).stream().toList(); + } catch (Exception e) { + throw new RuntimeException("Unknown exception", e); + } File reportFile = new File(outFolder, normalizeFilenameForOS(getReportFilename() + ".xlsx")); log.debug("Создание отчёта {} в файл \"{}\"", reportName(), reportFile.getPath()); @@ -78,8 +86,8 @@ public abstract class XLSXReportBuilder headers = new ArrayList<>(); for (Field field : declaredFields) { - CsvBindByPosition positionAnnotation = field.getAnnotation(CsvBindByPosition.class); - CsvBindByName nameAnnotation = field.getAnnotation(CsvBindByName.class); + BindByPosition positionAnnotation = field.getAnnotation(BindByPosition.class); + BindByName nameAnnotation = field.getAnnotation(BindByName.class); if (positionAnnotation == null || nameAnnotation == null) continue; int position = positionAnnotation.position(); String columnName = nameAnnotation.column(); @@ -101,7 +109,7 @@ public abstract class XLSXReportBuilder type = field.getType(); if (type == BigDecimal.class || type == Long.class || type == Integer.class) { if (type == BigDecimal.class) { - CsvNumber csvNumberAnnotation = field.getAnnotation(CsvNumber.class); - String writeFormat = csvNumberAnnotation.writeFormat(); + ReportNumber csvNumberAnnotation = field.getAnnotation(ReportNumber.class); + String writeFormat = csvNumberAnnotation.value(); CellStyle style = numberStyles.get(writeFormat); if (style == null) { style = workbook.createCellStyle(); @@ -129,7 +137,7 @@ public abstract class XLSXReportBuilder loadObjects() { + List result = super.loadObjects(); + return result.stream() + .filter(registryHistory -> registryHistory.getObject().getDiffBalance().compareTo(BigDecimal.ZERO) == 0) + .collect(Collectors.toList()); + } + + @Override + protected String sqlQuery() { + RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AS_T); + return "select * from REGISTRY_HISTORY where EVENT_TIME >= :startDate and EVENT_TIME < :endDate and (%s) and TRADING_CLEARING_REGISTRY is not null" + .formatted(registryCodeSqlBuilder.buildSql()); + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/DepoInstructionLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/DepoInstructionLoader.java new file mode 100644 index 000000000..276ebdec8 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/DepoInstructionLoader.java @@ -0,0 +1,113 @@ +package ru.spcex.clearing.registry.reports.loaders; + +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.clearing.registry.reports.bean.Account; +import ru.spcex.clearing.registry.reports.bean.Company; +import ru.spcex.clearing.registry.reports.bean.PaymentInstruction; +import ru.spcex.clearing.registry.reports.bean.Security; +import ru.spcex.clearing.registry.reports.loaders.helpers.AccountRowMapper; +import ru.spcex.clearing.registry.reports.loaders.helpers.AccountType; +import ru.spcex.clearing.registry.reports.loaders.helpers.CompanyRowMapper; +import ru.spcex.clearing.registry.reports.loaders.helpers.SecurityRowMapper; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +@Component +public class DepoInstructionLoader extends PaymentInstructionLoader { + private final Set DEPO_ACCOUNT_TYPES = Set.of(AccountType.Depo.getKey(), AccountType.Dtrn.getKey()); + + protected DepoInstructionLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) { + super(properties, clearingJdbc); + } + + @Override + public List loadObjects() { + List result = new ArrayList<>(); + + List paymentInstructions = super.loadObjects(); + if (paymentInstructions.isEmpty()) { + log.warn("PaymentInstructions not found."); + return result; + } + Map> groupedPaymentInstruction = paymentInstructions.stream() + .collect(Collectors.groupingBy(PaymentInstruction::getCreditLeg_accountId)); + List ids = paymentInstructions.stream().map(PaymentInstruction::getCreditLeg_accountId).toList(); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", ids); + List accounts = clearingJdbc.query( + "select ID, ACCOUNT_TYPE from ACCOUNT where ID in (:ids)", + parameterSource, new AccountRowMapper() + ); + for (Account account : accounts) { + if (account.getAccountType() != null && !DEPO_ACCOUNT_TYPES.contains(account.getAccountType().toUpperCase())) + continue; + Long id = account.getId(); + List payments = groupedPaymentInstruction.get(id); + if (!payments.isEmpty()) result.addAll(payments); + } + + Map> groupedBySenderIds = paymentInstructions.stream() + .collect(Collectors.groupingBy(PaymentInstruction::getSenderId)); + Map> groupedByAddresseeIds = paymentInstructions.stream() + .collect(Collectors.groupingBy(PaymentInstruction::getAddresseeId)); + List senderIds = new ArrayList<>(groupedBySenderIds.keySet()); + List addresseeIds = new ArrayList<>(groupedByAddresseeIds.keySet()); + parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", senderIds); + List companiesSenderIds = clearingJdbc.query( + "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)", + parameterSource, new CompanyRowMapper() + ); + for (Company company : companiesSenderIds) { + List payments = groupedBySenderIds.get(company.getId()); + if (payments != null) { + for (PaymentInstruction paymentInstruction : payments) { + paymentInstruction.setSender(company.getShortName()); + paymentInstruction.setSenderClearingCode(company.getClearingCode()); + } + } + } + parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", addresseeIds); + List companiesAddresseeId = clearingJdbc.query( + "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)", + parameterSource, new CompanyRowMapper() + ); + for (Company company : companiesAddresseeId) { + List payments = groupedByAddresseeIds.get(company.getId()); + if (payments != null) { + for (PaymentInstruction paymentInstruction : payments) { + paymentInstruction.setAddressee(company.getShortName()); + paymentInstruction.setAddresseeClearingCode(company.getClearingCode()); + } + } + } + + Map> groupedBySecurityId = paymentInstructions.stream() + .collect(Collectors.groupingBy(PaymentInstruction::getCreditLeg_securityId)); + Set securityIds = groupedBySecurityId.keySet(); + MapSqlParameterSource parameterSourceSecurityIds = new MapSqlParameterSource(); + parameterSourceSecurityIds.addValue("ids", securityIds); + List securities = clearingJdbc.query( + "select ID, SECURITY_SYMBOL from SECURITY where ID in (:ids)", + parameterSourceSecurityIds, new SecurityRowMapper() + ); + for (Security security : securities) { + List paymentInstructionList = groupedBySecurityId.get(security.getId()); + if (paymentInstructionList != null) { + for (PaymentInstruction paymentInstruction : paymentInstructionList) { + paymentInstruction.setSecurity(security.getSecuritySymbol()); + } + } + } + + return result; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionCurrencyLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionCurrencyLoader.java new file mode 100644 index 000000000..9a070bfc0 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionCurrencyLoader.java @@ -0,0 +1,262 @@ +package ru.spcex.clearing.registry.reports.loaders; + +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.lang.Nullable; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.clearing.registry.reports.ReportUtils; +import ru.spcex.clearing.registry.reports.bean.*; +import ru.spcex.clearing.registry.reports.loaders.helpers.AllowedDictionaryRowMapper; +import ru.spcex.clearing.registry.reports.loaders.helpers.CompanyRowMapper; +import ru.spcex.clearing.registry.reports.loaders.helpers.CompanySymbolsRowMapper; +import ru.spcex.clearing.registry.reports.loaders.helpers.TradingClearingRegistryRowMapper; + +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static ru.spcex.clearing.registry.reports.ReportUtils.getInstantFromTimestamp; +import static ru.spcex.clearing.registry.reports.ReportUtils.getLocalDateFromSqlDate; + +@Component +public class ExecutionCurrencyLoader extends IDBLoader { + public ExecutionCurrencyLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) { + super(properties.getPeriod(), clearingJdbc); + } + + @Override + public String sqlQuery() { + return "select * from EXECUTION_CURRENCY where CLEARING_DATE >= :startDate and CLEARING_DATE < :endDate"; + } + + @Override + protected Class getDBObjectClass() { + return ExecutionCurrency.class; + } + + @Override + public List loadObjects() { + try { + List executionCurrencys = super.loadObjects(); + if (executionCurrencys.isEmpty()) { + log.warn("ExecutionCurrency not found."); + return new ArrayList<>(); + } + + Map tradingClearingRegistryById = new HashMap<>(); + { + Set tkrIds = executionCurrencys.stream() + .filter(eDep -> eDep.getPartyTradingClearingRegistry() == null) // оптимизация; + .map(ExecutionCurrency::getTradingClearingRegistryId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + tkrIds.addAll(executionCurrencys.stream() + .filter(eDep -> eDep.getCounterPartyTradingClearingRegistry() == null) // оптимизация + .map(ExecutionCurrency::getCounterPartyTradingClearingRegistryId) + .filter(Objects::nonNull) + .collect(Collectors.toSet())); + if (!tkrIds.isEmpty()) { + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", tkrIds); + List tradingClearingRegistries = clearingJdbc.query( + "select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)", + parameterSource, new TradingClearingRegistryRowMapper() + ); + for (TradingClearingRegistry tkr : tradingClearingRegistries) { + tradingClearingRegistryById.put(tkr.getId(), tkr); + } + } + } + + Map> companySymbolsForCompanyIdMap; + { + Set companyIds = executionCurrencys.stream().map(ExecutionCurrency::getCompanyId).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", companyIds); + parameterSource.addValue("cs", CompanySymbol.CLRC.getKey()); + List companySymbolsForCompanyId = clearingJdbc.query( + "select ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE from COMPANY_SYMBOLS where COMPANY_ID in (:ids) and COMPANY_SYMBOL = :cs", + parameterSource, new CompanySymbolsRowMapper() + ); + companySymbolsForCompanyIdMap = companySymbolsForCompanyId.stream().collect(Collectors.groupingBy(CompanySymbols::getCompanyId)); + } + + Map> companySymbolsForCounterPartyIdMap; + { + Set counterPartyIds = executionCurrencys.stream().map(ExecutionCurrency::getCounterPartyId).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", counterPartyIds); + parameterSource.addValue("companySymbol", CompanySymbol.CLRC.getKey()); + List companySymbolsForCounterPartyId = clearingJdbc.query( + "select ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE from COMPANY_SYMBOLS where COMPANY_ID in (:ids) and COMPANY_SYMBOL = :companySymbol", + parameterSource, new CompanySymbolsRowMapper() + ); + companySymbolsForCounterPartyIdMap = companySymbolsForCounterPartyId.stream().collect(Collectors.groupingBy(CompanySymbols::getCompanyId)); + } + + Map companyById; + { + Set allCompanyIds = Stream.concat( + executionCurrencys.stream().map(ExecutionCurrency::getCompanyId), + executionCurrencys.stream().map(ExecutionCurrency::getCounterPartyId)) + .collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", allCompanyIds); + List companyForCompanyId = clearingJdbc.query( + "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)", + parameterSource, new CompanyRowMapper() + ); + companyById = companyForCompanyId.stream() + .collect(Collectors.toMap(Company::getId, o -> o)); + } + + Map> allowedDictionariesByCode; + { + Set coverageStatuses = executionCurrencys.stream().map(ExecutionCurrency::getCoverageStatus).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("coverageStatuses", coverageStatuses); + List allowedDictionaries = clearingJdbc.query( + "select * from ALLOWED_DICTIONARY where CODE in (:coverageStatuses)", + parameterSource, new AllowedDictionaryRowMapper() + ); + allowedDictionariesByCode = allowedDictionaries.stream() + .collect(Collectors.groupingBy(AllowedDictionary::getCode)); + } + + for (ExecutionCurrency executionCurrency : executionCurrencys) { + Company companyByCompanyId = companyById.get(executionCurrency.getCompanyId()); + Company companyByCounterPartyId = companyById.get(executionCurrency.getCounterPartyId()); + String side = executionCurrency.getSide() == null ? null : executionCurrency.getSide().toUpperCase(); + if (MoneyFlowSide.SELL.equalsByKey(side) || Side.SELL.equalsByKey(side)) { + if (companyByCompanyId != null) { + executionCurrency.setSeller(companyByCompanyId.getShortName()); + } + if (companyByCounterPartyId != null) { + executionCurrency.setBuyer(companyByCounterPartyId.getShortName()); + } + { + List cSymbols = companySymbolsForCompanyIdMap.get(executionCurrency.getCompanyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionCurrency.setSellerCode(companySymbols.getCompanySymbolValue()); + } + } + { + List cSymbols = companySymbolsForCounterPartyIdMap.get(executionCurrency.getCounterPartyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionCurrency.setBuyerCode(companySymbols.getCompanySymbolValue()); + } + } + + executionCurrency.setBuyerTkrCode(getTCRCodeFromValueOrById( + executionCurrency.getCounterPartyTradingClearingRegistry(), // В execution Currency они заполнены + executionCurrency.getCounterPartyTradingClearingRegistryId(), + tradingClearingRegistryById + )); + executionCurrency.setSellerTkrCode(getTCRCodeFromValueOrById( + executionCurrency.getPartyTradingClearingRegistry(), // В execution Currency они заполнены + executionCurrency.getTradingClearingRegistryId(), + tradingClearingRegistryById + )); + } else if (MoneyFlowSide.BUY.equalsByKey(side) || Side.BUY.equalsByKey(side)) { + if (companyByCompanyId != null) { + executionCurrency.setBuyer(companyByCompanyId.getShortName()); + } + if (companyByCounterPartyId != null) { + executionCurrency.setSeller(companyByCounterPartyId.getShortName()); + } + { + List cSymbols = companySymbolsForCompanyIdMap.get(executionCurrency.getCompanyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionCurrency.setBuyerCode(companySymbols.getCompanySymbolValue()); + } + } + { + List cSymbols = companySymbolsForCounterPartyIdMap.get(executionCurrency.getCounterPartyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionCurrency.setSellerCode(companySymbols.getCompanySymbolValue()); + } + } + executionCurrency.setBuyerTkrCode(getTCRCodeFromValueOrById( + executionCurrency.getPartyTradingClearingRegistry(), // В execution Currency они заполнены + executionCurrency.getTradingClearingRegistryId(), + tradingClearingRegistryById + )); + executionCurrency.setSellerTkrCode(getTCRCodeFromValueOrById( + executionCurrency.getCounterPartyTradingClearingRegistry(), // В execution Currency они заполнены + executionCurrency.getCounterPartyTradingClearingRegistryId(), + tradingClearingRegistryById + )); + } else { + log.warn("Unknown executionCurrency[{}].side={}", executionCurrency.getId(), executionCurrency.getSide()); + } + List allowed = allowedDictionariesByCode.get(executionCurrency.getCoverageStatus()); + if (allowed != null && !allowed.isEmpty()) { + executionCurrency.setStatus(allowed.iterator().next().getName()); + } + } + + return executionCurrencys; + } catch (Exception e) { + log.error("Can not load ExecutionCurrency: ", e); + throw new RuntimeException("At ExecutionCurrency", e); + } + } + + String getTCRCodeFromValueOrById(@Nullable String tcrCode, @Nullable Long tcrId, Map tradingClearingRegistryById) { + if (tcrCode != null) + return tcrCode; + if (tcrId != null) { + TradingClearingRegistry tcr = tradingClearingRegistryById.get(tcrId); + if (tcr == null) { + log.warn("Can not find TCR.id={}", tcrId); + } else { + return tcr.getCode(); + } + } + return null; + } + + @Override + public ExecutionCurrency fromRS(ResultSet resultSet) throws SQLException { + ExecutionCurrency object = new ExecutionCurrency(); + object.setId(resultSet.getObject("ID", Long.class)); + object.setCreated(getInstantFromTimestamp(resultSet, "CREATED_AT")); + object.setUpdated(getInstantFromTimestamp(resultSet, "UPDATED_AT")); + object.setExchangeExecutionId(resultSet.getObject("EXCHANGE_EXECUTION_ID", Long.class)); + object.setExchangeExecutionTime(getInstantFromTimestamp(resultSet, "EXCHANGE_EXECUTION_TIME")); + object.setExchangeExecutionMicroseconds(getInstantFromTimestamp(resultSet, "EXCHANGE_EXECUTION_MICROSECONDS")); + object.setTradingDate(getLocalDateFromSqlDate(resultSet, "TRADING_DATE")); + object.setSettlementDate(getLocalDateFromSqlDate(resultSet, "SETTLEMENT_DATE")); + object.setSettlementCode(resultSet.getObject("SETTLEMENT_CODE", String.class)); + object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class)); + object.setSecuritySymbol(resultSet.getObject("SECURITY_SYMBOL", String.class)); + object.setSecurityFullName(resultSet.getObject("SECURITY_NAME", String.class)); + object.setCompanyId(resultSet.getObject("COMPANY_ID", Long.class)); + object.setTradingClearingRegistryId(resultSet.getObject("PARTY_TRADING_CLEARING_REGISTRY_ID", Long.class)); + object.setPartyTradingClearingRegistry(resultSet.getObject("PARTY_TRADING_CLEARING_REGISTRY", String.class)); + object.setCounterPartyId(resultSet.getObject("COUNTER_PARTY_ID", Long.class)); + object.setCounterPartyTradingClearingRegistryId(resultSet.getObject("COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID", Long.class)); + object.setCounterPartyTradingClearingRegistry(resultSet.getObject("COUNTER_PARTY_TRADING_CLEARING_REGISTRY", String.class)); + object.setMarket(resultSet.getObject("MARKET", String.class)); + object.setPrice(resultSet.getObject("PRICE", BigDecimal.class)); + object.setLots(resultSet.getObject("LOTS", BigDecimal.class)); + object.setSettlementAmount(resultSet.getObject("SETTLEMENT_AMOUNT", BigDecimal.class)); + object.setQuantity(resultSet.getObject("QUANTITY", BigDecimal.class)); + object.setSide(resultSet.getObject("SIDE", String.class)); +// object.setCurrencyCode(resultSet.getObject("CURRENCY_CODE", String.class)); +// object.setSettlementOrganization(resultSet.getObject("SETTLEMENT_ORGANIZATION", String.class)); + object.setCoverageStatus(resultSet.getObject("COVERAGE_STATUS", String.class)); + object.setSessionId(resultSet.getObject("SESSION_ID", Long.class)); + object.setClearingDate(getLocalDateFromSqlDate(resultSet, "CLEARING_DATE")); + return object; + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionDepositLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionDepositLoader.java new file mode 100644 index 000000000..87d770254 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionDepositLoader.java @@ -0,0 +1,264 @@ +package ru.spcex.clearing.registry.reports.loaders; + +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.lang.Nullable; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.clearing.registry.reports.ReportUtils; +import ru.spcex.clearing.registry.reports.bean.*; +import ru.spcex.clearing.registry.reports.loaders.helpers.AllowedDictionaryRowMapper; +import ru.spcex.clearing.registry.reports.loaders.helpers.CompanyRowMapper; +import ru.spcex.clearing.registry.reports.loaders.helpers.CompanySymbolsRowMapper; +import ru.spcex.clearing.registry.reports.loaders.helpers.TradingClearingRegistryRowMapper; + +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Component +public class ExecutionDepositLoader extends IDBLoader { + public ExecutionDepositLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) { + super(properties.getPeriod(), clearingJdbc); + } + + @Override + public String sqlQuery() { + return "select * from EXECUTION_DEPOSIT where CLEARING_DATE >= :startDate and CLEARING_DATE < :endDate"; + } + + @Override + protected Class getDBObjectClass() { + return ExecutionDeposit.class; + } + + @Override + public List loadObjects() { + try { + List executionDeposits = super.loadObjects(); + if (executionDeposits.isEmpty()) { + log.warn("ExecutionDeposit not found."); + return new ArrayList<>(); + } + + Map tradingClearingRegistryById = new HashMap<>(); + { + Set tkrIds = executionDeposits.stream() + .filter(eDep -> eDep.getPartyTradingClearingRegistry() == null) // оптимизация; // В execution deposit они пустые + .map(ExecutionDeposit::getTradingClearingRegistryId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + tkrIds.addAll(executionDeposits.stream() + .filter(eDep -> eDep.getCounterPartyTradingClearingRegistry() == null) // оптимизация // В execution deposit и fond они заполнены + .map(ExecutionDeposit::getCounterPartyTradingClearingRegistryId) + .filter(Objects::nonNull) + .collect(Collectors.toSet())); + if (!tkrIds.isEmpty()) { + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", tkrIds); + List tradingClearingRegistries = clearingJdbc.query( + "select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)", + parameterSource, new TradingClearingRegistryRowMapper() + ); + for (TradingClearingRegistry tkr : tradingClearingRegistries) { + tradingClearingRegistryById.put(tkr.getId(), tkr); + } + } + } + + Map> companySymbolsForCompanyIdMap; + { + Set companyIds = executionDeposits.stream().map(ExecutionDeposit::getCompanyId).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", companyIds); + parameterSource.addValue("cs", CompanySymbol.CLRC.getKey()); + List companySymbolsForCompanyId = clearingJdbc.query( + "select ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE from COMPANY_SYMBOLS where COMPANY_ID in (:ids) and COMPANY_SYMBOL = :cs", + parameterSource, new CompanySymbolsRowMapper() + ); + companySymbolsForCompanyIdMap = companySymbolsForCompanyId.stream().collect(Collectors.groupingBy(CompanySymbols::getCompanyId)); + } + + Map> companySymbolsForCounterPartyIdMap; + { + Set counterPartyIds = executionDeposits.stream().map(ExecutionDeposit::getCounterPartyId).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", counterPartyIds); + parameterSource.addValue("companySymbol", CompanySymbol.CLRC.getKey()); + List companySymbolsForCounterPartyId = clearingJdbc.query( + "select ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE from COMPANY_SYMBOLS where COMPANY_ID in (:ids) and COMPANY_SYMBOL = :companySymbol", + parameterSource, new CompanySymbolsRowMapper() + ); + companySymbolsForCounterPartyIdMap = companySymbolsForCounterPartyId.stream().collect(Collectors.groupingBy(CompanySymbols::getCompanyId)); + } + + Map companyById; + { + Set allCompanyIds = Stream.concat( + executionDeposits.stream().map(ExecutionDeposit::getCompanyId), + executionDeposits.stream().map(ExecutionDeposit::getCounterPartyId)) + .collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", allCompanyIds); + List companyForCompanyId = clearingJdbc.query( + "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)", + parameterSource, new CompanyRowMapper() + ); + companyById = companyForCompanyId.stream() + .collect(Collectors.toMap(Company::getId, o -> o)); + } + + Map> allowedDictionariesByCode; + { + Set coverageStatuses = executionDeposits.stream().map(ExecutionDeposit::getCoverageStatus).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("coverageStatuses", coverageStatuses); + List allowedDictionaries = clearingJdbc.query( + "select * from ALLOWED_DICTIONARY where CODE in (:coverageStatuses)", + parameterSource, new AllowedDictionaryRowMapper() + ); + allowedDictionariesByCode = allowedDictionaries.stream() + .collect(Collectors.groupingBy(AllowedDictionary::getCode)); + } + + for (ExecutionDeposit executionDeposit : executionDeposits) { + Company companyByCompanyId = companyById.get(executionDeposit.getCompanyId()); + Company companyByCounterPartyId = companyById.get(executionDeposit.getCounterPartyId()); + String side = executionDeposit.getSide() == null ? null : executionDeposit.getSide().toUpperCase(); + if (MoneyFlowSide.SELL.equalsByKey(side) || Side.SELL.equalsByKey(side)) { + if (companyByCompanyId != null) { + executionDeposit.setSeller(companyByCompanyId.getShortName()); + } + if (companyByCounterPartyId != null) { + executionDeposit.setBuyer(companyByCounterPartyId.getShortName()); + } + { + List cSymbols = companySymbolsForCompanyIdMap.get(executionDeposit.getCompanyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionDeposit.setSellerCode(companySymbols.getCompanySymbolValue()); + } + } + { + List cSymbols = companySymbolsForCounterPartyIdMap.get(executionDeposit.getCounterPartyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionDeposit.setBuyerCode(companySymbols.getCompanySymbolValue()); + } + } + + executionDeposit.setBuyerTkrCode(getTCRCodeFromValueOrById( + executionDeposit.getCounterPartyTradingClearingRegistry(), // В execution deposit они заполнены + executionDeposit.getCounterPartyTradingClearingRegistryId(), + tradingClearingRegistryById + )); + executionDeposit.setSellerTkrCode(getTCRCodeFromValueOrById( + executionDeposit.getPartyTradingClearingRegistry(), + executionDeposit.getTradingClearingRegistryId(), + tradingClearingRegistryById + )); + } else if (MoneyFlowSide.BUY.equalsByKey(side) || Side.BUY.equalsByKey(side)) { + if (companyByCompanyId != null) { + executionDeposit.setBuyer(companyByCompanyId.getShortName()); + } + if (companyByCounterPartyId != null) { + executionDeposit.setSeller(companyByCounterPartyId.getShortName()); + } + { + List cSymbols = companySymbolsForCompanyIdMap.get(executionDeposit.getCompanyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionDeposit.setBuyerCode(companySymbols.getCompanySymbolValue()); + } + } + { + List cSymbols = companySymbolsForCounterPartyIdMap.get(executionDeposit.getCounterPartyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionDeposit.setSellerCode(companySymbols.getCompanySymbolValue()); + } + } + executionDeposit.setBuyerTkrCode(getTCRCodeFromValueOrById( + executionDeposit.getPartyTradingClearingRegistry(), + executionDeposit.getTradingClearingRegistryId(), + tradingClearingRegistryById + )); + executionDeposit.setSellerTkrCode(getTCRCodeFromValueOrById( + executionDeposit.getCounterPartyTradingClearingRegistry(), // В execution deposit они заполнены + executionDeposit.getCounterPartyTradingClearingRegistryId(), + tradingClearingRegistryById + )); + } else { + log.warn("Unknown executionDeposit[{}].side={}", executionDeposit.getId(), executionDeposit.getSide()); + } + List allowed = allowedDictionariesByCode.get(executionDeposit.getCoverageStatus()); + if (allowed != null && !allowed.isEmpty()) { + executionDeposit.setStatus(allowed.iterator().next().getName()); + } + } + + return executionDeposits; + } catch (Exception e) { + log.error("Can not load ExecutionDeposit: ", e); + throw new RuntimeException("At ExecutionDeposit", e); + } + } + + String getTCRCodeFromValueOrById(@Nullable String tcrCode, @Nullable Long tcrId, Map tradingClearingRegistryById) { + if (tcrCode != null) + return tcrCode; + if (tcrId != null) { + TradingClearingRegistry tcr = tradingClearingRegistryById.get(tcrId); + if (tcr == null) { + log.warn("Can not find TCR.id={}", tcrId); + } else { + return tcr.getCode(); + } + } + return null; + } + + @Override + public ExecutionDeposit fromRS(ResultSet resultSet) throws SQLException { + ExecutionDeposit object = new ExecutionDeposit(); + object.setId(resultSet.getObject("ID", Long.class)); + object.setCreated(ReportUtils.getInstantFromTimestamp(resultSet, "CREATED_AT")); + object.setUpdated(ReportUtils.getInstantFromTimestamp(resultSet, "UPDATED_AT")); + object.setExchangeExecutionId(resultSet.getObject("EXCHANGE_EXECUTION_ID", Long.class)); + object.setExchangeExecutionTime(ReportUtils.getInstantFromTimestamp(resultSet, "EXCHANGE_EXECUTION_TIME")); + object.setTradingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "TRADING_DATE")); + object.setTradingClearingRegistryId(resultSet.getObject("TRADING_CLEARING_REGISTRY_ID", Long.class)); + object.setPartyTradingClearingRegistry(resultSet.getObject("PARTY_TRADING_CLEARING_REGISTRY", String.class)); + object.setCounterPartyTradingClearingRegistry(resultSet.getObject("COUNTER_PARTY_TRADING_CLEARING_REGISTRY", String.class)); + object.setMarket(resultSet.getObject("MARKET", String.class)); + object.setPrice(resultSet.getObject("PRICE", BigDecimal.class)); + object.setLots(resultSet.getObject("LOTS", BigDecimal.class)); + object.setQuantity(resultSet.getObject("QUANTITY", BigDecimal.class)); + object.setFirstLegAmount(resultSet.getObject("FIRST_LEG_AMOUNT", BigDecimal.class)); + object.setSecondLegAmount(resultSet.getObject("SECOND_LEG_AMOUNT", BigDecimal.class)); + object.setInterestAmount(resultSet.getObject("INTEREST_AMOUNT", BigDecimal.class)); + object.setSide(resultSet.getObject("SIDE", String.class)); + object.setSettlementCurrency(resultSet.getObject("SETTLEMENT_CURRENCY", String.class)); + object.setCompanyId(resultSet.getObject("COMPANY_ID", Long.class)); + object.setDuration(resultSet.getObject("DURATION", Long.class)); + object.setFirstLegSettlementDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "FIRST_LEG_SETTLEMENT_DATE")); + object.setSecondLegSettlementDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "SECOND_LEG_SETTLEMENT_DATE")); + object.setFirstLegSettlementCode(resultSet.getObject("FIRST_LEG_SETTLEMENT_CODE", String.class)); + object.setSecondLegSettlementCode(resultSet.getObject("SECOND_LEG_SETTLEMENT_CODE", String.class)); + object.setSecurityFullName(resultSet.getObject("SECURITY_FULL_NAME", String.class)); + object.setSecuritySymbol(resultSet.getObject("SECURITY_SYMBOL", String.class)); + object.setSecurityCode(resultSet.getObject("SECURITY_CODE", String.class)); + object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class)); + object.setContract(resultSet.getObject("CONTRACT", String.class)); + object.setCounterPartyId(resultSet.getObject("COUNTER_PARTY_ID", Long.class)); + object.setCoverageStatus(resultSet.getObject("COVERAGE_STATUS", String.class)); + object.setSessionId(resultSet.getObject("SESSION_ID", Long.class)); + object.setClearingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "CLEARING_DATE")); + object.setCounterPartyTradingClearingRegistryId(resultSet.getObject("COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID", Long.class)); + return object; + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionFondLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionFondLoader.java new file mode 100644 index 000000000..992716b52 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/ExecutionFondLoader.java @@ -0,0 +1,261 @@ +package ru.spcex.clearing.registry.reports.loaders; + +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.lang.Nullable; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.clearing.registry.reports.ReportUtils; +import ru.spcex.clearing.registry.reports.bean.*; +import ru.spcex.clearing.registry.reports.loaders.helpers.AllowedDictionaryRowMapper; +import ru.spcex.clearing.registry.reports.loaders.helpers.CompanyRowMapper; +import ru.spcex.clearing.registry.reports.loaders.helpers.CompanySymbolsRowMapper; +import ru.spcex.clearing.registry.reports.loaders.helpers.TradingClearingRegistryRowMapper; + +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Component +public class ExecutionFondLoader extends IDBLoader { + protected ExecutionFondLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) { + super(properties.getPeriod(), clearingJdbc); + } + + + @Override + public List loadObjects() { + try { + List executionFonds = super.loadObjects(); + if (executionFonds.isEmpty()) { + log.warn("ExecutionFond not found."); + return new ArrayList<>(); + } + + Map tradingClearingRegistryById = new HashMap<>(); + { + Set tkrIds = executionFonds.stream() + .filter(eDep -> eDep.getPartyTradingClearingRegistry() == null) // оптимизация; + .map(ExecutionFond::getTradingClearingRegistryId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + tkrIds.addAll(executionFonds.stream() + .filter(eDep -> eDep.getCounterPartyTradingClearingRegistry() == null) // оптимизация // В execution deposit и fond они заполнены + .map(ExecutionFond::getCounterPartyTradingClearingRegistryId) + .filter(Objects::nonNull) + .collect(Collectors.toSet())); + if (!tkrIds.isEmpty()) { + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", tkrIds); + List tradingClearingRegistries = clearingJdbc.query( + "select ID, CODE from TRADING_CLEARING_REGISTRY where ID in (:ids)", + parameterSource, new TradingClearingRegistryRowMapper() + ); + for (TradingClearingRegistry tkr : tradingClearingRegistries) { + tradingClearingRegistryById.put(tkr.getId(), tkr); + } + } + } + + Map> companySymbolsForCompanyIdMap; + { + Set companyIds = executionFonds.stream().map(ExecutionFond::getCompanyId).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", companyIds); + parameterSource.addValue("cs", CompanySymbol.CLRC.getKey()); + List companySymbolsForCompanyId = clearingJdbc.query( + "select ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE from COMPANY_SYMBOLS where COMPANY_ID in (:ids) and COMPANY_SYMBOL = :cs", + parameterSource, new CompanySymbolsRowMapper() + ); + companySymbolsForCompanyIdMap = companySymbolsForCompanyId.stream().collect(Collectors.groupingBy(CompanySymbols::getCompanyId)); + } + + Map> companySymbolsForCounterPartyIdMap; + { + Set counterPartyIds = executionFonds.stream().map(ExecutionFond::getCounterPartyId).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", counterPartyIds); + parameterSource.addValue("companySymbol", CompanySymbol.CLRC.getKey()); + List companySymbolsForCounterPartyId = clearingJdbc.query( + "select ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE from COMPANY_SYMBOLS where COMPANY_ID in (:ids) and COMPANY_SYMBOL = :companySymbol", + parameterSource, new CompanySymbolsRowMapper() + ); + companySymbolsForCounterPartyIdMap = companySymbolsForCounterPartyId.stream().collect(Collectors.groupingBy(CompanySymbols::getCompanyId)); + } + + Map companyById; + { + Set allCompanyIds = Stream.concat( + executionFonds.stream().map(ExecutionFond::getCompanyId), + executionFonds.stream().map(ExecutionFond::getCounterPartyId)) + .collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", allCompanyIds); + List companyForCompanyId = clearingJdbc.query( + "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)", + parameterSource, new CompanyRowMapper() + ); + companyById = companyForCompanyId.stream() + .collect(Collectors.toMap(Company::getId, o -> o)); + } + + Map> allowedDictionariesByCode; + { + Set coverageStatuses = executionFonds.stream().map(ExecutionFond::getCoverageStatus).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("coverageStatuses", coverageStatuses); + List allowedDictionaries = clearingJdbc.query( + "select CODE, NAME from ALLOWED_DICTIONARY where CODE in (:coverageStatuses)", + parameterSource, new AllowedDictionaryRowMapper() + ); + allowedDictionariesByCode = allowedDictionaries.stream() + .collect(Collectors.groupingBy(AllowedDictionary::getCode)); + } + + for (ExecutionFond executionFond : executionFonds) { + Company companyByCompanyId = companyById.get(executionFond.getCompanyId()); + Company companyByCounterPartyId = companyById.get(executionFond.getCounterPartyId()); + String side = executionFond.getSide() == null ? null : executionFond.getSide().toUpperCase(); + if (MoneyFlowSide.SELL.equalsByKey(side) || Side.SELL.equalsByKey(side)) { + if (companyByCompanyId != null) { + executionFond.setSeller(companyByCompanyId.getShortName()); + } + if (companyByCounterPartyId != null) { + executionFond.setBuyer(companyByCounterPartyId.getShortName()); + } + { + List cSymbols = companySymbolsForCompanyIdMap.get(executionFond.getCompanyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionFond.setSellerCode(companySymbols.getCompanySymbolValue()); + } + } + { + List cSymbols = companySymbolsForCounterPartyIdMap.get(executionFond.getCounterPartyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionFond.setBuyerCode(companySymbols.getCompanySymbolValue()); + } + } + executionFond.setBuyerTkrCode(getTCRCodeFromValueOrById( + executionFond.getCounterPartyTradingClearingRegistry(), // В execution fond они заполнены + executionFond.getCounterPartyTradingClearingRegistryId(), + tradingClearingRegistryById + )); + executionFond.setSellerTkrCode(getTCRCodeFromValueOrById( + executionFond.getPartyTradingClearingRegistry(), + executionFond.getTradingClearingRegistryId(), + tradingClearingRegistryById + )); + } else if (MoneyFlowSide.BUY.equalsByKey(side) || Side.BUY.equalsByKey(side)) { + if (companyByCompanyId != null) { + executionFond.setBuyer(companyByCompanyId.getShortName()); + } + if (companyByCounterPartyId != null) { + executionFond.setSeller(companyByCounterPartyId.getShortName()); + } + { + List cSymbols = companySymbolsForCompanyIdMap.get(executionFond.getCompanyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionFond.setBuyerCode(companySymbols.getCompanySymbolValue()); + } + } + { + List cSymbols = companySymbolsForCounterPartyIdMap.get(executionFond.getCounterPartyId()); + if (cSymbols != null && !cSymbols.isEmpty()) { + CompanySymbols companySymbols = cSymbols.iterator().next(); + executionFond.setSellerCode(companySymbols.getCompanySymbolValue()); + } + } + executionFond.setBuyerTkrCode(getTCRCodeFromValueOrById( + executionFond.getPartyTradingClearingRegistry(), + executionFond.getTradingClearingRegistryId(), + tradingClearingRegistryById + )); + executionFond.setSellerTkrCode(getTCRCodeFromValueOrById( + executionFond.getCounterPartyTradingClearingRegistry(), // В execution fond они заполнены + executionFond.getCounterPartyTradingClearingRegistryId(), + tradingClearingRegistryById + )); + } else { + log.warn("Unknown executionFond[{}].side={}", executionFond.getId(), executionFond.getSide()); + } + List allowed = allowedDictionariesByCode.get(executionFond.getCoverageStatus()); + if (allowed != null && !allowed.isEmpty()) { + executionFond.setStatus(allowed.iterator().next().getName()); + } + } + + return executionFonds; + } catch (Exception e) { + throw new RuntimeException("At ExecutionFondLoader", e); + } + } + + String getTCRCodeFromValueOrById(@Nullable String tcrCode, @Nullable Long tcrId, Map tradingClearingRegistryById) { + if (tcrCode != null) + return tcrCode; + if (tcrId != null) { + TradingClearingRegistry tcr = tradingClearingRegistryById.get(tcrId); + if (tcr == null) { + log.warn("Can not find TCR.id={}", tcrId); + } else { + return tcr.getCode(); + } + } + return null; + } + + @Override + protected ExecutionFond fromRS(ResultSet resultSet) throws SQLException { + ExecutionFond object = new ExecutionFond(); + object.setId(resultSet.getObject("ID", Long.class)); + object.setCreated(ReportUtils.getInstantFromTimestamp(resultSet, "CREATED_AT")); + object.setUpdated(ReportUtils.getInstantFromTimestamp(resultSet, "UPDATED_AT")); + object.setClearingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "CLEARING_DATE")); + object.setExchangeExecutionId(resultSet.getObject("EXCHANGE_EXECUTION_ID", Long.class)); + object.setSide(resultSet.getObject("SIDE", String.class)); + object.setMarket(resultSet.getObject("MARKET", String.class)); + object.setTradingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "TRADING_DATE")); + object.setSecuritySymbol(resultSet.getObject("SECURITY_SYMBOL", String.class)); + object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class)); + object.setInterestAmount(resultSet.getObject("INTEREST_AMOUNT", BigDecimal.class)); + object.setExchangeOrderId(resultSet.getObject("EXCHANGE_ORDER_ID", Long.class)); + object.setPrice(resultSet.getObject("PRICE", BigDecimal.class)); + object.setSettlementAmount(resultSet.getObject("SETTLEMENT_AMOUNT", BigDecimal.class)); + object.setLots(resultSet.getObject("LOTS", BigDecimal.class)); + object.setQuantity(resultSet.getObject("QUANTITY", BigDecimal.class)); + object.setExchangeExecutionTime(ReportUtils.getInstantFromTimestamp(resultSet, "EXCHANGE_EXECUTION_TIME")); + object.setDuration(resultSet.getObject("DURATION", Long.class)); + object.setTradingClearingRegistryId(resultSet.getObject("TRADING_CLEARING_REGISTRY_ID", Long.class)); + object.setPartyTradingClearingRegistry(resultSet.getObject("PARTY_TRADING_CLEARING_REGISTRY", String.class)); + object.setCounterPartyTradingClearingRegistry(resultSet.getObject("COUNTER_PARTY_TRADING_CLEARING_REGISTRY", String.class)); + object.setComment(resultSet.getObject("COMMENT", String.class)); + object.setClientCodeId(resultSet.getObject("CLIENT_CODE_ID", Long.class)); + object.setSettlementCode(resultSet.getObject("SETTLEMENT_CODE", String.class)); + object.setCompanyId(resultSet.getObject("COMPANY_ID", Long.class)); + object.setCounterPartyId(resultSet.getObject("COUNTER_PARTY_ID", Long.class)); + object.setSecurityFullName(resultSet.getObject("SECURITY_FULL_NAME", String.class)); + object.setSettlementDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "SETTLEMENT_DATE")); + object.setSettlementCurrency(resultSet.getObject("SETTLEMENT_CURRENCY", String.class)); + object.setExchangeExecutionMicroseconds(ReportUtils.getInstantFromTimestamp(resultSet, "EXCHANGE_EXECUTION_MICROSECONDS")); + object.setCoverageStatus(resultSet.getObject("COVERAGE_STATUS", String.class)); + object.setSessionId(resultSet.getObject("SESSION_ID", Long.class)); + object.setCounterPartyTradingClearingRegistryId(resultSet.getObject("COUNTER_PARTY_TRADING_CLEARING_REGISTRY_ID", Long.class)); + return object; + } + + @Override + protected String sqlQuery() { + return "select * from EXECUTION_FOND where CLEARING_DATE >= :startDate and CLEARING_DATE < :endDate"; + } + + @Override + protected Class getDBObjectClass() { + return ExecutionFond.class; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/IDBLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/IDBLoader.java new file mode 100644 index 000000000..b4c14f366 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/IDBLoader.java @@ -0,0 +1,59 @@ +package ru.spcex.clearing.registry.reports.loaders; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import ru.spcex.clearing.registry.conf.properties.PeriodProperties; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.time.LocalDate; +import java.util.List; + +public abstract class IDBLoader { + protected final Logger log = LoggerFactory.getLogger(getClass()); + protected final PeriodProperties periodProperties; + protected final NamedParameterJdbcTemplate clearingJdbc; + + protected IDBLoader(PeriodProperties periodProperties, NamedParameterJdbcTemplate clearingJdbc) { + this.periodProperties = periodProperties; + this.clearingJdbc = clearingJdbc; + } + + public List loadObjects() { + log.trace("Загрузчик {}", getClass().getSimpleName()); + long timer = System.currentTimeMillis(); + try { + String sql = sqlQuery(); + assert sql.contains(":startDate") && sql.contains(":endDate"); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("startDate", periodProperties.getStartDate()); + LocalDate endDate = periodProperties.getEndDate(); + endDate = endDate.plusDays(1); // startDate <= x < endDate, в базе может быть как DATE, TIMESTAMP + parameterSource.addValue("endDate", endDate); + log.debug("Запрос SQL: \"{}\", с параметрами: startDate={}, endDate={}", + sql, periodProperties.getStartDate(), endDate); + return clearingJdbc.query(sql, parameterSource, (rs, rowNum) -> fromRS(rs)); + } catch (Exception e) { + log.error("Не могу загрузить объект класса %s, причина:".formatted(getDBObjectClass()), e); + throw new RuntimeException(e); + } finally { + timer = System.currentTimeMillis() - timer; + log.debug("Загрузка {} завершена за {} ms", getDBObjectClass().getSimpleName(), timer); + } + } + + /** + * Метод должен возвращать либо объект, либо null если объект не подходит под условия + * (тогда он не будет включен в выборку) + */ + protected abstract T fromRS(ResultSet rs) throws SQLException; + + /** + * В созданном запросе обязательно должны быть параметры startDate и endDate + */ + protected abstract String sqlQuery(); + + protected abstract Class getDBObjectClass(); +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/IDBObject.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/IDBObject.java new file mode 100644 index 000000000..7739ce002 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/IDBObject.java @@ -0,0 +1,4 @@ +package ru.spcex.clearing.registry.reports.loaders; + +public interface IDBObject { +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/MoneyBalanceLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/MoneyBalanceLoader.java new file mode 100644 index 000000000..c9beeae3f --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/MoneyBalanceLoader.java @@ -0,0 +1,64 @@ +package ru.spcex.clearing.registry.reports.loaders; + +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.clearing.registry.exceptions.ConfigurationException; +import ru.spcex.clearing.registry.reports.bean.Company; +import ru.spcex.clearing.registry.reports.bean.RegistryHistory; +import ru.spcex.clearing.registry.reports.loaders.helpers.*; + +import java.math.BigDecimal; +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class MoneyBalanceLoader extends RegistryHistoryLoader { + private String houseName = ""; + + protected MoneyBalanceLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) { + super(properties, clearingJdbc); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("houseId", 2L); + List result = null; + try { + result = clearingJdbc.query( + "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where id = :houseId", + parameterSource, new CompanyRowMapper() + ); + } catch (Exception e) { + log.error("SQL error: {}", ExceptionUtils.getStackTrace(e)); + throw new ConfigurationException("Не могу получить объект companyId = 2 из БД"); + } + if (!result.isEmpty()) houseName = result.iterator().next().getShortName(); + } + + @Override + public List loadObjects() { + List result = super.loadObjects(); + result = result.stream() + .filter(registryHistory -> registryHistory.getObject().getDiffBalance().compareTo(BigDecimal.ZERO) == 0) + .collect(Collectors.toList()); + for (RegistryHistory registryHistory : result) { + registryHistory.setHouseName(houseName); + AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registryHistory.getObject().getAccountType()); + String account; + if (accountType == AccountType.Clrn || accountType == AccountType.Info) { + account = registryHistory.getObject().getAccount(); + registryHistory.setAccount(account); + } + } + return result; + } + + @Override + protected String sqlQuery() { + RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM_T); + return ("select * from REGISTRY_HISTORY where EVENT_TIME >= :startDate and EVENT_TIME < :endDate and (%s) " + + "and TRADING_CLEARING_REGISTRY is not null and (diff_balance=0 or account_type='INFO')") + // diff_balance=0 то же что и check_balance=balance + .formatted(registryCodeSqlBuilder.buildSql()); + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/MoneyInstructionLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/MoneyInstructionLoader.java new file mode 100644 index 000000000..42b0f6d43 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/MoneyInstructionLoader.java @@ -0,0 +1,128 @@ +package ru.spcex.clearing.registry.reports.loaders; + +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.clearing.registry.reports.bean.Account; +import ru.spcex.clearing.registry.reports.bean.Company; +import ru.spcex.clearing.registry.reports.bean.PaymentInstruction; +import ru.spcex.clearing.registry.reports.bean.Security; +import ru.spcex.clearing.registry.reports.loaders.helpers.AccountRowMapper; +import ru.spcex.clearing.registry.reports.loaders.helpers.AccountType; +import ru.spcex.clearing.registry.reports.loaders.helpers.CompanyRowMapper; +import ru.spcex.clearing.registry.reports.loaders.helpers.SecurityRowMapper; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +@Component +public class MoneyInstructionLoader extends PaymentInstructionLoader { + private final Set MONEY_ACCOUNT_TYPES = Set.of( + AccountType.Clrn.getKey(), + AccountType.Info.getKey(), + AccountType.Anlt.getKey(), + AccountType.Tran.getKey() + ); + + protected MoneyInstructionLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) { + super(properties, clearingJdbc); + } + + @Override + public List loadObjects() { + List result = new ArrayList<>(); + + List paymentInstructions = super.loadObjects(); + if (paymentInstructions.isEmpty()) { + log.warn("PaymentInstructions not found."); + return result; + } + Map> groupedPaymentInstruction = paymentInstructions.stream() + .collect(Collectors.groupingBy(PaymentInstruction::getCreditLeg_accountId)); + List ids = paymentInstructions.stream().map(PaymentInstruction::getCreditLeg_accountId).toList(); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", ids); + List accounts = clearingJdbc.query( + "select ID, ACCOUNT_TYPE from ACCOUNT where ID in (:ids)", + parameterSource, new AccountRowMapper() + ); + for (Account account : accounts) { + if (account.getAccountType() != null && !MONEY_ACCOUNT_TYPES.contains(account.getAccountType().toUpperCase())) + continue; + Long id = account.getId(); + List payments = groupedPaymentInstruction.get(id); + if (!payments.isEmpty()) result.addAll(payments); + } + + { + Map> groupedPaymentInstructionBySenderId = paymentInstructions.stream() + .collect(Collectors.groupingBy(PaymentInstruction::getSenderId)); + List senderIds = new ArrayList<>(groupedPaymentInstructionBySenderId.keySet()); + parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", senderIds); + List companies = clearingJdbc.query( + "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)", + parameterSource, new CompanyRowMapper() + ); + for (Company company : companies) { + Long id = company.getId(); + List payments = groupedPaymentInstructionBySenderId.get(id); + if (payments != null) { + for (PaymentInstruction paymentInstruction : payments) { + paymentInstruction.setSender(company.getShortName()); + paymentInstruction.setSenderClearingCode(company.getClearingCode()); + paymentInstruction.setSenderCompanyClearingCode(company.getClearingCode()); + paymentInstruction.setSenderCompanyShortName(company.getShortName()); + } + } + } + } + + { + Map> groupedPaymentInstructionByAddresseeId = paymentInstructions.stream() + .collect(Collectors.groupingBy(PaymentInstruction::getAddresseeId)); + List addresseeIds = new ArrayList<>(groupedPaymentInstructionByAddresseeId.keySet()); + parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", addresseeIds); + List companies = clearingJdbc.query( + "select ID, CLEARING_CODE, SHORT_NAME from COMPANY where ID in (:ids)", + parameterSource, new CompanyRowMapper() + ); + for (Company company : companies) { + Long id = company.getId(); + List payments = groupedPaymentInstructionByAddresseeId.get(id); + if (payments != null) { + for (PaymentInstruction paymentInstruction : payments) { + paymentInstruction.setAddressee(company.getShortName()); + paymentInstruction.setAddresseeClearingCode(company.getClearingCode()); + paymentInstruction.setAddresseeCompanyClearingCode(company.getClearingCode()); + paymentInstruction.setAddresseeCompanyShortName(company.getShortName()); + } + } + } + } + + Map> groupedBySecurityId = paymentInstructions.stream() + .collect(Collectors.groupingBy(PaymentInstruction::getCreditLeg_securityId)); + Set securityIds = groupedBySecurityId.keySet(); + MapSqlParameterSource parameterSourceSecurityIds = new MapSqlParameterSource(); + parameterSourceSecurityIds.addValue("ids", securityIds); + List securities = clearingJdbc.query( + "select ID, SECURITY_SYMBOL from SECURITY where ID in (:ids)", + parameterSourceSecurityIds, new SecurityRowMapper() + ); + for (Security security : securities) { + List paymentInstructionList = groupedBySecurityId.get(security.getId()); + if (paymentInstructionList != null) { + for (PaymentInstruction paymentInstruction : paymentInstructionList) { + paymentInstruction.setSecurity(security.getSecuritySymbol()); + } + } + } + return result; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/PaymentInstructionLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/PaymentInstructionLoader.java new file mode 100644 index 000000000..fbd20c67d --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/PaymentInstructionLoader.java @@ -0,0 +1,108 @@ +package ru.spcex.clearing.registry.reports.loaders; + +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.clearing.registry.reports.ReportUtils; +import ru.spcex.clearing.registry.reports.bean.Account; +import ru.spcex.clearing.registry.reports.bean.PaymentInstruction; +import ru.spcex.clearing.registry.reports.loaders.helpers.Account2RowMapper; + +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Component +public abstract class PaymentInstructionLoader extends IDBLoader { + protected PaymentInstructionLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) { + super(properties.getPeriod(), clearingJdbc); + } + + @Override + public List loadObjects() { + List paymentInstructions = super.loadObjects(); + if (paymentInstructions.isEmpty()) { + log.warn("PaymentInstruction not found."); + return new ArrayList<>(); + } + + Collection allAccountIds = paymentInstructions.stream() + .map(PaymentInstruction::getCreditLeg_accountId) + .collect(Collectors.toSet()); + allAccountIds.addAll(paymentInstructions.stream() + .map(PaymentInstruction::getDebitLeg_accountId) + .collect(Collectors.toSet())); + + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("ids", allAccountIds); + List accounts = clearingJdbc.query( + "select ID, ACCOUNT_TYPE, ACCOUNT from ACCOUNT where ID in (:ids)", + parameterSource, new Account2RowMapper() + ); + Map accountIdMap = accounts.stream().collect(Collectors.toMap(Account::getId, o -> o)); + + for (PaymentInstruction p : paymentInstructions) { + Account creditLegAccount = accountIdMap.get(p.getCreditLeg_accountId()); + if (creditLegAccount != null) + p.setCreditLegAccountStr(creditLegAccount.getAccount()); + Account debitLegAccount = accountIdMap.get(p.getDebitLeg_accountId()); + if (debitLegAccount != null) + p.setDebitLegAccountStr(debitLegAccount.getAccount()); + } + + return paymentInstructions; + } + + @Override + protected PaymentInstruction fromRS(ResultSet resultSet) throws SQLException { + PaymentInstruction object = new PaymentInstruction(); + object.setId(resultSet.getObject("ID", Long.class)); + object.setSenderId(resultSet.getObject("SENDER_ID", Long.class)); + object.setAddresseeId(resultSet.getObject("ADDRESSEE_ID", Long.class)); + object.setPayeeBic(resultSet.getObject("PAYEE_BIC", String.class)); + object.setAddresseeBic(resultSet.getObject("ADRESSEE_BIC", String.class)); + object.setPayeeBankName(resultSet.getObject("PAYEE_BANK_NAME", String.class)); + object.setAddresseeBankName(resultSet.getObject("ADDRESSEE_BANK_NAME", String.class)); + object.setPaymentDate(ReportUtils.getInstantFromTimestamp(resultSet, "PAYMENT_DATE")); + object.setPaymentPurpose(resultSet.getObject("PAYMENT_PURPOSE", String.class)); + object.setSettlementDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "SETTLEMENT_DATE")); + object.setCreditLeg_amount(resultSet.getObject("CREDIT_LEG_AMOUNT", BigDecimal.class)); + object.setDebitLeg_amount(resultSet.getObject("DEBIT_LEG_AMOUNT", BigDecimal.class)); + object.setCreditLeg_accountId(resultSet.getObject("CREDIT_LEG_ACCOUNT_ID", Long.class)); + object.setCredit_csAccount(resultSet.getObject("CREDIT_CS_ACCOUNT", String.class)); + object.setCreditLeg_account(resultSet.getObject("CREDIT_LEG_ACCOUNT", String.class)); + object.setDebitLeg_accountId(resultSet.getObject("DEBIT_LEG_ACCOUNT_ID", Long.class)); + object.setDebit_csAccount(resultSet.getObject("DEBIT_CS_ACCOUNT", String.class)); + object.setDebitLeg_account(resultSet.getObject("DEBIT_LEG_ACCOUNT", String.class)); + object.setCreditLeg_direction(resultSet.getObject("CREDIT_LEG_DIRECTION", String.class)); + object.setDebitLeg_direction(resultSet.getObject("DEBIT_LEG_DIRECTION", String.class)); + object.setCreditLeg_currencyCode(resultSet.getObject("CREDIT_LEG_CURRENCY_CODE", String.class)); + object.setDebitLeg_currencyCode(resultSet.getObject("DEBIT_LEG_CURRENCY_CODE", String.class)); + object.setCreditLeg_securityId(resultSet.getObject("CREDIT_LEG_SECURITY_ID", Long.class)); + object.setDebitLeg_securityId(resultSet.getObject("DEBIT_LEG_SECURITY_ID", Long.class)); + object.setTransactionStatus(resultSet.getObject("TRANSACTION_STATUS", String.class)); + object.setDocumentNumber(resultSet.getObject("DOCUMENT_NUMBER", String.class)); + object.setCreated(ReportUtils.getInstantFromTimestamp(resultSet, "CREATED_AT")); + object.setUpdated(ReportUtils.getInstantFromTimestamp(resultSet, "UPDATED_AT")); + object.setClearingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "CLEARING_DATE")); + object.setSessionId(resultSet.getObject("SESSION_ID", Long.class)); + return object; + } + + @Override + protected Class getDBObjectClass() { + return PaymentInstruction.class; + } + + + @Override + protected String sqlQuery() { + return "select * from PAYMENT_INSTRUCTION where CLEARING_DATE >= :startDate and CLEARING_DATE < :endDate"; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/RegistryHistoryLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/RegistryHistoryLoader.java new file mode 100644 index 000000000..21899cdbf --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/RegistryHistoryLoader.java @@ -0,0 +1,100 @@ +package ru.spcex.clearing.registry.reports.loaders; + +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.clearing.registry.reports.ReportUtils; +import ru.spcex.clearing.registry.reports.bean.Registry; +import ru.spcex.clearing.registry.reports.bean.RegistryHistory; + +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; + +@Component +public abstract class RegistryHistoryLoader extends IDBLoader { + protected RegistryHistoryLoader(AProperties properties, + NamedParameterJdbcTemplate clearingJdbc) { + super(properties.getPeriod(), clearingJdbc); + } + + @Override + protected RegistryHistory fromRS(ResultSet resultSet) throws SQLException { + RegistryHistory historyObject = new RegistryHistory(); + Registry object = new Registry(); + + historyObject.setId(resultSet.getObject("ID", Long.class)); + historyObject.setEventTime(ReportUtils.getInstantFromTimestamp(resultSet, "EVENT_TIME")); + historyObject.setUserId(resultSet.getObject("EVENT_USER_ID", Long.class)); + historyObject.setEventType(resultSet.getObject("EVENT_TYPE", String.class)); + + object.setCreated(ReportUtils.getInstantFromTimestamp(resultSet, "CREATED_AT")); + object.setUpdated(ReportUtils.getInstantFromTimestamp(resultSet, "UPDATED_AT")); + + object.setId(resultSet.getObject("REGISTRY_ID", Long.class)); + object.setCompanyId(resultSet.getObject("COMPANY_ID", Long.class)); + object.setTradingCode(resultSet.getObject("TRADING_CODE", String.class)); + object.setClearingCode(resultSet.getObject("CLEARING_CODE", String.class)); + object.setShortName(resultSet.getObject("SHORT_NAME", String.class)); + object.setFullName(resultSet.getObject("FULL_NAME", String.class)); + object.setAccountId(resultSet.getObject("ACCOUNT_ID", Long.class)); + + object.setAccountType(resultSet.getObject("ACCOUNT_TYPE", String.class)); + object.setAccount(resultSet.getObject("ACCOUNT", String.class)); + object.setRegistryDesignation(resultSet.getObject("REGISTRY_DESIGNATION", String.class)); + object.setRegistryInstrumentType(resultSet.getObject("REGISTRY_INSTRUMENT_TYPE", String.class)); + object.setRegistryCapacity(resultSet.getObject("REGISTRY_CAPACITY", String.class)); + + object.setRegistryUnit(resultSet.getObject("REGISTRY_UNIT", String.class)); + object.setRegistryCode(resultSet.getObject("REGISTRY_CODE", String.class)); + object.setTradingClearingRegistryId(resultSet.getObject("TRADING_CLEARING_REGISTRY_ID", Long.class)); + object.setTradingClearingRegistry(resultSet.getObject("TRADING_CLEARING_REGISTRY", String.class)); + + object.setRegistryStatus(resultSet.getObject("REGISTRY_STATUS", String.class)); + object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class)); + object.setSecuritySymbol(resultSet.getObject("SECURITY_SYMBOL", String.class)); + object.setBalance(resultSet.getObject("BALANCE", BigDecimal.class)); + object.setOpenBalance(resultSet.getObject("OPEN_BALANCE", BigDecimal.class)); + object.setCloseBalance(resultSet.getObject("CLOSE_BALANCE", BigDecimal.class)); + + object.setCredit(resultSet.getObject("CREDIT", BigDecimal.class)); + object.setDebit(resultSet.getObject("DEBIT", BigDecimal.class)); + object.setSettledCredit(resultSet.getObject("SETTLED_CREDIT", BigDecimal.class)); + object.setSettledDebit(resultSet.getObject("SETTLED_DEBIT", BigDecimal.class)); + object.setCheckBalance(resultSet.getObject("CHECK_BALANCE", BigDecimal.class)); + object.setDiffBalance(resultSet.getObject("DIFF_BALANCE", BigDecimal.class)); + object.setPlanBalance(resultSet.getObject("PLAN_BALANCE", BigDecimal.class)); + + object.setBalanceDimension(resultSet.getObject("BALANCE_DIMENSION", String.class)); + object.setSettlementDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "SETTLEMENT_DATE")); + object.setSettlementCode(resultSet.getObject("SETTLEMENT_CODE", String.class)); + object.setTradingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "TRADING_DATE")); + object.setClearingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "CLEARING_DATE")); + object.setRefundDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "REFUND_DATE")); + + object.setValueDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "VALUE_DATE")); + object.setPrice(resultSet.getObject("PRICE", BigDecimal.class)); + object.setContract(resultSet.getObject("CONTRACT", String.class)); + object.setCounterPartyId(resultSet.getObject("COUNTER_PARTY_ID", Long.class)); + object.setComment(resultSet.getObject("COMMENT", String.class)); + object.setParentId(resultSet.getObject("PARENT_ID", Long.class)); + object.setGroupId(resultSet.getObject("GROUP_ID", Long.class)); + object.setSessionId(resultSet.getObject("SESSION_ID", Long.class)); + + object.setSessionType(resultSet.getObject("SESSION_TYPE", String.class)); + object.setPaymentId(resultSet.getObject("PAYMENT_ID", Long.class)); + + historyObject.setObject(object); + return historyObject; + } + + @Override + protected String sqlQuery() { + return "select * from REGISTRY_HISTORY where EVENT_TIME >= :startDate and EVENT_TIME < :endDate"; + } + + @Override + protected Class getDBObjectClass() { + return RegistryHistory.class; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/RegistryLoader.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/RegistryLoader.java new file mode 100644 index 000000000..393334dea --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/RegistryLoader.java @@ -0,0 +1,141 @@ +package ru.spcex.clearing.registry.reports.loaders; + +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.clearing.registry.reports.ReportUtils; +import ru.spcex.clearing.registry.reports.bean.*; +import ru.spcex.clearing.registry.reports.loaders.helpers.ADictionaryRowMapper; +import ru.spcex.clearing.registry.reports.loaders.helpers.RegistryCodeSqlBuilder; +import ru.spcex.clearing.registry.reports.loaders.helpers.RegistryTradingParams; + +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; +import java.util.function.BiConsumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Component +public class RegistryLoader extends IDBLoader { + protected RegistryLoader(AProperties properties, NamedParameterJdbcTemplate clearingJdbc) { + super(properties.getPeriod(), clearingJdbc); + } + + @Override + public List loadObjects() { + List result = super.loadObjects(); + if (result.isEmpty()) { + log.warn("Registries not found."); + return new ArrayList<>(); + } + + // Мэппинг словаря здесь, а не в LiabilitiesRegistryReportBuilder + { + Set registryStatuses = result.stream().map(Registry::getRegistryStatus).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("expectedStatuses", registryStatuses); + List registryStatusDictionaries = clearingJdbc.query( + "select CODE, NAME from registry_status_dictionary where CODE in (:expectedStatuses)", + parameterSource, ADictionaryRowMapper.forRegistryStatusDictionary() + ); + mappingField(result, registryStatusDictionaries, Registry::getRegistryStatus, Registry::setRegistryStatus_dictionary); + } + { + Set sessionTypes = result.stream().map(Registry::getSessionType).collect(Collectors.toSet()); + MapSqlParameterSource parameterSource = new MapSqlParameterSource(); + parameterSource.addValue("sessionTypes", sessionTypes); + List sessionTypeDictionaries = clearingJdbc.query( + "select CODE, NAME from session_type_dictionary where CODE in (:sessionTypes)", + parameterSource, ADictionaryRowMapper.forSessionTypeDictionary() + ); + mappingField(result, sessionTypeDictionaries, Registry::getSessionType, Registry::setSessionType_dictionary); + } + + return result; + } + + private void mappingField(Collection inRows, + List dictionaryLst, + Function getter, BiConsumer setter) { + Map> registryStatusDictionariesByCode = dictionaryLst.stream() + .collect(Collectors.groupingBy(D::getCode)); + for (Registry registry : inRows) { + String key = getter.apply(registry); + List regStatuses = registryStatusDictionariesByCode.get(key); + String value = key; + if (regStatuses != null && !regStatuses.isEmpty()) { + value = regStatuses.iterator().next().getName(); + } + setter.accept(registry, value); + } + } + + @Override + protected String sqlQuery() { + RegistryCodeSqlBuilder registryCodeSqlBuilder = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.OM_T, RegistryTradingParams.OS_T); + return ("select * from REGISTRY where SETTLEMENT_DATE >= :startDate and SETTLEMENT_DATE < :endDate " + + "and (%s) and REGISTRY_STATUS='%s'") // and TRADING_CLEARING_REGISTRY is not null + .formatted(registryCodeSqlBuilder.buildSql(), RegistryStatus.CLRD.getKey()); + } + + @Override + protected Class getDBObjectClass() { + return Registry.class; + } + + @Override + protected Registry fromRS(ResultSet resultSet) throws SQLException { + Registry object = new Registry(); + object.setCompanyId(resultSet.getObject("COMPANY_ID", Long.class)); + object.setTradingCode(resultSet.getObject("TRADING_CODE", String.class)); + object.setClearingCode(resultSet.getObject("CLEARING_CODE", String.class)); + object.setShortName(resultSet.getObject("SHORT_NAME", String.class)); + object.setFullName(resultSet.getObject("FULL_NAME", String.class)); + object.setAccountId(resultSet.getObject("ACCOUNT_ID", Long.class)); + object.setAccountType(resultSet.getObject("ACCOUNT_TYPE", String.class)); + object.setAccount(resultSet.getObject("ACCOUNT", String.class)); + object.setRegistryDesignation(resultSet.getObject("REGISTRY_DESIGNATION", String.class)); + object.setRegistryInstrumentType(resultSet.getObject("REGISTRY_INSTRUMENT_TYPE", String.class)); + object.setRegistryCapacity(resultSet.getObject("REGISTRY_CAPACITY", String.class)); + object.setRegistryUnit(resultSet.getObject("REGISTRY_UNIT", String.class)); + object.setRegistryCode(resultSet.getObject("REGISTRY_CODE", String.class)); + object.setTradingClearingRegistryId(resultSet.getObject("TRADING_CLEARING_REGISTRY_ID", Long.class)); + object.setTradingClearingRegistry(resultSet.getObject("TRADING_CLEARING_REGISTRY", String.class)); + object.setRegistryStatus(resultSet.getObject("REGISTRY_STATUS", String.class)); + object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class)); + object.setSecuritySymbol(resultSet.getObject("SECURITY_SYMBOL", String.class)); + object.setBalance(resultSet.getObject("BALANCE", BigDecimal.class)); + object.setOpenBalance(resultSet.getObject("OPEN_BALANCE", BigDecimal.class)); + object.setCloseBalance(resultSet.getObject("CLOSE_BALANCE", BigDecimal.class)); + object.setCredit(resultSet.getObject("CREDIT", BigDecimal.class)); + object.setDebit(resultSet.getObject("DEBIT", BigDecimal.class)); + object.setSettledCredit(resultSet.getObject("SETTLED_CREDIT", BigDecimal.class)); + object.setSettledDebit(resultSet.getObject("SETTLED_DEBIT", BigDecimal.class)); + object.setCheckBalance(resultSet.getObject("CHECK_BALANCE", BigDecimal.class)); + object.setDiffBalance(resultSet.getObject("DIFF_BALANCE", BigDecimal.class)); + object.setPlanBalance(resultSet.getObject("PLAN_BALANCE", BigDecimal.class)); + object.setBalanceDimension(resultSet.getObject("BALANCE_DIMENSION", String.class)); + object.setSettlementDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "SETTLEMENT_DATE")); + object.setSettlementCode(resultSet.getObject("SETTLEMENT_CODE", String.class)); + object.setTradingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "TRADING_DATE")); + object.setClearingDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "CLEARING_DATE")); + object.setRefundDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "REFUND_DATE")); + object.setValueDate(ReportUtils.getLocalDateFromSqlDate(resultSet, "VALUE_DATE")); + object.setPrice(resultSet.getObject("PRICE", BigDecimal.class)); + object.setContract(resultSet.getObject("CONTRACT", String.class)); + object.setCounterPartyId(resultSet.getObject("COUNTER_PARTY_ID", Long.class)); + object.setComment(resultSet.getObject("COMMENT", String.class)); + object.setParentId(resultSet.getObject("PARENT_ID", Long.class)); + object.setGroupId(resultSet.getObject("GROUP_ID", Long.class)); + object.setSessionId(resultSet.getObject("SESSION_ID", Long.class)); + object.setSessionType(resultSet.getObject("SESSION_TYPE", String.class)); + object.setPaymentId(resultSet.getObject("PAYMENT_ID", Long.class)); + object.setId(resultSet.getObject("ID", Long.class)); + object.setCreated(ReportUtils.getInstantFromTimestamp(resultSet, "CREATED_AT")); + object.setUpdated(ReportUtils.getInstantFromTimestamp(resultSet, "UPDATED_AT")); + return object; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/ADictionaryRowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/ADictionaryRowMapper.java new file mode 100644 index 000000000..eb1d4c00d --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/ADictionaryRowMapper.java @@ -0,0 +1,41 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +import org.springframework.jdbc.core.RowMapper; +import ru.spcex.clearing.registry.reports.bean.AbstractDictionary; +import ru.spcex.clearing.registry.reports.bean.AllowedDictionary; +import ru.spcex.clearing.registry.reports.bean.RegistryStatusDictionary; +import ru.spcex.clearing.registry.reports.bean.SessionTypeDictionary; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Objects; +import java.util.function.Supplier; + +public class ADictionaryRowMapper implements RowMapper { + protected final Supplier objectCreator; + + public ADictionaryRowMapper(Supplier objectCreator) { + this.objectCreator = Objects.requireNonNull(objectCreator); + } + + @Override + public T mapRow(ResultSet rs, int rowNum) throws SQLException { + T registryStatusDictionary = objectCreator.get(); + registryStatusDictionary.setCode(rs.getString("CODE")); + registryStatusDictionary.setName(rs.getString("NAME")); + return registryStatusDictionary; + } + + public static ADictionaryRowMapper forAllowedDictionary() { + return new ADictionaryRowMapper<>(AllowedDictionary::new); + } + + public static ADictionaryRowMapper forRegistryStatusDictionary() { + return new ADictionaryRowMapper<>(RegistryStatusDictionary::new); + } + + public static ADictionaryRowMapper forSessionTypeDictionary() { + return new ADictionaryRowMapper<>(SessionTypeDictionary::new); + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/Account2RowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/Account2RowMapper.java new file mode 100644 index 000000000..d3893160f --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/Account2RowMapper.java @@ -0,0 +1,18 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +import org.springframework.jdbc.core.RowMapper; +import ru.spcex.clearing.registry.reports.bean.Account; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class Account2RowMapper implements RowMapper { + @Override + public Account mapRow(ResultSet rs, int rowNum) throws SQLException { + Account account = new Account(); + account.setId(rs.getLong("ID")); + account.setAccountType(rs.getString("ACCOUNT_TYPE")); + account.setAccount(rs.getString("ACCOUNT")); + return account; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AccountRowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AccountRowMapper.java new file mode 100644 index 000000000..f4175dce3 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AccountRowMapper.java @@ -0,0 +1,17 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +import org.springframework.jdbc.core.RowMapper; +import ru.spcex.clearing.registry.reports.bean.Account; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class AccountRowMapper implements RowMapper { + @Override + public Account mapRow(ResultSet rs, int rowNum) throws SQLException { + Account account = new Account(); + account.setId(rs.getLong("ID")); + account.setAccountType(rs.getString("ACCOUNT_TYPE")); + return account; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AccountType.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AccountType.java new file mode 100644 index 000000000..7bfce0651 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AccountType.java @@ -0,0 +1,17 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +public enum AccountType implements IEnumKey { + Clrn("CLRN"), Bank("BANK"), Info("INFO"), Tran("TRAN"), Corr("CORR"), Anlt("ANLT"), Depo("DEPO"), + Dtrn("DTRN"); + + private final String key; + + AccountType(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AllowedDictionaryRowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AllowedDictionaryRowMapper.java new file mode 100644 index 000000000..b876552a3 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/AllowedDictionaryRowMapper.java @@ -0,0 +1,17 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +import org.springframework.jdbc.core.RowMapper; +import ru.spcex.clearing.registry.reports.bean.AllowedDictionary; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class AllowedDictionaryRowMapper implements RowMapper { + @Override + public AllowedDictionary mapRow(ResultSet rs, int rowNum) throws SQLException { + AllowedDictionary allowedDictionary = new AllowedDictionary(); + allowedDictionary.setCode(rs.getString("CODE")); + allowedDictionary.setName(rs.getString("NAME")); + return allowedDictionary; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/CompanyRowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/CompanyRowMapper.java new file mode 100644 index 000000000..224bab76d --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/CompanyRowMapper.java @@ -0,0 +1,18 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +import org.springframework.jdbc.core.RowMapper; +import ru.spcex.clearing.registry.reports.bean.Company; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class CompanyRowMapper implements RowMapper { + @Override + public Company mapRow(ResultSet rs, int rowNum) throws SQLException { + Company company = new Company(); + company.setId(rs.getLong("ID")); + company.setClearingCode(rs.getString("CLEARING_CODE")); + company.setShortName(rs.getString("SHORT_NAME")); + return company; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/CompanySymbolsRowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/CompanySymbolsRowMapper.java new file mode 100644 index 000000000..a89994162 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/CompanySymbolsRowMapper.java @@ -0,0 +1,19 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +import org.springframework.jdbc.core.RowMapper; +import ru.spcex.clearing.registry.reports.bean.CompanySymbols; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class CompanySymbolsRowMapper implements RowMapper { + @Override + public CompanySymbols mapRow(ResultSet rs, int rowNum) throws SQLException { + CompanySymbols companySymbols = new CompanySymbols(); + companySymbols.setId(rs.getLong("ID")); + companySymbols.setCompanyId(rs.getLong("COMPANY_ID")); + companySymbols.setCompanySymbol(rs.getString("COMPANY_SYMBOL")); + companySymbols.setCompanySymbolValue(rs.getString("COMPANY_SYMBOL_VALUE")); + return companySymbols; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/IEnumKey.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/IEnumKey.java new file mode 100644 index 000000000..fdbb8ba4e --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/IEnumKey.java @@ -0,0 +1,77 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +import java.io.Serializable; +import java.util.Objects; + +public interface IEnumKey extends Serializable { + String getKey(); + + default boolean equalsByKey(String key) { + return key != null && getKey().equalsIgnoreCase(key); + } + + /** + * Проверяет что среди данного набора Enum, присутствует элемент с данным id + * id может быть null + */ + static & IEnumKey> boolean contains(String id, T... enumSet) { + for (T e : enumSet) { + if (Objects.equals(id, e.getKey())) + return true; + } + return false; + } + + static & IEnumKey> boolean contains(T e, T... enumSet) { + for (T enumEl : enumSet) { + if (enumEl.equals(e)) + return true; + } + return false; + } + + /** + * Проверяет что среди всех Enum данного класса, присутствует элемент с данным id + * id может быть null + */ + static & IEnumKey> boolean contains(String key, Class enumClass) { + for (T e : enumClass.getEnumConstants()) { + if (Objects.equals(key, e.getKey())) + return true; + } + return false; + } + + /** + * Возвращает Enum по id, если в заданном классе такой определен + * id может быть null + * + * @return Enum если нашел, иначе null + */ + static & IEnumKey> T getEnumByKey(Class enumClass, String key) { + for (T e : enumClass.getEnumConstants()) { + if (Objects.equals(key, e.getKey())) + return e; + } + return null; + } + + static & IEnumKey> T getEnumByKeyOrUndefined(Class enumClass, String key) { + T enumByKey = getEnumByKey(enumClass, key); + return enumByKey == null ? getUndefined(enumClass) : enumByKey; + } + + static & IEnumKey> T getUndefined(Class enumClass) { + T enumByKey = getEnumByKey(enumClass, UNDEFINED_VALUE); + if (enumByKey == null) { + throw new IllegalArgumentException("Undefined value not found in enum " + enumClass); + } + return enumByKey; + } + + static String getKeyOrNull(IEnumKey enumVal) { + return enumVal == null ? null : enumVal.getKey(); + } + + String UNDEFINED_VALUE = "_Undefined"; +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryCapacity.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryCapacity.java new file mode 100644 index 000000000..683f21307 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryCapacity.java @@ -0,0 +1,22 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +public enum RegistryCapacity implements IEnumKey { + A("A"), + B("B"), + Z("Z"), + C("C"), + E("E"), + P("P") + ; + + private final String key; + + RegistryCapacity(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryCodeSqlBuilder.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryCodeSqlBuilder.java new file mode 100644 index 000000000..e9781b037 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryCodeSqlBuilder.java @@ -0,0 +1,65 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class RegistryCodeSqlBuilder { + + private List registryTradingParams; + + public static RegistryCodeSqlBuilder getInstance(RegistryTradingParams... tradingParams) { + return new RegistryCodeSqlBuilder(Arrays.asList(tradingParams)); + } + + private RegistryCodeSqlBuilder(List tradingParams) { + this.registryTradingParams = tradingParams; + } + + public String buildSql() { + List conditions = new ArrayList<>(); + String REGISTRY_DESIGNATION_FORMAT = "REGISTRY_DESIGNATION = '%s'"; + String REGISTRY_INSTRUMENT_TYPE_FORMAT = "REGISTRY_INSTRUMENT_TYPE = '%s'"; + String REGISTRY_CAPACITY_FORMAT = "REGISTRY_CAPACITY = '%s'"; + String REGISTRY_UNIT_FORMAT = "REGISTRY_UNIT = '%s'"; + for (RegistryTradingParams tradingParams : this.registryTradingParams) { + StringBuilder condition = new StringBuilder(); + boolean wasAddedCondition = false; + if (tradingParams.registryDesignation() != null) { + condition.append(String.format(REGISTRY_DESIGNATION_FORMAT, tradingParams.registryDesignation().getKey())); + wasAddedCondition = true; + } + if (wasAddedCondition) { + condition.append(" and "); + wasAddedCondition = false; + } + if (tradingParams.registryInstrumentType() != null) { + condition.append(String.format(REGISTRY_INSTRUMENT_TYPE_FORMAT, tradingParams.registryInstrumentType().getKey())); + wasAddedCondition = true; + } + if (wasAddedCondition) { + condition.append(" and "); + wasAddedCondition = false; + } + if (tradingParams.registryCapacity() != null) { + condition.append(String.format(REGISTRY_CAPACITY_FORMAT, tradingParams.registryCapacity().getKey())); + wasAddedCondition = true; + } + if (wasAddedCondition) { + condition.append(" and "); + wasAddedCondition = false; + } + if (tradingParams.registryUnit() != null) { + condition.append(String.format(REGISTRY_UNIT_FORMAT, tradingParams.registryUnit().getKey())); + wasAddedCondition = true; + } + if (!wasAddedCondition) { + condition.delete(condition.length() - " and ".length(), condition.length()); + } + conditions.add(condition); + } + return conditions.stream().collect(Collectors.joining(") or (", "(", ")")); + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryDesignation.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryDesignation.java new file mode 100644 index 000000000..ae36127cb --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryDesignation.java @@ -0,0 +1,22 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +public enum RegistryDesignation implements IEnumKey { + A("A"), + O("O"), + T("T"), + D("D"), + L("L"), + C("C") + ; + + private final String key; + + RegistryDesignation(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryInstrumentType.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryInstrumentType.java new file mode 100644 index 000000000..4c57f9d0a --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryInstrumentType.java @@ -0,0 +1,18 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +public enum RegistryInstrumentType implements IEnumKey { + M("M"), + S("S"), + ; + + private final String key; + + RegistryInstrumentType(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryTradingParams.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryTradingParams.java new file mode 100644 index 000000000..82fb0eba1 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryTradingParams.java @@ -0,0 +1,263 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +public record RegistryTradingParams(RegistryDesignation registryDesignation, + RegistryInstrumentType registryInstrumentType, + RegistryCapacity registryCapacity, + RegistryUnit registryUnit) { + + public boolean equalByRegistry(RegistryDesignation registryDesignation, RegistryInstrumentType registryInstrumentType, + RegistryCapacity registryCapacity, RegistryUnit registryUnit) { + boolean isEqualDesignation = this.registryDesignation == null || registryDesignation == this.registryDesignation; + boolean isEqualInstrumentType = this.registryInstrumentType == null || registryInstrumentType == this.registryInstrumentType; + boolean isEqualCapacity = this.registryCapacity == null || registryCapacity == this.registryCapacity; + boolean isEqualUnit = this.registryUnit == null || registryUnit == this.registryUnit; + return isEqualDesignation && isEqualInstrumentType && isEqualCapacity && isEqualUnit; + } + + public RegistryTradingParams dsgn(RegistryDesignation registryDesignation) { + return new RegistryTradingParams(registryDesignation, + registryInstrumentType, + registryCapacity, + registryUnit); + } + + public RegistryTradingParams dsgn(String registryDesignationS) { + RegistryDesignation registryDesignation = IEnumKey.getEnumByKey(RegistryDesignation.class, registryDesignationS); + return new RegistryTradingParams(registryDesignation, + registryInstrumentType, + registryCapacity, + registryUnit); + } + + public RegistryTradingParams type(RegistryInstrumentType registryInstrumentType) { + return new RegistryTradingParams(registryDesignation, + registryInstrumentType, + registryCapacity, + registryUnit); + } + + public RegistryTradingParams type(String registryInstrumentTypeS) { + RegistryInstrumentType registryInstrumentType = IEnumKey.getEnumByKey(RegistryInstrumentType.class, + registryInstrumentTypeS); + return new RegistryTradingParams(registryDesignation, + registryInstrumentType, + registryCapacity, + registryUnit); + } + + public RegistryTradingParams cpcty(RegistryCapacity registryCapacity) { + return new RegistryTradingParams(registryDesignation, + registryInstrumentType, + registryCapacity, + registryUnit); + } + + public RegistryTradingParams cpcty(String registryCapacityS) { + RegistryCapacity registryCapacity = IEnumKey.getEnumByKey(RegistryCapacity.class, registryCapacityS); + return new RegistryTradingParams(registryDesignation, + registryInstrumentType, + registryCapacity, + registryUnit); + } + + public RegistryTradingParams unit(RegistryUnit registryUnit) { + return new RegistryTradingParams(registryDesignation, + registryInstrumentType, + registryCapacity, + registryUnit); + } + + public RegistryTradingParams unit(String registryUnitS) { + RegistryUnit registryUnit = IEnumKey.getEnumByKey(RegistryUnit.class, registryUnitS); + return new RegistryTradingParams(registryDesignation, + registryInstrumentType, + registryCapacity, + registryUnit); + } + + public final static RegistryTradingParams OS_T; + public final static RegistryTradingParams OM_T; + public final static RegistryTradingParams TS_T; + public final static RegistryTradingParams TM_T; + public final static RegistryTradingParams DM_X; + public final static RegistryTradingParams DM_T; + public final static RegistryTradingParams DM_I; + public final static RegistryTradingParams AM_F; + public final static RegistryTradingParams AM_T; + public final static RegistryTradingParams AM_B; + public final static RegistryTradingParams A__B; + public final static RegistryTradingParams A__F; + public final static RegistryTradingParams A__T; + public final static RegistryTradingParams AS_T; + public final static RegistryTradingParams DS_I; + public final static RegistryTradingParams DS_T; + public final static RegistryTradingParams AS_B; + public final static RegistryTradingParams AS_F; + public final static RegistryTradingParams CM_T; + public final static RegistryTradingParams LM_T; + public final static RegistryTradingParams CS_T; + public final static RegistryTradingParams LS_T; + public final static RegistryTradingParams L__T; + public final static RegistryTradingParams DM__; + public final static RegistryTradingParams AM__; + public final static RegistryTradingParams AS__; + public final static RegistryTradingParams CM__; + public final static RegistryTradingParams C__T; + public final static RegistryTradingParams O__T; + public final static RegistryTradingParams T__T; + public final static RegistryTradingParams LM__; + public final static RegistryTradingParams DMAU; + public final static RegistryTradingParams DMAI; + public final static RegistryTradingParams D__I; + public final static RegistryTradingParams D__V; + public final static RegistryTradingParams _S_T; + + static { + OS_T = new RegistryTradingParams(RegistryDesignation.O, + RegistryInstrumentType.S, + null, + RegistryUnit.T); + OM_T = new RegistryTradingParams(RegistryDesignation.O, + RegistryInstrumentType.M, + null, + RegistryUnit.T); + TS_T = new RegistryTradingParams(RegistryDesignation.T, + RegistryInstrumentType.S, + null, + RegistryUnit.T); + + TM_T = new RegistryTradingParams(RegistryDesignation.T, + RegistryInstrumentType.M, + null, + RegistryUnit.T); + DM_X = new RegistryTradingParams(RegistryDesignation.D, + RegistryInstrumentType.M, + null, + RegistryUnit.X); + DM_T = new RegistryTradingParams(RegistryDesignation.D, + RegistryInstrumentType.M, + null, + RegistryUnit.T); + DM_I = new RegistryTradingParams(RegistryDesignation.D, + RegistryInstrumentType.M, + null, + RegistryUnit.I); + AM_F = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.M, + null, + RegistryUnit.F); + AM_T = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.M, + null, + RegistryUnit.T); + AM_B = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.M, + null, + RegistryUnit.B); + A__B = new RegistryTradingParams(RegistryDesignation.A, + null, + null, + RegistryUnit.B); + A__F = new RegistryTradingParams(RegistryDesignation.A, + null, + null, + RegistryUnit.F); + A__T = new RegistryTradingParams(RegistryDesignation.A, + null, + null, + RegistryUnit.T); + AS_T = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.S, + null, + RegistryUnit.T); + AS_B = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.S, + null, + RegistryUnit.B); + AS_F = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.S, + null, + RegistryUnit.F); + CM_T = new RegistryTradingParams(RegistryDesignation.C, + RegistryInstrumentType.M, + null, + RegistryUnit.T); + LM_T = new RegistryTradingParams(RegistryDesignation.L, + RegistryInstrumentType.M, + null, + RegistryUnit.T); + CS_T = new RegistryTradingParams(RegistryDesignation.C, + RegistryInstrumentType.S, + null, + RegistryUnit.T); + LS_T = new RegistryTradingParams(RegistryDesignation.L, + RegistryInstrumentType.S, + null, + RegistryUnit.T); + L__T = new RegistryTradingParams(RegistryDesignation.L, + null, + null, + RegistryUnit.T); + DM__ = new RegistryTradingParams(RegistryDesignation.D, + RegistryInstrumentType.M, + null, + null); + AM__ = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.M, + null, + null); + AS__ = new RegistryTradingParams(RegistryDesignation.A, + RegistryInstrumentType.S, + null, + null); + CM__ = new RegistryTradingParams(RegistryDesignation.C, + RegistryInstrumentType.M, + null, + null); + LM__ = new RegistryTradingParams(RegistryDesignation.L, + RegistryInstrumentType.M, + null, + null); + DMAU = new RegistryTradingParams(RegistryDesignation.D, + RegistryInstrumentType.M, + RegistryCapacity.A, + RegistryUnit.U); + DMAI = new RegistryTradingParams(RegistryDesignation.D, + RegistryInstrumentType.M, + RegistryCapacity.A, + RegistryUnit.I); + DS_I = new RegistryTradingParams(RegistryDesignation.D, + RegistryInstrumentType.S, + null, + RegistryUnit.I); + DS_T = new RegistryTradingParams(RegistryDesignation.D, + RegistryInstrumentType.S, + null, + RegistryUnit.T); + D__I = new RegistryTradingParams(RegistryDesignation.D, + null, + null, + RegistryUnit.I); + D__V = new RegistryTradingParams(RegistryDesignation.D, + null, + null, + RegistryUnit.V); + C__T = new RegistryTradingParams(RegistryDesignation.C, + null, + null, + RegistryUnit.T); + O__T = new RegistryTradingParams(RegistryDesignation.O, + null, + null, + RegistryUnit.T); + T__T = new RegistryTradingParams(RegistryDesignation.T, + null, + null, + RegistryUnit.T); + _S_T = new RegistryTradingParams(null, + RegistryInstrumentType.S, + null, + RegistryUnit.T); + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryUnit.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryUnit.java new file mode 100644 index 000000000..bbeffd033 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/RegistryUnit.java @@ -0,0 +1,25 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +public enum RegistryUnit implements IEnumKey { + T("T"), + A("A"), + R("R"), + F("F"), + B("B"), + X("X"), + U("U"), + I("I"), + V("V"), + ; + + private final String key; + + RegistryUnit(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/SecurityRowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/SecurityRowMapper.java new file mode 100644 index 000000000..fc9d366d6 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/SecurityRowMapper.java @@ -0,0 +1,17 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +import org.springframework.jdbc.core.RowMapper; +import ru.spcex.clearing.registry.reports.bean.Security; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class SecurityRowMapper implements RowMapper { + @Override + public Security mapRow(ResultSet rs, int rowNum) throws SQLException { + Security security = new Security(); + security.setId(rs.getLong("ID")); + security.setSecuritySymbol(rs.getString("SECURITY_SYMBOL")); + return security; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/TradingClearingRegistryRowMapper.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/TradingClearingRegistryRowMapper.java new file mode 100644 index 000000000..da29848a2 --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/loaders/helpers/TradingClearingRegistryRowMapper.java @@ -0,0 +1,17 @@ +package ru.spcex.clearing.registry.reports.loaders.helpers; + +import org.springframework.jdbc.core.RowMapper; +import ru.spcex.clearing.registry.reports.bean.TradingClearingRegistry; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class TradingClearingRegistryRowMapper implements RowMapper { + @Override + public TradingClearingRegistry mapRow(ResultSet rs, int rowNum) throws SQLException { + TradingClearingRegistry tkr = new TradingClearingRegistry(); + tkr.setId(rs.getLong("ID")); + tkr.setCode(rs.getString("CODE")); + return tkr; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/DepoBalanceRegisterReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/DepoBalanceRegisterReport.java similarity index 56% rename from clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/DepoBalanceRegisterReport.java rename to clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/DepoBalanceRegisterReport.java index ffbf30564..e01cd59b6 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/DepoBalanceRegisterReport.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/DepoBalanceRegisterReport.java @@ -1,48 +1,48 @@ -package ru.spcex.clearing.registry.reports.bean; +package ru.spcex.clearing.registry.reports.report; -import com.opencsv.bean.CsvBindByName; -import com.opencsv.bean.CsvBindByPosition; -import com.opencsv.bean.CsvDate; -import com.opencsv.bean.CsvNumber; +import ru.spcex.clearing.registry.annotation.BindByName; +import ru.spcex.clearing.registry.annotation.BindByPosition; +import ru.spcex.clearing.registry.annotation.ReportDate; +import ru.spcex.clearing.registry.annotation.ReportNumber; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; public class DepoBalanceRegisterReport implements FileReport { - @CsvBindByName(column = "Наименование Расчетного депозитария") - @CsvBindByPosition(position = 0) + @BindByName(column = "Наименование Расчетного депозитария") + @BindByPosition(position = 0) private String houseName; - @CsvBindByName(column = "Номер отчета") - @CsvBindByPosition(position = 1) + @BindByName(column = "Номер отчета") + @BindByPosition(position = 1) private String number; - @CsvBindByName(column = "Дата") - @CsvBindByPosition(position = 2) - @CsvDate(value = "dd.MM.yyyy") + @BindByName(column = "Дата") + @BindByPosition(position = 2) + @ReportDate(value = "dd.MM.yyyy") private LocalDate date; - @CsvBindByName(column = "Время") - @CsvBindByPosition(position = 3) - @CsvDate(value = "HH:mm:ss") + @BindByName(column = "Время") + @BindByPosition(position = 3) + @ReportDate(value = "HH:mm:ss") private LocalDateTime time; - @CsvBindByName(column = "Краткое наименование УК") - @CsvBindByPosition(position = 4) + @BindByName(column = "Краткое наименование УК") + @BindByPosition(position = 4) private String company; - @CsvBindByName(column = "Номер торгового раздела счета депо/ код раздела «к размещению/выкупу»") - @CsvBindByPosition(position = 5) + @BindByName(column = "Номер торгового раздела счета депо/ код раздела «к размещению/выкупу»") + @BindByPosition(position = 5) private String account; - @CsvBindByName(column = "Код ЦБ") - @CsvBindByPosition(position = 6) + @BindByName(column = "Код ЦБ") + @BindByPosition(position = 6) private String security; - @CsvBindByName(column = "Количество ЦБ") - @CsvBindByPosition(position = 7) - @CsvNumber(value = "#0", writeFormat = "#0") + @BindByName(column = "Количество ЦБ") + @BindByPosition(position = 7) + @ReportNumber(value = "#0") private BigDecimal sum; public String getHouseName() { diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/DepoPaymentInstructionRegisterReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/DepoPaymentInstructionRegisterReport.java similarity index 57% rename from clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/DepoPaymentInstructionRegisterReport.java rename to clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/DepoPaymentInstructionRegisterReport.java index 4db555439..ee962c452 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/DepoPaymentInstructionRegisterReport.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/DepoPaymentInstructionRegisterReport.java @@ -1,60 +1,60 @@ -package ru.spcex.clearing.registry.reports.bean; +package ru.spcex.clearing.registry.reports.report; -import com.opencsv.bean.CsvBindByName; -import com.opencsv.bean.CsvBindByPosition; -import com.opencsv.bean.CsvDate; -import com.opencsv.bean.CsvNumber; +import ru.spcex.clearing.registry.annotation.BindByName; +import ru.spcex.clearing.registry.annotation.BindByPosition; +import ru.spcex.clearing.registry.annotation.ReportDate; +import ru.spcex.clearing.registry.annotation.ReportNumber; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; public class DepoPaymentInstructionRegisterReport implements FileReport { - @CsvBindByName(column = "Номер распоряжения") - @CsvBindByPosition(position = 0) + @BindByName(column = "Номер распоряжения") + @BindByPosition(position = 0) private Long number; - @CsvBindByName(column = "Дата распоряжения") - @CsvBindByPosition(position = 1) - @CsvDate(value = "dd.MM.yyyy") + @BindByName(column = "Дата распоряжения") + @BindByPosition(position = 1) + @ReportDate(value = "dd.MM.yyyy") private LocalDate date; - @CsvBindByName(column = "Время формирования") - @CsvBindByPosition(position = 2) - @CsvDate(value = "HH:mm:ss") + @BindByName(column = "Время формирования") + @BindByPosition(position = 2) + @ReportDate(value = "HH:mm:ss") private LocalDateTime time; - @CsvBindByName(column = "Номер торгового банковского/клирингового счета списания") - @CsvBindByPosition(position = 3) + @BindByName(column = "Номер торгового банковского/клирингового счета списания") + @BindByPosition(position = 3) private String accountSender; - @CsvBindByName(column = "Наименование владельца счета списания") - @CsvBindByPosition(position = 4) + @BindByName(column = "Наименование владельца счета списания") + @BindByPosition(position = 4) private String sender; - @CsvBindByName(column = "Код владельца счета списания") - @CsvBindByPosition(position = 5) + @BindByName(column = "Код владельца счета списания") + @BindByPosition(position = 5) private String codeSender; - @CsvBindByName(column = "Номер торгового банковского/клирингового счета зачисления") - @CsvBindByPosition(position = 6) + @BindByName(column = "Номер торгового банковского/клирингового счета зачисления") + @BindByPosition(position = 6) private String accountAddressee; - @CsvBindByName(column = "Наименование владельца счета зачисления") - @CsvBindByPosition(position = 7) + @BindByName(column = "Наименование владельца счета зачисления") + @BindByPosition(position = 7) private String addressee; - @CsvBindByName(column = "Код владельца счета зачисления") - @CsvBindByPosition(position = 8) + @BindByName(column = "Код владельца счета зачисления") + @BindByPosition(position = 8) private String codeAddressee; - @CsvBindByName(column = "Код ЦБ") - @CsvBindByPosition(position = 9) + @BindByName(column = "Код ЦБ") + @BindByPosition(position = 9) private String security; - @CsvBindByName(column = "Количество ЦБ") - @CsvBindByPosition(position = 10) - @CsvNumber(value = "#0", writeFormat = "#0") + @BindByName(column = "Количество ЦБ") + @BindByPosition(position = 10) + @ReportNumber(value = "#0") private BigDecimal amount; diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionRegisterReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/ExecutionRegisterReport.java similarity index 61% rename from clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionRegisterReport.java rename to clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/ExecutionRegisterReport.java index a8dd7c7cb..6e95634bb 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/ExecutionRegisterReport.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/ExecutionRegisterReport.java @@ -1,87 +1,87 @@ -package ru.spcex.clearing.registry.reports.bean; +package ru.spcex.clearing.registry.reports.report; -import com.opencsv.bean.CsvBindByName; -import com.opencsv.bean.CsvBindByPosition; -import com.opencsv.bean.CsvDate; -import com.opencsv.bean.CsvNumber; +import ru.spcex.clearing.registry.annotation.BindByName; +import ru.spcex.clearing.registry.annotation.BindByPosition; +import ru.spcex.clearing.registry.annotation.ReportDate; +import ru.spcex.clearing.registry.annotation.ReportNumber; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; public class ExecutionRegisterReport implements FileReport { - @CsvBindByName(column = "Наименование биржи") - @CsvBindByPosition(position = 0) + @BindByName(column = "Наименование биржи") + @BindByPosition(position = 0) private String clearingOrganization; - @CsvBindByName(column = "Дата заключения сделки") - @CsvBindByPosition(position = 1) - @CsvDate(value = "dd.MM.yyyy") + @BindByName(column = "Дата заключения сделки") + @BindByPosition(position = 1) + @ReportDate(value = "dd.MM.yyyy") private LocalDate tradingDate; - @CsvBindByName(column = "Дата исполнения") - @CsvBindByPosition(position = 2) - @CsvDate(value = "dd.MM.yyyy") + @BindByName(column = "Дата исполнения") + @BindByPosition(position = 2) + @ReportDate(value = "dd.MM.yyyy") private LocalDate settlementDate; - @CsvBindByName(column = "Идентификационный номер сделки в Торговой системе") - @CsvBindByPosition(position = 3) + @BindByName(column = "Идентификационный номер сделки в Торговой системе") + @BindByPosition(position = 3) private Long exchangeExecutionId; - @CsvBindByName(column = "Время заключения сделки в Торговой системе") - @CsvBindByPosition(position = 4) - @CsvDate(value = "HH:mm:ss") + @BindByName(column = "Время заключения сделки в Торговой системе") + @BindByPosition(position = 4) + @ReportDate(value = "HH:mm:ss") private LocalDateTime exchangeExecutionTime; - @CsvBindByName(column = "Код БИ") - @CsvBindByPosition(position = 5) + @BindByName(column = "Код БИ") + @BindByPosition(position = 5) private String security; - @CsvBindByName(column = "Дата возврата") - @CsvBindByPosition(position = 6) - @CsvDate(value = "dd.MM.yyyy") + @BindByName(column = "Дата возврата") + @BindByPosition(position = 6) + @ReportDate(value = "dd.MM.yyyy") private LocalDate refundDate; - @CsvBindByName(column = "Код УК - продавца") - @CsvBindByPosition(position = 7) + @BindByName(column = "Код УК - продавца") + @BindByPosition(position = 7) private String sellerCode; - @CsvBindByName(column = "Наименование УК - продавца") - @CsvBindByPosition(position = 8) + @BindByName(column = "Наименование УК - продавца") + @BindByPosition(position = 8) private String seller; - @CsvBindByName(column = "ТКР продавца") - @CsvBindByPosition(position = 9) + @BindByName(column = "ТКР продавца") + @BindByPosition(position = 9) private String sellerTkr; - @CsvBindByName(column = "Клиринговый код покупателя") - @CsvBindByPosition(position = 10) + @BindByName(column = "Клиринговый код покупателя") + @BindByPosition(position = 10) private String buyerCode; - @CsvBindByName(column = "Наименование компании-покупателя") - @CsvBindByPosition(position = 11) + @BindByName(column = "Наименование компании-покупателя") + @BindByPosition(position = 11) private String buyer; - @CsvBindByName(column = "Торгово-клиринговый регистр покупателя") - @CsvBindByPosition(position = 12) + @BindByName(column = "Торгово-клиринговый регистр покупателя") + @BindByPosition(position = 12) private String buyerTkr; - @CsvBindByName(column = "Сумма сделки") - @CsvBindByPosition(position = 13) - @CsvNumber(value = "#0.00", writeFormat = "#0.00") + @BindByName(column = "Сумма сделки") + @BindByPosition(position = 13) + @ReportNumber(value = "#0.00") private BigDecimal amount; - @CsvBindByName(column = "Количество ценных бумаг") - @CsvBindByPosition(position = 14) - @CsvNumber(value = "#0", writeFormat = "#0") + @BindByName(column = "Количество ценных бумаг") + @BindByPosition(position = 14) + @ReportNumber(value = "#0") private BigDecimal quantity; - @CsvBindByName(column = "Статус") - @CsvBindByPosition(position = 15) + @BindByName(column = "Статус") + @BindByPosition(position = 15) private String status; - @CsvBindByName(column = "Код режима") - @CsvBindByPosition(position = 16) + @BindByName(column = "Код режима") + @BindByPosition(position = 16) private String market; diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/FileReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/FileReport.java new file mode 100644 index 000000000..8011ef41d --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/FileReport.java @@ -0,0 +1,4 @@ +package ru.spcex.clearing.registry.reports.report; + +public interface FileReport { +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/LiabilitiesRegistryReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/LiabilitiesRegistryReport.java similarity index 60% rename from clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/LiabilitiesRegistryReport.java rename to clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/LiabilitiesRegistryReport.java index ea669fa98..50c57ae83 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/LiabilitiesRegistryReport.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/LiabilitiesRegistryReport.java @@ -1,56 +1,60 @@ -package ru.spcex.clearing.registry.reports.bean; +package ru.spcex.clearing.registry.reports.report; -import com.opencsv.bean.CsvBindByName; -import com.opencsv.bean.CsvBindByPosition; -import com.opencsv.bean.CsvDate; -import com.opencsv.bean.CsvNumber; +import ru.spcex.clearing.registry.annotation.BindByName; +import ru.spcex.clearing.registry.annotation.BindByPosition; +import ru.spcex.clearing.registry.annotation.ReportDate; +import ru.spcex.clearing.registry.annotation.ReportNumber; import java.math.BigDecimal; import java.time.LocalDate; public class LiabilitiesRegistryReport implements FileReport { - @CsvBindByName(column = "имя") - @CsvBindByPosition(position = 0) + @BindByName(column = "имя") + @BindByPosition(position = 0) private String short_name; - @CsvBindByName(column = "клиринговый код") - @CsvBindByPosition(position = 0) + @BindByName(column = "клиринговый код") + @BindByPosition(position = 1) private String clearing_code; - @CsvBindByName(column = "счет") - @CsvBindByPosition(position = 1) + @BindByName(column = "счет") + @BindByPosition(position = 2) private String account; - @CsvBindByName(column = "код регистра") - @CsvBindByPosition(position = 2) + @BindByName(column = "код регистра") + @BindByPosition(position = 3) private String registry_code; - @CsvBindByName(column = "статус") - @CsvBindByPosition(position = 3) + @BindByName(column = "статус") + @BindByPosition(position = 4) private String registry_status; - @CsvBindByName(column = "инструмент валюта") - @CsvBindByPosition(position = 4) + @BindByName(column = "инструмент валюта") + @BindByPosition(position = 5) private String security_symbol; - @CsvBindByName(column = "баланс") - @CsvBindByPosition(position = 5) - @CsvNumber(value = "#0.00", writeFormat = "#0.00") + @BindByName(column = "баланс") + @BindByPosition(position = 6) + @ReportNumber(value = "#0.00") private BigDecimal balance; - @CsvBindByName(column = "дата расчета") - @CsvBindByPosition(position = 6) - @CsvDate(value = "dd.MM.yyyy") + @BindByName(column = "дата расчета") + @BindByPosition(position = 7) + @ReportDate(value = "dd.MM.yyyy") private LocalDate settlement_date; - @CsvBindByName(column = "продукт") - @CsvBindByPosition(position = 7) + @BindByName(column = "продукт") + @BindByPosition(position = 8) private String contract; - @CsvBindByName(column = "тип сессии") - @CsvBindByPosition(position = 8) + @BindByName(column = "тип сессии") + @BindByPosition(position = 9) private String session_type; + @BindByName(column = "номер сделки") + @BindByPosition(position = 10) + private String executionNumber; + public String getShort_name() { return short_name; } @@ -130,4 +134,12 @@ public class LiabilitiesRegistryReport implements FileReport { public void setSession_type(String session_type) { this.session_type = session_type; } + + public String getExecutionNumber() { + return executionNumber; + } + + public void setExecutionNumber(String executionNumber) { + this.executionNumber = executionNumber; + } } diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyBalanceRegisterReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/MoneyBalanceRegisterReport.java similarity index 55% rename from clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyBalanceRegisterReport.java rename to clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/MoneyBalanceRegisterReport.java index b60115ee7..07c453257 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyBalanceRegisterReport.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/MoneyBalanceRegisterReport.java @@ -1,48 +1,48 @@ -package ru.spcex.clearing.registry.reports.bean; +package ru.spcex.clearing.registry.reports.report; -import com.opencsv.bean.CsvBindByName; -import com.opencsv.bean.CsvBindByPosition; -import com.opencsv.bean.CsvDate; -import com.opencsv.bean.CsvNumber; +import ru.spcex.clearing.registry.annotation.BindByName; +import ru.spcex.clearing.registry.annotation.BindByPosition; +import ru.spcex.clearing.registry.annotation.ReportDate; +import ru.spcex.clearing.registry.annotation.ReportNumber; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; public class MoneyBalanceRegisterReport implements FileReport { - @CsvBindByName(column = "Наименование Расчетного депозитария") - @CsvBindByPosition(position = 0) + @BindByName(column = "Наименование Расчетного депозитария") + @BindByPosition(position = 0) private String houseName; - @CsvBindByName(column = "Номер отчета") - @CsvBindByPosition(position = 1) + @BindByName(column = "Номер отчета") + @BindByPosition(position = 1) private String number; - @CsvBindByName(column = "Дата") - @CsvBindByPosition(position = 2) - @CsvDate(value = "dd.MM.yyyy") + @BindByName(column = "Дата") + @BindByPosition(position = 2) + @ReportDate(value = "dd.MM.yyyy") private LocalDate date; - @CsvBindByName(column = "Время") - @CsvBindByPosition(position = 3) - @CsvDate(value = "HH:mm:ss") + @BindByName(column = "Время") + @BindByPosition(position = 3) + @ReportDate(value = "HH:mm:ss") private LocalDateTime time; - @CsvBindByName(column = "Код валюты") - @CsvBindByPosition(position = 4) + @BindByName(column = "Код валюты") + @BindByPosition(position = 4) private String currency; - @CsvBindByName(column = "Краткое наименование УК") - @CsvBindByPosition(position = 5) + @BindByName(column = "Краткое наименование УК") + @BindByPosition(position = 5) private String company; - @CsvBindByName(column = "Номер торгового /клирингового счета/ счета внутреннего учета СПВБ") - @CsvBindByPosition(position = 6) + @BindByName(column = "Номер торгового /клирингового счета/ счета внутреннего учета СПВБ") + @BindByPosition(position = 6) private String account; - @CsvBindByName(column = "Остаток денежных средств") - @CsvBindByPosition(position = 7) - @CsvNumber(value = "#0.00", writeFormat = "#0.00") + @BindByName(column = "Остаток денежных средств") + @BindByPosition(position = 7) + @ReportNumber(value = "#0.00") private BigDecimal sum; diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyPaymentInstructionRegisterReport.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/MoneyPaymentInstructionRegisterReport.java similarity index 57% rename from clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyPaymentInstructionRegisterReport.java rename to clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/MoneyPaymentInstructionRegisterReport.java index ed6ada0a0..87ccd834b 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/bean/MoneyPaymentInstructionRegisterReport.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/reports/report/MoneyPaymentInstructionRegisterReport.java @@ -1,60 +1,60 @@ -package ru.spcex.clearing.registry.reports.bean; +package ru.spcex.clearing.registry.reports.report; -import com.opencsv.bean.CsvBindByName; -import com.opencsv.bean.CsvBindByPosition; -import com.opencsv.bean.CsvDate; -import com.opencsv.bean.CsvNumber; +import ru.spcex.clearing.registry.annotation.BindByName; +import ru.spcex.clearing.registry.annotation.BindByPosition; +import ru.spcex.clearing.registry.annotation.ReportDate; +import ru.spcex.clearing.registry.annotation.ReportNumber; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; public class MoneyPaymentInstructionRegisterReport implements FileReport { - @CsvBindByName(column = "Номер распоряжения") - @CsvBindByPosition(position = 0) + @BindByName(column = "Номер распоряжения") + @BindByPosition(position = 0) private Long number; - @CsvBindByName(column = "Дата распоряжения") - @CsvBindByPosition(position = 1) - @CsvDate(value = "dd.MM.yyyy") + @BindByName(column = "Дата распоряжения") + @BindByPosition(position = 1) + @ReportDate(value = "dd.MM.yyyy") private LocalDate date; - @CsvBindByName(column = "Время формирования") - @CsvBindByPosition(position = 2) - @CsvDate(value = "HH:mm:ss") + @BindByName(column = "Время формирования") + @BindByPosition(position = 2) + @ReportDate(value = "HH:mm:ss") private LocalDateTime time; - @CsvBindByName(column = "Номер торгового банковского/клирингового счета списания") - @CsvBindByPosition(position = 3) + @BindByName(column = "Номер торгового банковского/клирингового счета списания") + @BindByPosition(position = 3) private String accountSender; - @CsvBindByName(column = "Наименование владельца счета списания") - @CsvBindByPosition(position = 4) + @BindByName(column = "Наименование владельца счета списания") + @BindByPosition(position = 4) private String sender; - @CsvBindByName(column = "Код владельца счета списания") - @CsvBindByPosition(position = 5) + @BindByName(column = "Код владельца счета списания") + @BindByPosition(position = 5) private String codeSender; - @CsvBindByName(column = "Номер торгового банковского/клирингового счета зачисления") - @CsvBindByPosition(position = 6) + @BindByName(column = "Номер торгового банковского/клирингового счета зачисления") + @BindByPosition(position = 6) private String accountAddressee; - @CsvBindByName(column = "Наименование владельца счета зачисления") - @CsvBindByPosition(position = 7) + @BindByName(column = "Наименование владельца счета зачисления") + @BindByPosition(position = 7) private String addressee; - @CsvBindByName(column = "Код владельца счета зачисления") - @CsvBindByPosition(position = 8) + @BindByName(column = "Код владельца счета зачисления") + @BindByPosition(position = 8) private String codeAddressee; - @CsvBindByName(column = "Код валюты") - @CsvBindByPosition(position = 9) + @BindByName(column = "Код валюты") + @BindByPosition(position = 9) private String currencyCode; - @CsvBindByName(column = "Сумма денежных средств") - @CsvBindByPosition(position = 10) - @CsvNumber(value = "#0.00", writeFormat = "#0.00") + @BindByName(column = "Сумма денежных средств") + @BindByPosition(position = 10) + @ReportNumber(value = "#0.00") private BigDecimal sum; diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java deleted file mode 100644 index 3527370f0..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterService.java +++ /dev/null @@ -1,153 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.producer.Producer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.register.AdmittedLiabilitiesRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.security.Security; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.registry.AdmittedLiabilitiesRegisterNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.registry.util.PreClearMap; -import ru.spcex.platform.enumeration.RegistryDesignation; -import ru.spcex.platform.enumeration.RegistryInstrumentType; -import ru.spcex.platform.enumeration.RegistryStatus; -import ru.spcex.platform.enumeration.RegistryUnit; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; -import ru.spcex.platform.utils.validation.IValidator; - -import java.time.Instant; -import java.util.Collection; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; - -import static ru.spcex.platform.enumeration.Task.createRegistry_ADLR; - -@Service -public class AdmittedLiabilitiesRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg admittedLiabilitiesRegisterMap; - private final Imdg registryMap; - private final Imdg companyMap; - private final SecuritySelector securitySelector; - private final Function, IValidator> fieldValuesValidator; - private final PreClearMap preClearMap; - - @Autowired - public AdmittedLiabilitiesRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - Function, IValidator> fieldValuesValidator) { - super(kafkaQueue, kafkaProducer); - this.admittedLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_AdmittedLiabilitiesRegister, AdmittedLiabilitiesRegister.class); - this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); - this.fieldValuesValidator = fieldValuesValidator; - preClearMap = PreClearMap.instanceForInstantField(admittedLiabilitiesRegisterMap, "created"); - } - - @Override - public void afterPropertiesSet() { - callback(AdmittedLiabilitiesRegisterNewRequest.class) - .setConsumer(this::admittedLiabilitiesRegisterNew) - .forDestination(Consts.REGISTRY_ADMITTED_LIABILITIES_REGISTER_NEW, callbacks::put); - callback(LauncherCommandRequest.class) - .setConsumer(this::admittedLiabilitiesRegisterNew) - .forDestination(createRegistry_ADLR.topic(), callbacks::put); - init(); - } - - public void admittedLiabilitiesRegisterNew(BaseRequest userRequest) { - log.debug("AdmittedLiabilitiesRegisterNewRequest received from {}", Consts.REGISTRY_ADMITTED_LIABILITIES_REGISTER_NEW); - String sqlConditionForRegistry = getSqlForRegistries(); - Collection registries = registryMap.getCollectionObjectsBySQL(sqlConditionForRegistry); - if (registries.isEmpty()) { - log.debug("No registry with such conditions {}", sqlConditionForRegistry); - return; - } - log.debug("Select {} Registry by query {}", registries.size(), registries); - preClearMap.preClearMap(); - registries.forEach((registry -> { - if (isDuplicateInMap(registry).isEmpty()) { - insertAdmittedLiabilitiesRegister(registry); - } - } - )); - log.debug("Successfully processed.."); - } - - private void insertAdmittedLiabilitiesRegister(Registry registry) { - log.trace("Started generating AdmittedLiabilitiesRegister entity..."); - AdmittedLiabilitiesRegister admittedLiabilitiesRegister = new AdmittedLiabilitiesRegister(); - Company company = companyMap.getFirstObjectByFieldValues(Map.of("id", 1L)); - Security security = securitySelector.selectSecurityById(registry.getSecurityId()); - String securityFullName = security != null ? security.getFullName() : null; - String companyFullName = company != null ? company.getFullName() : null; - admittedLiabilitiesRegister.setCompanyFullName(companyFullName); - admittedLiabilitiesRegister.setSessionId(registry.getSessionId()); - admittedLiabilitiesRegister.setSecuritySymbol(registry.getSecuritySymbol()); - admittedLiabilitiesRegister.setSecurityFullName(securityFullName); - admittedLiabilitiesRegister.setCompanyId(registry.getCompanyId()); - admittedLiabilitiesRegister.setClearingCode(registry.getClearingCode()); - admittedLiabilitiesRegister.setAccount(registry.getAccount()); - admittedLiabilitiesRegister.setAmount(registry.getBalance()); - admittedLiabilitiesRegister.setClearingDate(registry.getClearingDate()); - admittedLiabilitiesRegister.setCreated(Instant.now()); - admittedLiabilitiesRegister.setUpdated(Instant.now()); - admittedLiabilitiesRegisterMap.insert(admittedLiabilitiesRegister); - log.debug("inserted successfully AdmittedLiabilitiesRegister entity with id: {}", admittedLiabilitiesRegister.getId()); - } - - private String getSqlForRegistries() { - return String.format("registryDesignation = '%s' and " + - "registryInstrumentType in ('%s','%s') and " + - "registryUnit = '%s' and " + - "registryStatus in ('%s','%s','%s','%s','%s', '%s')" - , - RegistryDesignation.O.getKey(), - RegistryInstrumentType.S.getKey(), - RegistryInstrumentType.M.getKey(), - RegistryUnit.T.getKey(), - RegistryStatus.OK.getKey(), - RegistryStatus.NACK.getKey(), - RegistryStatus.UNCV.getKey(), - RegistryStatus.NACC.getKey(), - RegistryStatus.FAIL.getKey(), - RegistryStatus.CLRD.getKey() - ); - } - - @Override - public Optional isDuplicateInMap(Registry entity) { - return Optional.empty(); - //для всех isDuplicateInMap: пока не используется, надо по критерию чистить мапу перед вставкой записей, preClearMap. -// Map> fieldValues = Map.of( -// "companyId", entity.getRegistryCode(), -// "sessionId", entity.getSessionId(), -// "securitySymbol", entity.getSecuritySymbol(), -// "clearingDate", entity.getClearingDate(), -// "account", entity.getAccount() -// ); -// Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); -// if (message.isPresent()) { -// log.warn("Illegal value in map for request to imdg: {}", message.get()); -// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); -// } -// return Optional.ofNullable(admittedLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues)); - - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java deleted file mode 100644 index fbd14a608..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterService.java +++ /dev/null @@ -1,141 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.producer.Producer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.register.CoveredLiabilitiesRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.security.Security; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.registry.CoveredLiabilitiesRegisterNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.registry.util.PreClearMap; -import ru.spcex.platform.enumeration.RegistryDesignation; -import ru.spcex.platform.enumeration.RegistryInstrumentType; -import ru.spcex.platform.enumeration.RegistryStatus; -import ru.spcex.platform.enumeration.RegistryUnit; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; -import ru.spcex.platform.utils.validation.IValidator; - -import java.time.Instant; -import java.util.Collection; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; - -import static ru.spcex.platform.enumeration.Task.createRegistry_CDLR; - -@Service -public class CoveredLiabilitiesRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg coveredLiabilitiesRegisterMap; - private final Imdg registryMap; - private final Imdg companyMap; - private final SecuritySelector securitySelector; - private final Function, IValidator> fieldValuesValidator; - private final PreClearMap preClearMap; - - @Autowired - public CoveredLiabilitiesRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - Function, IValidator> fieldValuesValidator) { - super(kafkaQueue, kafkaProducer); - this.coveredLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CoveredLiabilitiesRegister, CoveredLiabilitiesRegister.class); - this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); - this.fieldValuesValidator = fieldValuesValidator; - preClearMap = PreClearMap.instanceForInstantField(coveredLiabilitiesRegisterMap, "created"); - } - - @Override - public void afterPropertiesSet() { - callback(CoveredLiabilitiesRegisterNewRequest.class) - .setConsumer(this::coveredLiabilitiesRegisterNew) - .forDestination(Consts.REGISTRY_COVERED_LIABILITIES_REGISTER_NEW, callbacks::put); - callback(LauncherCommandRequest.class) - .setConsumer(this::coveredLiabilitiesRegisterNew) - .forDestination(createRegistry_CDLR.topic(), callbacks::put); - init(); - } - - - public void coveredLiabilitiesRegisterNew(BaseRequest userRequest) { - log.debug("CoveredLiabilitiesRegisterNew received"); - String sqlConditionForRegistry = getSqlForRegistries(); - Collection registries = registryMap.getCollectionObjectsBySQL(sqlConditionForRegistry); - if (registries.isEmpty()) { - log.debug("No registry with such conditions {}", sqlConditionForRegistry); - return; - } - log.debug("Select {} Registry by query {}", registries.size(), sqlConditionForRegistry); - preClearMap.preClearMap(); - registries.forEach((registry -> { - if (isDuplicateInMap(registry).isEmpty()) { - insertCoveredLiabilitiesRegister(registry); - } - } - )); - log.debug("successfully processed"); - } - - private void insertCoveredLiabilitiesRegister(Registry registry) { - log.trace("insert CoveredLiabilitiesRegister in map..."); - CoveredLiabilitiesRegister coveredLiabilitiesRegister = new CoveredLiabilitiesRegister(); - Company company = companyMap.getFirstObjectByFieldValues(Map.of("id", 1L)); - Security security = securitySelector.selectSecurityById(registry.getSecurityId()); - String securityFullName = security != null ? security.getFullName() : null; - String companyFullName = company != null ? company.getFullName() : null; - coveredLiabilitiesRegister.setCompanyFullName(companyFullName); - coveredLiabilitiesRegister.setSessionId(registry.getSessionId()); - coveredLiabilitiesRegister.setSecuritySymbol(registry.getSecuritySymbol()); - coveredLiabilitiesRegister.setSecurityFullName(securityFullName); - coveredLiabilitiesRegister.setCompanyId(registry.getCompanyId()); - coveredLiabilitiesRegister.setClearingCode(registry.getClearingCode()); - coveredLiabilitiesRegister.setAccount(registry.getAccount()); - coveredLiabilitiesRegister.setAmount(registry.getBalance()); - coveredLiabilitiesRegister.setClearingDate(registry.getClearingDate()); - coveredLiabilitiesRegister.setCreated(Instant.now()); - coveredLiabilitiesRegister.setUpdated(Instant.now()); - coveredLiabilitiesRegisterMap.insert(coveredLiabilitiesRegister); - log.debug("CoveredLiabilitiesRegister inserted successfully with id: {}", coveredLiabilitiesRegister.getId()); - } - - private String getSqlForRegistries() { - return String.format("registryDesignation = '%s' and " + - "registryInstrumentType in ('%s','%s') and " + - "registryUnit = '%s' and " + - "registryStatus in ('%s', '%s')", - RegistryDesignation.O.getKey(), - RegistryInstrumentType.S.getKey(), - RegistryInstrumentType.M.getKey(), - RegistryUnit.T.getKey(), - RegistryStatus.OK.getKey(), - RegistryStatus.CLRD.getKey() - ); - } - - @Override - public Optional isDuplicateInMap(Registry entity) { - return Optional.empty(); -// Map> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId()); -// Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); -// if (message.isPresent()) { -// log.warn("Illegal value in map for request to imdg: {}", message.get()); -// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); -// } -// return Optional.ofNullable(coveredLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues)); - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java deleted file mode 100644 index 6d9843284..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterService.java +++ /dev/null @@ -1,151 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.producer.Producer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.register.DepoBalanceRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.registry.RegistryHistory; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.registry.reports.ReportUtils; -import ru.spcex.clearing.registry.reports.builders.DepoBalanceRegisterReportBuilder; -import ru.spcex.clearing.registry.util.PreClearMap; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.RegistryTradingParams; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; -import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; -import ru.spcex.platform.utils.enumeration.IEnumKey; - -import java.io.File; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import static ru.spcex.platform.enumeration.Task.createRegistry_GRRT; - -@Service -public class DepoBalanceRegisterService extends QueueConsumer implements InitializingBean { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg depoBalanceRegisterMap; - private final Imdg registryHistoryMap; - private final PreClearMap preClearMap; - - private final DepoBalanceRegisterReportBuilder reportBuilder; - private final File outFolder; - private final RegistryServiceSettings settings; - - private final SFTPReportsConfig.ReportsGateway reportsSftpGateway; - private final boolean deleteAfterSend; - - @Autowired - public DepoBalanceRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - RegistryServiceSettings settings, - @Qualifier("reportOutDir") File outFolder, - SFTPReportsConfig.ReportsGateway reportsSftpGateway) { - super(kafkaQueue, kafkaProducer); - this.depoBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoBalanceRegister, DepoBalanceRegister.class); - this.registryHistoryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryHistory, RegistryHistory.class); - preClearMap = PreClearMap.instanceForInstantField(depoBalanceRegisterMap, "created"); - reportBuilder = new DepoBalanceRegisterReportBuilder(imdgProvider); - this.outFolder = outFolder; - this.settings = settings; - this.reportsSftpGateway = reportsSftpGateway; - this.deleteAfterSend = settings.getReportsStore().isDeleteAfterSend(); - } - - @Override - public void afterPropertiesSet() { - callback(LauncherCommandRequest.class) - .setConsumer(this::depoBalanceRegisterNew) - .forDestination(createRegistry_GRRT.topic(), callbacks::put); - init(); - } - - public void depoBalanceRegisterNew(BaseRequest userRequest) { - boolean csvMode = settings.isCsvMode(); - log.debug("LauncherCommandRequest received from {}", createRegistry_GRRT.topic()); - ImdgPredicate predicate = getPredicateForRegistries(userRequest.getRequestPayload().getCompanyId()); - Collection registryHistories = registryHistoryMap.getCollectionObjectsByPredicate(predicate); - log.trace("Started searching depoBalanceRegister in register by '{}'", predicate); - if (registryHistories.isEmpty()) { - log.debug("No registry with such conditions '{}'", predicate); - return; - } - log.debug("Select {} Registry history by query {}", registryHistories.size(), predicate); - if (!csvMode) preClearMap.preClearMap(); - List registryForReport = new ArrayList<>(); - for (RegistryHistory registryHistory : registryHistories) { - if (BigDecimal.ZERO.compareTo(registryHistory.getObject().getDiffBalance()) != 0) continue; - if (!csvMode) insertDepoBalanceRegister(registryHistory); - else registryForReport.add(registryHistory); - } - if (csvMode) { - File reportFile = reportBuilder.buildReport(registryForReport, outFolder); - ReportUtils.sendFilesToSftp(List.of(reportFile), reportsSftpGateway, deleteAfterSend); - } - log.debug("Successfully processed"); - } - - private void insertDepoBalanceRegister(RegistryHistory registryHistory) { - log.trace("Started generating DepoBalanceRegister entity..."); - Registry registry = registryHistory.getObject(); - DepoBalanceRegister depoBalanceRegister = new DepoBalanceRegister(); - depoBalanceRegister.setUpdated(Instant.now()); - depoBalanceRegister.setCreated(depoBalanceRegister.getUpdated()); - depoBalanceRegister.setCompanyId(registry.getCompanyId()); - AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType()); - if (AccountType.Depo == accountType) { - depoBalanceRegister.setDepoCode(registry.getAccount()); - } - depoBalanceRegister.setQuantity(registry.getBalance()); - depoBalanceRegister.setSecuritySymbol(registry.getSecuritySymbol()); - depoBalanceRegisterMap.insert(depoBalanceRegister); - log.debug("inserted successfully DepoBalanceRegister entity with id: {}", depoBalanceRegister.getId()); - } - - private ImdgPredicate getPredicateForRegistries(Long companyId) { - Instant now = Instant.now().truncatedTo(ChronoUnit.DAYS); - ImdgPredicateBuilder pb = registryHistoryMap.predicateBuilder(); - RegistryCodeSqlBuilder codeSql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AS_T).prefix("object"); - ImdgPredicate registryPredicate; - if (companyId == null) { - registryPredicate = pb.sql(codeSql.build()); - } else { - registryPredicate = pb.and( - pb.equals("object.companyId", companyId), - pb.sql(codeSql.build()) - ); - } - ImdgPredicate finalPredicate = pb.and( - registryPredicate, - pb.notNull("object.tradingClearingRegistry"), - pb.and( - pb.greatEqual("eventTime", now), - pb.less("eventTime", now.plus(1, ChronoUnit.DAYS)) - ) - ); - - log.trace("sql predicate for registry_history {}", finalPredicate); - return finalPredicate; - } - -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java deleted file mode 100644 index 264185998..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterService.java +++ /dev/null @@ -1,178 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.producer.Producer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.payment.PaymentInstruction; -import ru.clearing.classes.statics.data.register.DepoPaymentInstructionRegister; -import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; -import ru.clearing.platform.dictionary.InOutDirectionDictionary; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.registry.reports.ReportUtils; -import ru.spcex.clearing.registry.reports.builders.DepoPaymentInstructionRegisterReportBuilder; -import ru.spcex.clearing.registry.util.PreClearMap; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.TransactionStatus; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.IEnumKey; -import ru.spcex.platform.utils.validation.IValidator; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDate; -import java.util.*; -import java.util.function.Function; - -import static ru.spcex.platform.enumeration.Task.createRegistry_GORD; -import static ru.spcex.platform.enumeration.Task.createRegistry_GORR; - -@Service -public class DepoPaymentInstructionRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg depoPaymentInstructionRegisterMap; - private final Imdg paymentInstructionMap; - private final Imdg sessionMap; - private final Imdg tradingClearingRegistryMap; - private final Imdg InOutDirectionDictionaryMap; - private final Imdg accountMap; - private final Function, IValidator> fieldValuesValidator; - private final PreClearMap preClearMap; - - private final DepoPaymentInstructionRegisterReportBuilder reportBuilder; - private final File outFolder; - private final RegistryServiceSettings settings; - - private final SFTPReportsConfig.ReportsGateway reportsSftpGateway; - private final boolean deleteAfterSend; - - - @Autowired - public DepoPaymentInstructionRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - Function, IValidator> fieldValuesValidator, - @Qualifier("reportOutDir") File outFolder, - RegistryServiceSettings settings, - SFTPReportsConfig.ReportsGateway reportsSftpGateway) { - super(kafkaQueue, kafkaProducer); - this.depoPaymentInstructionRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoPaymentInstructionRegister, DepoPaymentInstructionRegister.class); - this.paymentInstructionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); - this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - this.tradingClearingRegistryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); - this.InOutDirectionDictionaryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_InOutDirectionDictionary, InOutDirectionDictionary.class); - this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); - this.fieldValuesValidator = fieldValuesValidator; - preClearMap = PreClearMap.instanceForInstantField(depoPaymentInstructionRegisterMap, "created"); - reportBuilder = new DepoPaymentInstructionRegisterReportBuilder(imdgProvider); - this.outFolder = outFolder; - this.settings = settings; - this.reportsSftpGateway = reportsSftpGateway; - this.deleteAfterSend = settings.getReportsStore().isDeleteAfterSend(); - } - - @Override - public void afterPropertiesSet() { - callback(LauncherCommandRequest.class) - .setConsumer(this::depoPaymentInstructionRegisterNew) - .forDestination(createRegistry_GORD.topic(), callbacks::put); - init(); - } - - - public void depoPaymentInstructionRegisterNew(BaseRequest userRequest) { - boolean csvMode = settings.isCsvMode(); - log.debug("LauncherCommandRequest received from {}", createRegistry_GORR.topic()); - - String piQuery = "transactionStatus='" + TransactionStatus.sent.getKey() + "' OR transactionStatus = '" + - TransactionStatus.stld.getKey() + "' OR transactionStatus = '" + TransactionStatus.ok.getKey() + "'"; - Collection paymentInstructions = paymentInstructionMap.getCollectionObjectsBySQL(piQuery); - log.debug("Selected {} PaymentInstruction by query \"{}\", do filter by account...", - paymentInstructions.size(), piQuery); - Collection depoPaymentInstructions = new ArrayList<>(); - for (PaymentInstruction paymentInstruction : paymentInstructions) { - // filter by accountType - if (paymentInstruction.getCreditLeg_accountId() != null) { - Account account = accountMap.getSingleObjectByID(paymentInstruction.getCreditLeg_accountId()); - if (account == null) - log.warn("Account id={} not found for paymentInstruction.id={}", - paymentInstruction.getCreditLeg_accountId(), paymentInstruction.getId()); - else { - if (IEnumKey.contains(account.getAccountType(), AccountType.Depo, AccountType.Dtrn)) { - depoPaymentInstructions.add(paymentInstruction); - } - } - } - } - log.debug("Filtered {} PaymentInstruction, with depo account's", depoPaymentInstructions.size()); - if (!csvMode) preClearMap.preClearMap(); - List paymentInstructionsForReport = new ArrayList<>(); - for (PaymentInstruction paymentInstruction : depoPaymentInstructions) { - if (isDuplicateInMap(paymentInstruction).isEmpty()) { - if (!csvMode) insertDepoPaymentInstructionRegister(paymentInstruction); - else if (LocalDate.now().equals(paymentInstruction.getClearingDate())) - paymentInstructionsForReport.add(paymentInstruction); - } - } - if (csvMode) { - File reportFile = reportBuilder.buildReport(paymentInstructionsForReport, outFolder); - ReportUtils.sendFilesToSftp(List.of(reportFile), reportsSftpGateway, deleteAfterSend); - } - - log.debug("successfully processed"); - } - - private void insertDepoPaymentInstructionRegister(PaymentInstruction paymentInstruction) { - log.trace("Started generating DepoPaymentInstructionRegister entity..."); - DepoPaymentInstructionRegister depoPaymentInstructionRegister = new DepoPaymentInstructionRegister(); - TradingClearingRegistry tradingClearingRegistry = null; - if (paymentInstruction.getCreditLeg_accountId() != null && paymentInstruction.getSenderId() != null) { - tradingClearingRegistry = tradingClearingRegistryMap.getFirstObjectByFieldValues(Map.of("companyId", paymentInstruction.getSenderId(), "depoAccountId", paymentInstruction.getCreditLeg_accountId())); - } - InOutDirectionDictionary inOutDirectionDictionary = InOutDirectionDictionaryMap.getFirstObjectByFieldValues(Map.of("code", paymentInstruction.getCreditLeg_direction())); - depoPaymentInstructionRegister.setCreated(Instant.now()); - depoPaymentInstructionRegister.setUpdated(Instant.now()); - depoPaymentInstructionRegister.setCompanyId(paymentInstruction.getSenderId()); - if (tradingClearingRegistry == null) { - log.warn("For paymentInstruction[{}].CreditLeg_accountId={} or SenderId={} can not find TradingClearingRegistry.", - paymentInstruction.getId(), paymentInstruction.getCreditLeg_accountId(), paymentInstruction.getSenderId()); - } else { - depoPaymentInstructionRegister.setTradingClearingRegistryType(tradingClearingRegistry.getTradingClearingRegistryType()); - depoPaymentInstructionRegister.setTradingClearingRegistry(tradingClearingRegistry.getCode()); - } - depoPaymentInstructionRegister.setCbCode("RNCB-BE-01"); - depoPaymentInstructionRegister.setQuantity(paymentInstruction.getCreditLeg_amount()); - depoPaymentInstructionRegister.setDirection(inOutDirectionDictionary.getId()); - depoPaymentInstructionRegister.setSessionId(paymentInstruction.getSessionId()); - depoPaymentInstructionRegisterMap.insert(depoPaymentInstructionRegister); - log.debug("inserted successfully DepoBalanceRegister entity with id: {}", depoPaymentInstructionRegister.getId()); - } - - @Override - public Optional isDuplicateInMap(PaymentInstruction entity) { - return Optional.empty(); -// Map> fieldValues = Map.of( -// "companyId", entity.getSenderId(), -// "sessionId", entity.getSessionId() -// ); -// Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); -// if (message.isPresent()) { -// log.warn("Illegal value in map for request to imdg: {}", message.get()); -// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); -// } -// return Optional.ofNullable(depoPaymentInstructionRegisterMap.getFirstObjectByFieldValues(fieldValues)); - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java deleted file mode 100644 index 2b30ff310..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterService.java +++ /dev/null @@ -1,167 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.producer.Producer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; -import ru.clearing.classes.statics.data.security.Security; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExcludeLiabilitiesRegisterNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.registry.util.PreClearMap; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; -import ru.spcex.platform.utils.time.TimeUtil; -import ru.spcex.platform.utils.validation.IValidator; - -import java.time.Instant; -import java.time.LocalDate; -import java.util.Collection; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; - -import static ru.spcex.platform.enumeration.Task.createRegistry_EXLR; - -@Service -public class ExcludeLiabilitiesRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg excludeLiabilitiesRegisterMap; - private final Imdg registryMap; - private final Imdg sessionMap; - private final Imdg companySymbolMap; - private final SecuritySelector securitySelector; - private final Function, IValidator> fieldValuesValidator; - private final PreClearMap preClearMap; - - @Autowired - public ExcludeLiabilitiesRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - Function, IValidator> fieldValuesValidator) { - super(kafkaQueue, kafkaProducer); - this.excludeLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_ExcludeLiabilitiesRegister, ExcludeLiabilitiesRegister.class); - this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - this.companySymbolMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, ru.clearing.classes.statics.data.company.CompanySymbols.class); - this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); - this.fieldValuesValidator = fieldValuesValidator; - preClearMap = PreClearMap.instanceForInstantField(excludeLiabilitiesRegisterMap, "created"); - } - - @Override - public void afterPropertiesSet() { - callback(ExcludeLiabilitiesRegisterNewRequest.class) - .setConsumer(this::excludeLiabilitiesRegisterNew) - .forDestination(Consts.REGISTRY_EXCLUDE_LIABILITIES_REGISTER_NEW, callbacks::put); - callback(LauncherCommandRequest.class) - .setConsumer(this::excludeLiabilitiesRegisterNew) - .forDestination(createRegistry_EXLR.topic(), callbacks::put); - init(); - } - - - public void excludeLiabilitiesRegisterNew(BaseRequest userRequest) { - log.debug("ExcludeLiabilitiesRegisterNew received"); - String sqlForRegistries = getSqlForRegistries(); - Collection registries = registryMap.getCollectionObjectsBySQL(sqlForRegistries); - if (registries.isEmpty()) { - log.debug("No registry with such conditions {}", sqlForRegistries); - return; - } - log.debug("Select {} Registry by query {}", registries.size(), sqlForRegistries); - preClearMap.preClearMap(); - registries.forEach((registry -> { - if (isDuplicateInMap(registry).isEmpty()) { - insertExcludeLiabilitiesRegister(registry); - } - } - )); - log.debug("successfully processed"); - } - - private void insertExcludeLiabilitiesRegister(Registry registry) { - log.trace("Started generating ExcludeLiabilitiesRegister entity..."); - ExcludeLiabilitiesRegister excludeLiabilitiesRegister = new ExcludeLiabilitiesRegister(); - //hz communicating - Session sessionBySessionId = sessionMap.getSingleObjectByID(registry.getSessionId()); - Map> innPredicates = Map.of( - "companySymbol", CompanySymbol.INN.getKey(), - "companyId", registry.getCompanyId() - ); - ru.clearing.classes.statics.data.company.CompanySymbols companySymbol = companySymbolMap.getFirstObjectByFieldValues(innPredicates); - Security security = securitySelector.selectSecurityById(registry.getSecurityId()); - - excludeLiabilitiesRegister.setSessionId(registry.getSessionId()); - excludeLiabilitiesRegister.setValidFromDate(sessionBySessionId.getClearingDate()); - LocalDate validToDate = TimeUtil.toLocalDate(sessionBySessionId.getUpdated()); - excludeLiabilitiesRegister.setValidToDate(validToDate); - excludeLiabilitiesRegister.setCompanyId(registry.getCompanyId()); - excludeLiabilitiesRegister.setCompanyFullName(registry.getFullName()); - if (companySymbol != null) { - excludeLiabilitiesRegister.setInn(companySymbol.getCompanySymbolValue()); - } - excludeLiabilitiesRegister.setRegistryCode(registry.getRegistryCode()); - excludeLiabilitiesRegister.setAccount(registry.getAccount()); - excludeLiabilitiesRegister.setRegistryStatus(registry.getRegistryStatus()); - if (security == null) { - log.warn("Security id={} not found for registry id={}", registry.getSecurityId(), registry.getId()); - } else { - if (InstrumentType.RATE.equalsByKey(security.getInstrumentType())) { - excludeLiabilitiesRegister.setCurrency(((MoneyMarketSecurity) security).getNominalCurrency()); - } else if (InstrumentType.BOND.equalsByKey(security.getInstrumentType())) { - excludeLiabilitiesRegister.setCurrency(((FixedIncomeSecurity) security).getNominalCurrency()); - } else if (InstrumentType.EQTY.equalsByKey(security.getInstrumentType())) { - // не заполняется Currency - } else { // never - log.warn("Unexpected security[{}] type {}", security.getId(), security.getInstrumentType()); - } - } - excludeLiabilitiesRegister.setSumLiabilities(registry.getBalance()); - excludeLiabilitiesRegister.setSettlementDate(registry.getSettlementDate()); - excludeLiabilitiesRegister.setCreated(Instant.now()); - excludeLiabilitiesRegister.setUpdated(excludeLiabilitiesRegister.getCreated()); - excludeLiabilitiesRegisterMap.insert(excludeLiabilitiesRegister); - log.debug("inserted successfully ExcludeLiabilitiesRegister entity with id: {}", excludeLiabilitiesRegister.getId()); - } - - protected String getSqlForRegistries() { - return String.format("registryDesignation = '%s' and " + - "registryInstrumentType in ('%s','%s') and " + - "registryUnit = '%s' and " + - "registryStatus in ('%s', '%s')", - RegistryDesignation.O.getKey(), - RegistryInstrumentType.S.getKey(), - RegistryInstrumentType.M.getKey(), - RegistryUnit.T.getKey(), - RegistryStatus.FAIL.getKey(), - RegistryStatus.UNCV.getKey() - ); - } - - @Override - public Optional isDuplicateInMap(Registry entity) { - return Optional.empty(); -// Map> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId()); -// Optional message = fieldValuesValidator.apply(fieldValues).tillFirstError(); -// if (message.isPresent()) { -// log.warn("Illegal value in map for request to imdg: {}", message.get()); -// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); -// } -// return Optional.ofNullable(excludeLiabilitiesRegisterMap.getFirstObjectByFieldValues(fieldValues)); - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java deleted file mode 100644 index 473971e4e..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ExecutionRegisterService.java +++ /dev/null @@ -1,368 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.producer.Producer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.execution.ExecutionCommon; -import ru.clearing.classes.statics.data.execution.ExecutionDeposit; -import ru.clearing.classes.statics.data.execution.ExecutionFond; -import ru.clearing.classes.statics.data.register.ExecutionRegister; -import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.registry.reports.ReportUtils; -import ru.spcex.clearing.registry.reports.builders.ExecutionRegisterReportBuilder; -import ru.spcex.clearing.registry.util.PreClearMap; -import ru.spcex.platform.enumeration.CompanySymbol; -import ru.spcex.platform.enumeration.MoneyFlowSide; -import ru.spcex.platform.enumeration.Side; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.IEnumKey; -import ru.spcex.platform.utils.validation.IValidator; - -import java.io.File; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.util.*; -import java.util.function.Function; - -import static ru.spcex.clearing.imdg.IMDGDistributedNames.*; -import static ru.spcex.platform.enumeration.Task.createRegistry_ECNR; - -@Service -public class ExecutionRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg executionRegisterMap; - private final Imdg companySymbolsMap; - private final Imdg executionFondMap; - private final Imdg executionDepositMap; - private final Imdg tradingClearingRegistryMap; - private final Imdg accountImdg; - private final Function, IValidator> fieldValuesValidator; - private final PreClearMap preClearMap; - - private final ExecutionRegisterReportBuilder reportBuilder; - private final File outFolder; - private final RegistryServiceSettings settings; - - private final SFTPReportsConfig.ReportsGateway reportsSftpGateway; - private final boolean deleteAfterSend; - - - @Autowired - public ExecutionRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - Function, IValidator> fieldValuesValidator, - @Qualifier("reportOutDir") File outFolder, - RegistryServiceSettings settings, - SFTPReportsConfig.ReportsGateway reportsSftpGateway) { - super(kafkaQueue, kafkaProducer); - this.executionRegisterMap = imdgProvider.getImdg(Map_ExecutionRegister, ExecutionRegister.class); - this.companySymbolsMap = imdgProvider.getImdg(Map_CompanySymbols, CompanySymbols.class); - this.executionFondMap = imdgProvider.getImdg(Map_ExecutionFond, ExecutionFond.class); - this.executionDepositMap = imdgProvider.getImdg(Map_ExecutionDeposit, ExecutionDeposit.class); - this.tradingClearingRegistryMap = imdgProvider.getImdg(Map_TradingClearingRegistry, TradingClearingRegistry.class); - this.accountImdg = imdgProvider.getImdg(Map_Account, Account.class); - this.fieldValuesValidator = fieldValuesValidator; - this.settings = settings; - this.reportsSftpGateway = reportsSftpGateway; - this.outFolder = outFolder; - reportBuilder = new ExecutionRegisterReportBuilder(imdgProvider); - deleteAfterSend = settings.getReportsStore().isDeleteAfterSend(); - preClearMap = PreClearMap.instanceForInstantField(executionRegisterMap, "created"); - } - - @Override - public void afterPropertiesSet() { - callback(LauncherCommandRequest.class) - .setConsumer(this::executionRegisterNew) - .forDestination(createRegistry_ECNR.topic(), callbacks::put); - - - // TODO возможно deprecated -// callback(ExecutionRegisterOnSaveRequest.class) -// .setConsumer(this::executionRegisterOnSavingOfTrade) -// .forDestination(Consts.REGISTRY_EXECUTION_REGISTER_ON_SAVE, callbacks::put); - - init(); - } - - public void executionRegisterNew(BaseRequest userRequest) { - boolean csvMode = settings.isCsvMode(); - LocalDate localDateNow = LocalDate.now(); - log.debug("ExecutionRegisterNewRequest received"); - Collection collectionFond = executionFondMap.getCollectionObjectsByFieldValues( - Map.of( - "clearingDate", localDateNow, - "side", Side.SELL.getKey() - )); - Collection collectionDeposit = executionDepositMap.getCollectionObjectsByFieldValues( - Map.of( - "clearingDate", localDateNow, - "side", MoneyFlowSide.SELL.getKey() - )); - log.debug("Found {} ExecutionFond and {} ExecutionDeposit on clearingDate={}", - collectionFond.size(), collectionDeposit.size(), localDateNow); - if (!csvMode) preClearMap.preClearMap(); - List executionCommonForReport = new ArrayList<>(); - collectionFond.forEach(x -> { - if (!csvMode) insertExecutionRegister(true, x); - else executionCommonForReport.add(x); - }); - collectionDeposit.forEach(x -> { - if (!csvMode) insertExecutionRegister(false, x); - else executionCommonForReport.add(x); - }); - if (csvMode) { - File reportFile = reportBuilder.buildReport(executionCommonForReport, outFolder); - ReportUtils.sendFilesToSftp(List.of(reportFile), reportsSftpGateway, deleteAfterSend); - } - - log.debug("successfully processed..."); - } - - private void insertExecutionRegister(Boolean isFond, ExecutionCommon common) { - log.trace("Started generating ExecutionRegister entity..."); - - LocalDate tradingDate = common.getTradingDate(); - Long exchangeExecutionId = common.getExchangeExecutionId(); - Instant exchangeExecutionTime = common.getExchangeExecutionTime(); - Long securityId = common.getSecurityId(); - LocalDate clearingDate = common.getClearingDate(); - - Long sellerId; - String sellerClearingCode = null; - String sellerTradingClearingRegister; - String sellerMoneyAccount = null; - String sellerDepoAccount = null; - - Long buyerId; - String buyerClearingCode = null; - String buyerTradingClearingRegister; - String buyerMoneyAccount = null; - String buyerDepoAccount = null; - - BigDecimal amount; - BigDecimal quantity = null; - if (isFond) { - ExecutionFond executionFond = (ExecutionFond) common; - amount = executionFond.getSettlementAmount(); - quantity = executionFond.getQuantity(); - } else { - ExecutionDeposit executionDeposit = (ExecutionDeposit) common; - amount = executionDeposit.getFirstLegAmount(); - } - - TradingClearingRegistry tkrForCounterPartyTkrId = null; - if (common.getCounterPartyTradingClearingRegistryId() != null) { - tkrForCounterPartyTkrId = tradingClearingRegistryMap.getSingleObjectByID( - common.getCounterPartyTradingClearingRegistryId() - ); - } - TradingClearingRegistry tkrForTkrId = null; - if (common.getTradingClearingRegistryId() != null) { - tkrForTkrId = tradingClearingRegistryMap.getSingleObjectByID( - common.getTradingClearingRegistryId() - ); - } - Account moneyAccountForCounterPartyTkrId = null; - Account depoAccountForCounterPartyTkrId = null; - if (tkrForCounterPartyTkrId != null) { - if (tkrForCounterPartyTkrId.getMoneyAccountId() != null) - moneyAccountForCounterPartyTkrId = accountImdg.getSingleObjectByID(tkrForCounterPartyTkrId.getMoneyAccountId()); - if (tkrForCounterPartyTkrId.getDepoAccountId() != null) - depoAccountForCounterPartyTkrId = accountImdg.getSingleObjectByID(tkrForCounterPartyTkrId.getDepoAccountId()); - } - Account moneyAccountForTkrId = null; - Account depoAccountForTkrId = null; - if (tkrForTkrId != null) { - if (tkrForTkrId.getMoneyAccountId() != null) - moneyAccountForTkrId = accountImdg.getSingleObjectByID(tkrForTkrId.getMoneyAccountId()); - if (tkrForTkrId.getDepoAccountId() != null) - depoAccountForTkrId = accountImdg.getSingleObjectByID(tkrForTkrId.getDepoAccountId()); - } - - CompanySymbols companySymbolsForCompanyId = companySymbolsMap.getFirstObjectByFieldValues( - Map.of( - "companySymbol", CompanySymbol.CLRC.getKey(), - "companyId", common.getCompanyId() - ) - ); - CompanySymbols companySymbolsForCounterPartyId = companySymbolsMap.getFirstObjectByFieldValues( - Map.of( - "companySymbol", CompanySymbol.CLRC.getKey(), - "companyId", common.getCounterPartyId() - ) - ); - - String sideStr = common.getSide(); - MoneyFlowSide moneyFlowSide = IEnumKey.getEnumByKey(MoneyFlowSide.class, sideStr); - Side side = IEnumKey.getEnumByKey(Side.class, sideStr); - if (moneyFlowSide == MoneyFlowSide.BUY || side == Side.BUY) { - - sellerId = common.getCounterPartyId(); - buyerId = common.getCompanyId(); - - if (companySymbolsForCounterPartyId != null) - sellerClearingCode = companySymbolsForCounterPartyId.getCompanySymbolValue(); - sellerTradingClearingRegister = common.getCounterPartyTradingClearingRegistry(); - if (moneyAccountForCounterPartyTkrId != null) - sellerMoneyAccount = moneyAccountForCounterPartyTkrId.getAccount(); - if (depoAccountForCounterPartyTkrId != null) - sellerDepoAccount = depoAccountForCounterPartyTkrId.getAccount(); - - if (companySymbolsForCompanyId != null) - buyerClearingCode = companySymbolsForCompanyId.getCompanySymbolValue(); - buyerTradingClearingRegister = common.getPartyTradingClearingRegistry(); - if (moneyAccountForTkrId != null) buyerMoneyAccount = moneyAccountForTkrId.getAccount(); - if (depoAccountForTkrId != null) buyerDepoAccount = depoAccountForTkrId.getAccount(); - - } else { - - sellerId = common.getCompanyId(); - buyerId = common.getCounterPartyId(); - - if (companySymbolsForCompanyId != null) - sellerClearingCode = companySymbolsForCompanyId.getCompanySymbolValue(); - sellerTradingClearingRegister = common.getPartyTradingClearingRegistry(); - if (moneyAccountForTkrId != null) sellerMoneyAccount = moneyAccountForTkrId.getAccount(); - if (depoAccountForTkrId != null) sellerDepoAccount = depoAccountForTkrId.getAccount(); - - if (companySymbolsForCounterPartyId != null) - buyerClearingCode = companySymbolsForCounterPartyId.getCompanySymbolValue(); - buyerTradingClearingRegister = common.getCounterPartyTradingClearingRegistry(); - if (moneyAccountForCounterPartyTkrId != null) - buyerMoneyAccount = moneyAccountForCounterPartyTkrId.getAccount(); - if (depoAccountForCounterPartyTkrId != null) - buyerDepoAccount = depoAccountForCounterPartyTkrId.getAccount(); - - } - - ExecutionRegister executionRegister = new ExecutionRegister(); - executionRegister.setTradingDate(tradingDate); - executionRegister.setExchangeExecutionId(exchangeExecutionId); - executionRegister.setExchangeExecutionTime(exchangeExecutionTime); - executionRegister.setSecurityId(securityId); - executionRegister.setSellerId(sellerId); - executionRegister.setSellerClearingCode(sellerClearingCode); - executionRegister.setSellerTradingClearingRegister(sellerTradingClearingRegister); - executionRegister.setSellerMoneyAccount(sellerMoneyAccount); - executionRegister.setSellerDepoAccount(sellerDepoAccount); - executionRegister.setBuyerId(buyerId); - executionRegister.setBuyerClearingCode(buyerClearingCode); - executionRegister.setBuyerTradingClearingRegister(buyerTradingClearingRegister); - executionRegister.setBuyerMoneyAccount(buyerMoneyAccount); - executionRegister.setBuyerDepoAccount(buyerDepoAccount); - executionRegister.setAmount(amount); - executionRegister.setQuantity(quantity); - executionRegister.setClearingDate(clearingDate); - executionRegister.setCreated(Instant.now()); - executionRegisterMap.insert(executionRegister); - log.debug("inserted successfully ExecutionRegister entity with id: {}", executionRegister.getId()); - } - - - // TODO возможно deprecated - //public void executionRegisterOnSavingOfTrade(BaseRequest userRequest) { - // ExecutionRegisterOnSaveRequest request = userRequest.getRequestPayload(); - // ExecutionCommon common = setUpExecutionCommon(request); - // boolean isFond = request.isExecutionFond(); - // Optional optionalDuplicate = isDuplicateInMap(common); - // if (optionalDuplicate.isEmpty()) { - // insertExecutionRegister(isFond, common); - // } else { - // updateExecutionRegister(isFond, common, optionalDuplicate.get()); - // } - //} - - // TODO возможно deprecated - //private void updateExecutionRegister(boolean isFond, ExecutionCommon common, ExecutionRegister registerToUpdate) { - // log.trace("Started updating ExecutionRegister entity..."); - // registerToUpdate.setSecurityId(common.getSecurityId()); - // registerToUpdate.setExchangeExecutionTime(common.getExchangeExecutionTime()); - // registerToUpdate.setAmount(isFond ? ((ExecutionFond) common).getSettlementAmount() : ((ExecutionDeposit) common).getFirstLegAmount()); - // registerToUpdate.setQuantity(isFond ? common.getQuantity() : null); - // registerToUpdate.setUpdated(Instant.now()); - // executionRegisterMap.update(registerToUpdate); - // log.debug("Updated successfully ExecutionRegister entity with id: {}", registerToUpdate.getId()); - //} - - - // todo возможно deprecated - //private ExecutionCommon setUpExecutionCommon(ExecutionRegisterOnSaveRequest request) { - // ExecutionFond fond = null; - // ExecutionDeposit deposit = null; - // if (request.isExecutionFond()) { - // fond = new ExecutionFond(); - // fond.setExchangeOrderId(request.getExchangeOrderId()); - // fond.setSettlementAmount(request.getSettlementAmount()); - // fond.setComment(request.getComment()); - // fond.setClientCodeId(request.getClientCodeId()); - // fond.setSettlementCode(request.getSettlementCode()); - // fond.setSettlementDate(request.getSettlementDate()); - // fond.setExchangeExecutionMicroseconds(request.getExchangeExecutionMicroseconds()); - // } else { - // deposit = new ExecutionDeposit(); - // deposit.setFirstLegAmount(request.getFirstLegAmount()); - // deposit.setSecondLegAmount(request.getSecondLegAmount()); - // deposit.setFirstLegSettlementDate(request.getFirstLegSettlementDate()); - // deposit.setSecondLegSettlementDate(request.getSecondLegSettlementDate()); - // deposit.setFirstLegSettlementCode(request.getFirstLegSettlementCode()); - // deposit.setSecondLegSettlementCode(request.getSecondLegSettlementCode()); - // deposit.setContract(request.getContract()); - // deposit.setSecurityCode(request.getSecurityCode()); - // } - // boolean isFond = fond != null; - // ExecutionCommon common = isFond ? fond : deposit; - // common.setExchangeExecutionId(request.getExchangeExecutionId()); - // common.setExchangeExecutionTime(request.getExchangeExecutionTime()); - // common.setTradingDate(request.getTradingDate()); - // common.setTradingClearingRegistryId(request.getTradingClearingRegistryId()); - // common.setMarket(request.getMarket()); - // common.setPrice(request.getPrice()); - // common.setLots(request.getLots()); - // common.setQuantity(request.getQuantity()); - // common.setInterestAmount(request.getInterestAmount()); - // common.setSide(request.getSide()); - // common.setSettlementCurrency(request.getSettlementCurrency()); - // common.setCompanyId(request.getCompanyId()); - // common.setDuration(request.getDuration()); - // common.setSecurityFullName(request.getSecurityFullName()); - // common.setSecuritySymbol(request.getSecuritySymbol()); - // common.setSecurityId(request.getSecurityId()); - // common.setCounterPartyId(request.getCounterPartyId()); - // common.setCoverageStatus(request.getCoverageStatus()); - // common.setSessionId(request.getSessionId()); - // common.setClearingDate(request.getClearingDate()); - // return common; - //} - - @Deprecated - @Override - public Optional isDuplicateInMap(ExecutionCommon entity) { - return Optional.empty(); -// Map> map = Map.of("exchangeExecutionId", entity.getExchangeExecutionId(), -// "tradingDate", LocalDate.now()); //clarify timezone -// Optional message = fieldValuesValidator.apply(map).tillFirstError(); -// if (message.isPresent()) { -// log.warn("Illegal value in map for request to imdg: {}", message.get()); -// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); -// } -// return Optional.ofNullable(executionRegisterMap.getSingleObjectByFieldValues(map)); - } - -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ICheckDuplicate.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ICheckDuplicate.java deleted file mode 100644 index 9f56227d0..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/ICheckDuplicate.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import java.util.Optional; - -/** - * @param - тип объекта по которому мы будем проверять наличие дубликата - * @param - тип объекта (реестра) который мы нашли как дубликат - * */ -public interface ICheckDuplicate { - /** - * @return возвращает optional с дубликатом - * */ - Optional isDuplicateInMap(T entity); -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java deleted file mode 100644 index 0cc52a880..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterService.java +++ /dev/null @@ -1,196 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.producer.Producer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.register.LiabilitiesRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; -import ru.clearing.classes.statics.data.security.Security; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.domain.cud.registry.LiabilitiesRegisterNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.registry.reports.ReportUtils; -import ru.spcex.clearing.registry.reports.builders.LiabilitiesRegistryReportBuilder; -import ru.spcex.clearing.registry.util.PreClearMap; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; -import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; -import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector; -import ru.spcex.platform.utils.time.TimeUtil; -import ru.spcex.platform.utils.validation.IValidator; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDate; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; - -import static ru.spcex.platform.enumeration.Task.createRegistry_LBSR; - -@Service -public class LiabilitiesRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg liabilitiesRegisterMap; - private final Imdg registryMap; - private final Imdg sessionMap; - private final Imdg companySymbolsMap; - private final SecuritySelector securitySelector; - private final Function, IValidator> fieldValuesValidator; - private final PreClearMap preClearMap; - private final LiabilitiesRegistryReportBuilder reportBuilder; - private final File outFolder; - private final RegistryServiceSettings settings; - private final SFTPReportsConfig.ReportsGateway reportsSftpGateway; - private final boolean deleteAfterSend; - - @Autowired - public LiabilitiesRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - Function, IValidator> fieldValuesValidator, - @Qualifier("reportOutDir") File outFolder, - RegistryServiceSettings settings, - SFTPReportsConfig.ReportsGateway reportsSftpGateway) { - super(kafkaQueue, kafkaProducer); - this.liabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesRegister, LiabilitiesRegister.class); - this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - this.companySymbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); - this.securitySelector = new SecuritySelector<>(imdgProvider, Security.class); - this.fieldValuesValidator = fieldValuesValidator; - preClearMap = PreClearMap.instanceForInstantField(liabilitiesRegisterMap, "created"); - reportBuilder = new LiabilitiesRegistryReportBuilder(imdgProvider); - this.outFolder = outFolder; - this.settings = settings; - this.reportsSftpGateway = reportsSftpGateway; - this.deleteAfterSend = settings.getReportsStore().isDeleteAfterSend(); - } - - @Override - public void afterPropertiesSet() { - callback(LiabilitiesRegisterNewRequest.class) - .setConsumer(this::liabilitiesRegisterNew) - .forDestination(Consts.REGISTRY_LIABILITIES_REGISTER_NEW, callbacks::put); - callback(LauncherCommandRequest.class) - .setConsumer(this::liabilitiesRegisterNew) - .forDestination(createRegistry_LBSR.topic(), callbacks::put); - init(); - } - - - public void liabilitiesRegisterNew(BaseRequest userRequest) { - log.debug("LiabilitiesRegisterNewRequest received from {}", createRegistry_LBSR.topic()); - boolean csvMode = settings.isCsvMode(); - - ImdgPredicate conditionForRegistry = getPredicateForRegistries(); - Collection registries = registryMap.getCollectionObjectsByPredicate(conditionForRegistry); - log.debug("Found {} Registry by query {}", registries.size(), conditionForRegistry); - if (!csvMode) - preClearMap.preClearMap(); -// registries.forEach((registry -> { -// if (isDuplicateInMap(registry).isEmpty()) { -// if (!csvMode || LocalDate.now().equals(registry.getTradingDate())) -// insertLiabilitiesRegister(registry); -// } -// } -// )); - if (csvMode) { - File reportFile = reportBuilder.buildReport(registries, outFolder); - ReportUtils.sendFilesToSftp(List.of(reportFile), reportsSftpGateway, deleteAfterSend); - } - log.debug("successfully processed"); - } - -// private void insertLiabilitiesRegister(Registry registry) { -// log.trace("Started generating LiabilitiesRegister entity..."); -// LiabilitiesRegister liabilitiesRegister = new LiabilitiesRegister(); -// Session session = sessionMap.getSingleObjectByID(registry.getSessionId()); -// CompanySymbols companySymbols = companySymbolsMap.getFirstObjectByFieldValues( -// Map.of("companyId", registry.getCompanyId(), -// "companySymbol", CompanySymbol.INN.getKey() -// ) -// ); -// Security security = securitySelector.selectSecurityById(registry.getSecurityId()); -// if (session == null) { -// log.warn("Session is empty!"); -// } else { -// liabilitiesRegister.setValidFromDate(session.getClearingDate()); -// liabilitiesRegister.setValidToDate(TimeUtil.toLocalDate(session.getUpdated())); -// } -// if (companySymbols == null) { -// log.warn("CompanySymbols not found, for companyId={}", registry.getCompanyId()); -// } else { -// liabilitiesRegister.setInn(companySymbols.getCompanySymbolValue()); -// } -// if (security == null) { -// log.warn("Security id={} not found for registry id={}", registry.getSecurityId(), registry.getId()); -// } else { -// if (InstrumentType.RATE.equalsByKey(security.getInstrumentType())) { -// liabilitiesRegister.setCurrency(((MoneyMarketSecurity) security).getNominalCurrency()); -// } else if (InstrumentType.BOND.equalsByKey(security.getInstrumentType())) { -// liabilitiesRegister.setCurrency(((FixedIncomeSecurity) security).getNominalCurrency()); -// } else if (InstrumentType.EQTY.equalsByKey(security.getInstrumentType())) { -// // не заполняется Currency -// } else { // never -// log.warn("Unexpected security[{}] type {}", security.getId(), security.getInstrumentType()); -// } -// } -// liabilitiesRegister.setSessionId(registry.getSessionId()); -// liabilitiesRegister.setValidFromDate(session.getClearingDate()); -// LocalDate validToDate = TimeUtil.toLocalDate(session.getUpdated()); -// liabilitiesRegister.setValidToDate(validToDate); -// liabilitiesRegister.setCompanyId(registry.getCompanyId()); -// liabilitiesRegister.setCompanyFullName(registry.getFullName()); -// liabilitiesRegister.setRegistryCode(registry.getRegistryCode()); -// liabilitiesRegister.setAccount(registry.getAccount()); -// liabilitiesRegister.setRegistryStatus(registry.getRegistryStatus()); -// liabilitiesRegister.setSumLiabilities(registry.getBalance()); -// liabilitiesRegister.setSettlementDate(registry.getSettlementDate()); -// liabilitiesRegister.setCreated(Instant.now()); -// liabilitiesRegister.setUpdated(liabilitiesRegister.getCreated()); -// liabilitiesRegisterMap.insert(liabilitiesRegister); -// log.debug("inserted successfully LiabilitiesRegister entity with id: {}", liabilitiesRegister.getId()); -// } - - protected ImdgPredicate getPredicateForRegistries() { - ImdgPredicateBuilder pb = registryMap.predicateBuilder(); - return pb.and( - RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.OM_T, RegistryTradingParams.OS_T).buildPredicate(pb), - pb.equals("registryStatus", RegistryStatus.CLRD.getKey()), - pb.equals("settlementDate", LocalDate.now()) - ); -// return String.format("registryDesignation = '%s' and " + -// "registryInstrumentType in ('%s','%s') and " + -// "registryUnit = '%s'", -// RegistryDesignation.L.getKey(), -// RegistryInstrumentType.S.getKey(), -// RegistryInstrumentType.M.getKey(), -// RegistryUnit.T.getKey()); - } - - @Override - public Optional isDuplicateInMap(Registry entity) { - return Optional.empty(); - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java deleted file mode 100644 index f726283c2..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterService.java +++ /dev/null @@ -1,167 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.producer.Producer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.register.MoneyBalanceRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.registry.RegistryHistory; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.registry.reports.ReportUtils; -import ru.spcex.clearing.registry.reports.builders.MoneyBalanceRegisterReportBuilder; -import ru.spcex.clearing.registry.util.PreClearMap; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.RegistryTradingParams; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; -import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; -import ru.spcex.platform.utils.enumeration.IEnumKey; - -import java.io.File; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import static ru.spcex.platform.enumeration.Task.createRegistry_GBRR; - -@Service -public class MoneyBalanceRegisterService extends QueueConsumer implements InitializingBean { - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Imdg moneyBalanceRegisterMap; - private final Imdg registryHistoryMap; - private final Imdg companyMap; - private final PreClearMap preClearMap; - - private final MoneyBalanceRegisterReportBuilder reportBuilder; - private final File outFolder; - RegistryServiceSettings settings; - - private final SFTPReportsConfig.ReportsGateway reportsSftpGateway; - private final boolean deleteAfterSend; - - - @Autowired - public MoneyBalanceRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - RegistryServiceSettings settings, - @Qualifier("reportOutDir") File outFolder, - SFTPReportsConfig.ReportsGateway reportsSftpGateway) { - super(kafkaQueue, kafkaProducer); - this.moneyBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyBalanceRegister, MoneyBalanceRegister.class); - this.registryHistoryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryHistory, RegistryHistory.class); - this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - preClearMap = PreClearMap.instanceForInstantField(moneyBalanceRegisterMap, "created"); - reportBuilder = new MoneyBalanceRegisterReportBuilder(imdgProvider); - this.outFolder = outFolder; - this.settings = settings; - this.reportsSftpGateway = reportsSftpGateway; - this.deleteAfterSend = settings.getReportsStore().isDeleteAfterSend(); - } - - @Override - public void afterPropertiesSet() { - callback(LauncherCommandRequest.class) - .setConsumer(this::moneyBalanceRegisterNew) - .forDestination(createRegistry_GBRR.topic(), callbacks::put); - init(); - } - - public void moneyBalanceRegisterNew(BaseRequest userRequest) { - boolean csvMode = settings.isCsvMode(); - log.debug("LauncherCommandRequest received from {}", createRegistry_GBRR.topic()); - ImdgPredicate predicate = getSqlForRegistryHistory(userRequest.getRequestPayload().getCompanyId()); - Collection registryHistories = registryHistoryMap.getCollectionObjectsByPredicate(predicate); - if (registryHistories.isEmpty()) { - log.debug("No registry history with such conditions {}", predicate); - return; - } - log.debug("Select {} Registry history by query {}", registryHistories.size(), predicate); - if (!csvMode) preClearMap.preClearMap(); - List registryForReport = new ArrayList<>(); - for (RegistryHistory registryHistory : registryHistories) { - AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registryHistory.getObject().getAccountType()); - if (accountType != AccountType.Info && - BigDecimal.ZERO.compareTo(registryHistory.getObject().getDiffBalance()) != 0) { - log.trace("Ignore id={}, cause diffBalance is not zero.", registryHistory.getObject().getId()); - continue; - } - if (!csvMode) insertMoneyBalanceRegister(registryHistory); - else registryForReport.add(registryHistory); - } - if (csvMode) { - File reportFile = reportBuilder.buildReport(registryForReport, outFolder); - ReportUtils.sendFilesToSftp(List.of(reportFile), reportsSftpGateway, deleteAfterSend); - } - log.debug("successfully processed"); - } - - private void insertMoneyBalanceRegister(RegistryHistory registryHistory) { - log.trace("Started generating MoneyBalanceRegister entity..."); - Registry registry = registryHistory.getObject(); - MoneyBalanceRegister moneyBalanceRegister = new MoneyBalanceRegister(); - - Company company = companyMap.getFirstObjectByFieldValues(Map.of("id", 2L)); - String setHouseName = company != null ? company.getShortName() : null; - - AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType()); - String account = null; - if (accountType == AccountType.Clrn || accountType == AccountType.Info) { - account = registry.getAccount(); - } - moneyBalanceRegister.setSetHouseName(setHouseName); - moneyBalanceRegister.setCreated(Instant.now()); - moneyBalanceRegister.setCompanyId(registry.getCompanyId()); - moneyBalanceRegister.setAccount(account); - moneyBalanceRegister.setRemainderSum(registry.getBalance()); - moneyBalanceRegister.setUpdated(moneyBalanceRegister.getCreated()); - moneyBalanceRegisterMap.insert(moneyBalanceRegister); - log.debug("inserted successfully MoneyBalanceRegister entity with id: {}", moneyBalanceRegister.getId()); - } - - protected ImdgPredicate getSqlForRegistryHistory(Long companyId) { - Instant now = Instant.now().truncatedTo(ChronoUnit.DAYS); - ImdgPredicateBuilder pb = registryHistoryMap.predicateBuilder(); - RegistryCodeSqlBuilder codeSql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM_T).prefix("object"); - ImdgPredicate registryPredicate; - if (companyId == null) { - registryPredicate = pb.sql(codeSql.build()); - } else { - registryPredicate = pb.and( - pb.equals("object.companyId", companyId), - pb.sql(codeSql.build()) - ); - } - ImdgPredicate finalPredicate = pb.and( - registryPredicate, - pb.notNull("object.tradingClearingRegistry"), - // фильтрация по "object.accountType"==Info or diffBalance==0.0 в коде выше по moneyBalanceRegisterNew - pb.and( - pb.greatEqual("eventTime", now), - pb.less("eventTime", now.plus(1, ChronoUnit.DAYS)) - ) - ); - - log.trace("sql predicate for registry_history {}", finalPredicate); - return finalPredicate; - } - -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java deleted file mode 100644 index 77c79ee0e..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterService.java +++ /dev/null @@ -1,166 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.Consumer; -import org.apache.kafka.clients.producer.Producer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.payment.PaymentInstruction; -import ru.clearing.classes.statics.data.register.MoneyPaymentInstructionRegister; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.platform.messaging.service.QueueConsumer; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.registry.reports.ReportUtils; -import ru.spcex.clearing.registry.reports.builders.MoneyPaymentInstructionRegisterReportBuilder; -import ru.spcex.clearing.registry.util.PreClearMap; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.TransactionStatus; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.enumeration.IEnumKey; -import ru.spcex.platform.utils.validation.IValidator; - -import java.io.File; -import java.time.Instant; -import java.time.LocalDate; -import java.util.*; -import java.util.function.Function; - -import static ru.spcex.platform.enumeration.Task.createRegistry_GORR; - -@Service -public class MoneyPaymentInstructionRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate { - private final static String TOPIC_NAME = createRegistry_GORR.topic(); - private final Logger log = LoggerFactory.getLogger(getClass()); - private final Imdg moneyPaymentInstructionRegisterMap; - private final Imdg paymentInstructionMap; - private final Imdg sessionMap; - private final Function, IValidator> fieldValuesValidator; - private final Imdg companyMap; - private final Imdg accountMap; - private final PreClearMap preClearMap; - - private final MoneyPaymentInstructionRegisterReportBuilder reportBuilder; - private final File outFolder; - private final RegistryServiceSettings settings; - - private final SFTPReportsConfig.ReportsGateway reportsSftpGateway; - private final boolean deleteAfterSend; - - - @Autowired - public MoneyPaymentInstructionRegisterService(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - Function, IValidator> fieldValuesValidator, - @Qualifier("reportOutDir") File outFolder, - RegistryServiceSettings settings, - SFTPReportsConfig.ReportsGateway reportsSftpGateway) { - super(kafkaQueue, kafkaProducer); - this.moneyPaymentInstructionRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyPaymentInstructionRegister, MoneyPaymentInstructionRegister.class); - this.paymentInstructionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); - this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); - this.fieldValuesValidator = fieldValuesValidator; - preClearMap = PreClearMap.instanceForInstantField(moneyPaymentInstructionRegisterMap, "created"); - reportBuilder = new MoneyPaymentInstructionRegisterReportBuilder(imdgProvider); - this.outFolder = outFolder; - this.settings = settings; - this.reportsSftpGateway = reportsSftpGateway; - this.deleteAfterSend = settings.getReportsStore().isDeleteAfterSend(); - } - - @Override - public void afterPropertiesSet() { - callback(LauncherCommandRequest.class) - .setConsumer(this::moneyPaymentInstructionRegisterNew) - .forDestination(TOPIC_NAME, callbacks::put); - init(); - } - - public void moneyPaymentInstructionRegisterNew(BaseRequest userRequest) { - boolean csvMode = settings.isCsvMode(); - log.debug("LauncherCommandRequest received from {}", TOPIC_NAME); - - String piQuery = "transactionStatus='" + TransactionStatus.sent.getKey() + "' OR transactionStatus = '" + - TransactionStatus.stld.getKey() + "' OR transactionStatus = '" + TransactionStatus.ok.getKey() + "'"; - Collection paymentInstructions = paymentInstructionMap.getCollectionObjectsBySQL(piQuery); - log.debug("Selected {} PaymentInstruction by query \"{}\", do filter by account...", - paymentInstructions.size(), piQuery); - Collection moneyPaymentInstructions = new ArrayList<>(); - for (PaymentInstruction paymentInstruction : paymentInstructions) { - // filter by accountType - if (paymentInstruction.getCreditLeg_accountId() != null) { - Account account = accountMap.getSingleObjectByID(paymentInstruction.getCreditLeg_accountId()); - if (account == null) - log.warn("Account id={} not found for paymentInstruction.id={}", - paymentInstruction.getCreditLeg_accountId(), paymentInstruction.getId()); - else { - if (IEnumKey.contains(account.getAccountType(), AccountType.Clrn, AccountType.Info, AccountType.Anlt, AccountType.Tran)) { - moneyPaymentInstructions.add(paymentInstruction); - } - } - } - } - log.debug("Filtered {} PaymentInstruction, with money account's", moneyPaymentInstructions.size()); - - if (!csvMode) preClearMap.preClearMap(); - List paymentInstructionsForReport = new ArrayList<>(); - for (PaymentInstruction paymentInstruction : moneyPaymentInstructions) { - if (isDuplicateInMap(paymentInstruction).isEmpty()) { - if (!csvMode) insertMoneyPaymentInstructionRegister(paymentInstruction); - else if (LocalDate.now().equals(paymentInstruction.getClearingDate())) - paymentInstructionsForReport.add(paymentInstruction); - } - } - if (csvMode) { - File reportFile = reportBuilder.buildReport(paymentInstructionsForReport, outFolder); - ReportUtils.sendFilesToSftp(List.of(reportFile), reportsSftpGateway, deleteAfterSend); - } - log.debug("successfully processed"); - } - - private void insertMoneyPaymentInstructionRegister(PaymentInstruction paymentInstruction) { - log.trace("Started generating PaymentInstruction entity..."); - MoneyPaymentInstructionRegister moneyPaymentInstructionRegister = new MoneyPaymentInstructionRegister(); - moneyPaymentInstructionRegister.setCreditLegAccount(paymentInstruction.getCreditLeg_account()); - moneyPaymentInstructionRegister.setCreditLegAmount(paymentInstruction.getCreditLeg_amount()); - moneyPaymentInstructionRegister.setCreditLegCurrencyCode(paymentInstruction.getCreditLeg_currencyCode()); - moneyPaymentInstructionRegister.setDebitLegAccount(paymentInstruction.getDebitLeg_account()); - if (paymentInstruction.getSenderId() != null) { - Company companyForInjectionBySenderId = companyMap.getSingleObjectByID(paymentInstruction.getSenderId()); - moneyPaymentInstructionRegister.setSender(companyForInjectionBySenderId != null ? companyForInjectionBySenderId.getShortName() : null); - } - if (paymentInstruction.getAddresseeId() != null) { - Company companyForInjectionByAddresseeId = companyMap.getSingleObjectByID(paymentInstruction.getAddresseeId()); - moneyPaymentInstructionRegister.setAddressee(companyForInjectionByAddresseeId != null ? companyForInjectionByAddresseeId.getShortName() : null); - } - moneyPaymentInstructionRegister.setClearingDate(paymentInstruction.getClearingDate()); - moneyPaymentInstructionRegister.setCreated(Instant.now()); - moneyPaymentInstructionRegister.setUpdated(moneyPaymentInstructionRegister.getCreated()); - moneyPaymentInstructionRegisterMap.insert(moneyPaymentInstructionRegister); - log.debug("inserted successfully PaymentInstruction entity with id: {}", paymentInstruction.getId()); - } - - @Override - public Optional isDuplicateInMap(PaymentInstruction entity) { - return Optional.empty(); -// Map> fieldValuesCompanyIdSessionId = Map.of("senderId", entity.getSenderId(), "date", entity.getClearingDate()); -// Optional message = fieldValuesValidator.apply(fieldValuesCompanyIdSessionId).tillFirstError(); -// if (message.isPresent()) { -// log.warn("Illegal value in map for request to imdg: {}", message.get()); -// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get())); -// } -// return Optional.ofNullable(moneyPaymentInstructionRegisterMap.getFirstObjectByFieldValues(fieldValuesCompanyIdSessionId)); - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityRunner.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityRunner.java new file mode 100644 index 000000000..d329aebeb --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityRunner.java @@ -0,0 +1,125 @@ +package ru.spcex.clearing.registry.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import ru.spcex.clearing.registry.reports.bean.*; +import ru.spcex.clearing.registry.reports.builders.*; +import ru.spcex.clearing.registry.reports.loaders.*; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.*; + +@Service +public class RegisterUtilityRunner { + protected final Logger log = LoggerFactory.getLogger(getClass()); + private final DepoInstructionLoader depoInstructionLoader; + private final DepoBalanceLoader depoBalanceLoader; + private final MoneyInstructionLoader moneyInstructionLoader; + private final MoneyBalanceLoader moneyBalanceLoader; + private final ExecutionDepositLoader executionDepositLoader; + private final ExecutionFondLoader executionFondLoader; + private final ExecutionCurrencyLoader executionCurrencyLoader; + private final RegistryLoader registryLoader; + + private final DepoPaymentInstructionBuilder depoPaymentInstructionBuilder; + private final DepoBalanceRegisterReportBuilder depoBalanceRegisterReportBuilder; + private final MoneyPaymentInstructionRegisterReportBuilder moneyPaymentInstructionRegisterReportBuilder; + private final MoneyBalanceRegisterReportBuilder moneyBalanceRegisterReportBuilder; + private final ExecutionRegisterReportBuilder executionRegisterReportBuilder; + private final LiabilitiesRegistryReportBuilder liabilitiesRegistryReportBuilder; + + private final File outFolder; + + public RegisterUtilityRunner(DepoInstructionLoader depoInstructionLoader, + DepoBalanceLoader depoBalanceLoader, + MoneyInstructionLoader moneyInstructionLoader, + MoneyBalanceLoader moneyBalanceLoader, + ExecutionDepositLoader executionDepositLoader, + ExecutionFondLoader executionFondLoader, + ExecutionCurrencyLoader executionCurrencyLoader, + RegistryLoader registryLoader, + DepoPaymentInstructionBuilder depoPaymentInstructionBuilder, + DepoBalanceRegisterReportBuilder depoBalanceRegisterReportBuilder, + MoneyPaymentInstructionRegisterReportBuilder moneyPaymentInstructionRegisterReportBuilder, + MoneyBalanceRegisterReportBuilder moneyBalanceRegisterReportBuilder, + ExecutionRegisterReportBuilder executionRegisterReportBuilder, + LiabilitiesRegistryReportBuilder liabilitiesRegistryReportBuilder, + File outFolder) { + this.depoInstructionLoader = depoInstructionLoader; + this.depoBalanceLoader = depoBalanceLoader; + this.moneyInstructionLoader = moneyInstructionLoader; + this.moneyBalanceLoader = moneyBalanceLoader; + this.executionDepositLoader = executionDepositLoader; + this.executionFondLoader = executionFondLoader; + this.executionCurrencyLoader = executionCurrencyLoader; + this.registryLoader = registryLoader; + this.depoPaymentInstructionBuilder = depoPaymentInstructionBuilder; + this.depoBalanceRegisterReportBuilder = depoBalanceRegisterReportBuilder; + this.moneyPaymentInstructionRegisterReportBuilder = moneyPaymentInstructionRegisterReportBuilder; + this.moneyBalanceRegisterReportBuilder = moneyBalanceRegisterReportBuilder; + this.executionRegisterReportBuilder = executionRegisterReportBuilder; + this.liabilitiesRegistryReportBuilder = liabilitiesRegistryReportBuilder; + this.outFolder = outFolder; + log.info("Папка outFolder: {}", outFolder.getAbsolutePath()); + } + + public void process() throws InterruptedException { + List executionDeposits = new ArrayList<>(); + List executionFonds = new ArrayList<>(); + List executionCurrencys = new ArrayList<>(); + List moneyPaymentInstruction = new ArrayList<>(); + List depoPaymentInstruction = new ArrayList<>(); + List moneyBalances = new ArrayList<>(); + List depoBalances = new ArrayList<>(); + List registrys = new ArrayList<>(); + + List> catchExceptions = new ArrayList<>(); + ExecutorService executorService = Executors.newFixedThreadPool(1); + try { + catchExceptions.add(executorService.submit(() -> executionDeposits.addAll(executionDepositLoader.loadObjects()))); + catchExceptions.add(executorService.submit(() -> executionFonds.addAll(executionFondLoader.loadObjects()))); + catchExceptions.add(executorService.submit(() -> executionCurrencys.addAll(executionCurrencyLoader.loadObjects()))); + catchExceptions.add(executorService.submit(() -> depoPaymentInstruction.addAll(depoInstructionLoader.loadObjects()))); + catchExceptions.add(executorService.submit(() -> moneyPaymentInstruction.addAll(moneyInstructionLoader.loadObjects()))); + catchExceptions.add(executorService.submit(() -> moneyBalances.addAll(moneyBalanceLoader.loadObjects()))); + catchExceptions.add(executorService.submit(() -> depoBalances.addAll(depoBalanceLoader.loadObjects()))); + catchExceptions.add(executorService.submit(() -> registrys.addAll(registryLoader.loadObjects()))); + } finally { + executorService.shutdown(); + } + boolean finished = executorService.awaitTermination(2, TimeUnit.HOURS); + if (!finished) { + log.error("ExecutionService не успел завершиться корректно!"); + } + for (Future task : catchExceptions) { // распечатать возникшие ошибки загрузки + if (task.isDone()) try { + task.get(); + } catch (ExecutionException ex) { + log.error("At loader thread: ", ex.getCause()); + } + else { + log.warn("One of task has not finished."); + } + } + + depoPaymentInstructionBuilder.buildReport(depoPaymentInstruction, outFolder); + depoBalanceRegisterReportBuilder.buildReport(depoBalances, outFolder); + moneyPaymentInstructionRegisterReportBuilder.buildReport(moneyPaymentInstruction, outFolder); + moneyBalanceRegisterReportBuilder.buildReport(moneyBalances, outFolder); + liabilitiesRegistryReportBuilder.buildReport(registrys, outFolder); + + Set executionCommons = new HashSet<>(); + executionCommons.addAll(executionDeposits); + executionCommons.addAll(executionFonds); + executionCommons.addAll(executionCurrencys); + executionRegisterReportBuilder.buildReport(executionCommons, outFolder); + log.info("Все отчёты завершены."); + // todo возможно понадобится отсылать на SFTP ReportUtils.sendFilesToSftp + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityService.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityService.java new file mode 100644 index 000000000..dd005815f --- /dev/null +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/service/RegisterUtilityService.java @@ -0,0 +1,88 @@ +package ru.spcex.clearing.registry.service; + +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import ru.spcex.clearing.platform.messaging.domain.ActionType; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.platform.messaging.service.Status; +import ru.spcex.clearing.registry.conf.CmdArgsParser; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.platform.enumeration.Task; + +import java.time.LocalDate; + +public class RegisterUtilityService extends QueueConsumer implements InitializingBean { + protected final Logger log = LoggerFactory.getLogger(getClass()); + private RegisterUtilityRunner runner; + private AProperties properties; + private CmdArgsParser cmdArgsParser; + + public RegisterUtilityService(RegisterUtilityRunner runner, + AProperties properties, CmdArgsParser cmdArgsParser, + Consumer kafkaQueue, + Producer kafkaResponseQueue) { + super(kafkaQueue, kafkaResponseQueue); + this.runner = runner; + this.properties = properties; + this.cmdArgsParser = cmdArgsParser; + } + + @Override + public void afterPropertiesSet() throws Exception { + callback(LauncherCommandRequest.class) + .setFunction(this::processRequest) + .forDestination(Task.createRegistry_GBRR.topic(), callbacks::put); + init(); + log.info("{} started. Listen topic \"{}\"", + getClass().getSimpleName(), Task.createRegistry_GBRR.topic()); + } + + public RequestInfoUpdate processRequest(BaseRequest request) { + try { + log.info("ReportRequestWithPeriod id={} action {}", request.getId(), request.getActionType()); + if (request.getActionType() == ActionType.DELETE) { + throw new IllegalArgumentException("Action " + request.getActionType() + " not implemented for report"); + } + LocalDate from = null, to = null; + LauncherCommandRequest req = request.getRequestPayload(); + if (req != null) { + from = req.getFromDate(); + to = req.getToDate(); + } + this.process(from, to); + } catch (Exception e) { + log.error("Ошибка при формировании отчёта: {}", ExceptionUtils.getStackTrace(e)); + RequestInfoUpdate requestInfoUpdate = new RequestInfoUpdate(); + requestInfoUpdate.setId(request.getId()); + requestInfoUpdate.setStatus(Status.Error); + requestInfoUpdate.setMessage("Ошибка: " + e.toString()); // (Error) Ошибка: Ошибка: ru.spcex.clearing.utilities.exceptions.CmdArgsParserException: Дата startDate=2024-05-16 должна быть до endDate=2024-05-02 + if (e instanceof InterruptedException) { + Thread.currentThread().interrupt(); + } + return requestInfoUpdate; + } + return null; + } + + public synchronized void process(LocalDate fromDate, LocalDate toDate) throws InterruptedException { + if (fromDate == null && toDate == null) { + toDate = LocalDate.now().withDayOfMonth(1).minusDays(1); + fromDate = toDate.withDayOfMonth(1); + log.debug("Даты не указаны - отчёты за предыдущий месяц."); + } + properties.getPeriod().setStartDate(fromDate); + properties.getPeriod().setEndDate(toDate); + cmdArgsParser.validatePeriodProperties(properties.getPeriod()); + log.info("Запуск всех отчётов за период с {} по {}.", + properties.getPeriod().getStartDate(), properties.getPeriod().getEndDate()); + runner.process(); + } + +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/FieldValuesValidator.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/FieldValuesValidator.java deleted file mode 100644 index e897308e2..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/FieldValuesValidator.java +++ /dev/null @@ -1,33 +0,0 @@ -package ru.spcex.clearing.registry.util; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -@Deprecated -public class FieldValuesValidator { - public static List delete2(Map map) { - List errors = new ArrayList<>(); - map.forEach((key, value) -> { - if (key == null) { - errors.add("Key is null!"); - } else if (key.isEmpty()) { - errors.add("Key is empty!"); - } - if (value == null) { - errors.add("Value is null!"); - } - }); - return errors; - } - - public static Map> delete(Map> fieldValues) { - List errors = delete2(fieldValues); - if (!errors.isEmpty()) { - Optional error = errors.stream().findFirst(); - throw new IllegalStateException("Illegal state of field and values :" + error.orElse(null)); - } - return fieldValues; - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/PreClearMap.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/PreClearMap.java deleted file mode 100644 index ba80db4e7..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/util/PreClearMap.java +++ /dev/null @@ -1,79 +0,0 @@ -package ru.spcex.clearing.registry.util; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import ru.clearing.classes.objects.BusinessObject; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; -import ru.spcex.platform.utils.time.TimeUtil; - -import java.time.Instant; -import java.time.LocalDate; -import java.time.temporal.ChronoUnit; -import java.util.Collection; -import java.util.Objects; - -public class PreClearMap { - protected final Logger log = LoggerFactory.getLogger(getClass()); - protected final Imdg map; - protected final PredicateBuilder predicateBuilder; - - public PreClearMap(Imdg map, PredicateBuilder predicateBuilder) { - this.map = map; - this.predicateBuilder = predicateBuilder; - } - - public void preClearMap() { - ImdgPredicate query = predicateBuilder.query(map.predicateBuilder(), LocalDate.now()); - Collection toDelete = map.getCollectionObjectsByPredicate(query); - log.debug("Prepare {} to delete by query \"{}\" from map {}", toDelete.size(), query, map.getMapName()); - for (T item : toDelete) - map.delete(item); - } - - public static PreClearMap instanceForLocalDateField(Imdg map, String fieldName) { - Objects.requireNonNull(map); - Objects.requireNonNull(fieldName); - return new PreClearMap<>(map, new PredicateBuilder() { - @Override - public ImdgPredicate query(ImdgPredicateBuilder pb, LocalDate date) { - return pb.equals(fieldName, date); - } - - @Override - public String toString() { - return "LocalDate predicate on " + fieldName; - } - }); - } - - public static PreClearMap instanceForInstantField(Imdg map, String fieldName) { - Objects.requireNonNull(map); - Objects.requireNonNull(fieldName); - return new PreClearMap<>(map, new PredicateBuilder() { - @Override - public ImdgPredicate query(ImdgPredicateBuilder pb, LocalDate date) { -// Instant atFrom = TimeUtil.localDateToInstant(date); -// Instant atTill = TimeUtil.localDateToInstant(date.plusDays(1)); - Instant atFrom = TimeUtil.localDateToInstant(date).truncatedTo(ChronoUnit.DAYS); - Instant atTill = TimeUtil.localDateToInstant(date.plusDays(1)).plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS); - return pb.and(pb.greatEqual(fieldName, atFrom), pb.less(fieldName, atTill)); - } - - @Override - public String toString() { - return "Instant predicate on " + fieldName; - } - }); - } - - public interface PredicateBuilder { - ImdgPredicate query(ImdgPredicateBuilder pb, LocalDate onDate); - } - - @Override - public String toString() { - return "PreClearMap{map=" + map.getMapName() + ", predicateBuilder=" + predicateBuilder + "}"; - } -} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/validation/RegistryError.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/validation/RegistryError.java index 12ed310d2..de571d893 100644 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/validation/RegistryError.java +++ b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/validation/RegistryError.java @@ -1,18 +1,18 @@ -package ru.spcex.clearing.registry.validation; - -import ru.spcex.platform.utils.enumeration.IErrorEnumId; - -public enum RegistryError implements IErrorEnumId { - ValidationOfFieldValuesMapError(19000L); - - private final Long id; - - RegistryError(Long id) { - this.id = id; - } - - @Override - public Long getId() { - return id; - } -} +package ru.spcex.clearing.registry.validation; + +import ru.spcex.platform.utils.enumeration.IErrorEnumId; + +public enum RegistryError implements IErrorEnumId { + ValidationOfFieldValuesMapError(19000L); + + private final Long id; + + RegistryError(Long id) { + this.id = id; + } + + @Override + public Long getId() { + return id; + } +} diff --git a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/validation/ValuesOfMapNonNullRule.java b/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/validation/ValuesOfMapNonNullRule.java deleted file mode 100644 index 03746ec36..000000000 --- a/clearing-parent/registry-service/src/main/java/ru/spcex/clearing/registry/validation/ValuesOfMapNonNullRule.java +++ /dev/null @@ -1,26 +0,0 @@ -package ru.spcex.clearing.registry.validation; - -import ru.spcex.platform.imdg.validation.ImdgValidationContext; -import ru.spcex.platform.utils.enumeration.EnumMessage; -import ru.spcex.platform.utils.validation.IValidationRule; - -import java.util.Map; -import java.util.Optional; - -/** - * Проверка наличия компании с переданными в запросе companySymbol и companySymbolCode (реквизиты) - */ -public class ValuesOfMapNonNullRule implements IValidationRule>> { - @Override - public Optional validate(ImdgValidationContext> context) { - Map map = context.getValidatedObject(); - for (Map.Entry entry : map.entrySet()) { - String key = entry.getKey(); - Object value = entry.getValue(); - if (value == null) { - return of(RegistryError.ValidationOfFieldValuesMapError, key); - } - } - return empty(); - } -} diff --git a/clearing-parent/registry-service/src/main/resources/application.properties b/clearing-parent/registry-service/src/main/resources/application.properties index 78d638e78..303cff8ab 100644 --- a/clearing-parent/registry-service/src/main/resources/application.properties +++ b/clearing-parent/registry-service/src/main/resources/application.properties @@ -1,9 +1,22 @@ -spring.main.web-application-type=none +# DB of Clearing -registry-service.hazelcast.cluster-members=127.0.0.1:5701 -registry-service.hazelcast.login=dev -registry-service.hazelcast.password=dev-pass +registry-service.db-clearing.url=jdbc:postgresql://10.200.200.133:5432/clearing_uat +registry-service.db-clearing.driver=org.postgresql.Driver +registry-service.db-clearing.username=clearing +registry-service.db-clearing.password=Aa111111 +registry-service.outFolder=/opt/mfd/clearing/reestr_out/ + +# use SFTP (not implemented): +#registry-service.reports-store.local-temp-dir=./reports_out_temp +#registry-service.reports-store.out-dir=reports +#registry-service.reports-store.user=tester +#registry-service.reports-store.password=password +#registry-service.reports-store.server-ip=10.230.238.53 +#registry-service.reports-store.server-port=2222 +#registry-service.reports-store.delete-after-send=true + +# optional for run as service: registry-service.kafka-consumer.bootstrap-servers=localhost:9092 registry-service.kafka-consumer.group-id=dev-group-registry-service registry-service.kafka-consumer.enable-auto-commit=true @@ -18,12 +31,3 @@ registry-service.kafka-producer.retries=0 registry-service.kafka-producer.batch-size=16384 registry-service.kafka-producer.linger-ms=1 registry-service.kafka-producer.buffer-memory=33554432 - -registry-service.csv-mode=true -registry-service.reports-store.local-temp-dir=./reports_out_temp -registry-service.reports-store.out-dir=reports -registry-service.reports-store.user=tester -registry-service.reports-store.password=password -registry-service.reports-store.server-ip=10.230.238.53 -registry-service.reports-store.server-port=2222 -registry-service.reports-store.delete-after-send=true \ No newline at end of file diff --git a/clearing-parent/registry-service/src/main/resources/dev.properties b/clearing-parent/registry-service/src/main/resources/dev.properties new file mode 100644 index 000000000..23b5ae628 --- /dev/null +++ b/clearing-parent/registry-service/src/main/resources/dev.properties @@ -0,0 +1,4 @@ +registry-service.dev.c3p0-initial-pool-size=6 +registry-service.dev.c3p0-min-pool-size=1 +registry-service.dev.c3p0-max-pool-size=12 +registry-service.dev.c3p0-acquire-increment=5 \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/HazelcastServiceTestConfiguration.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/HazelcastServiceTestConfiguration.java deleted file mode 100644 index ef4458f82..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/HazelcastServiceTestConfiguration.java +++ /dev/null @@ -1,71 +0,0 @@ -package ru.spcex.clearing.registry.config; - -import com.hazelcast.config.*; -import com.hazelcast.core.Hazelcast; -import com.hazelcast.core.HazelcastInstance; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; -import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; -import ru.spcex.platform.imdg.iml.hazelcast.util.HazelcastHelper; - -import java.util.List; -import java.util.Random; -import java.util.concurrent.atomic.AtomicLong; - -@Configuration -public class HazelcastServiceTestConfiguration { - - public static final AtomicLong currentID = new AtomicLong(0L); - private HazelcastInstance hazelcastInstance; - - private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) { - ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); - if (maxPoolSz > 2) { - pool.setKeepAliveSeconds(60); - pool.setAllowCoreThreadTimeOut(true); - } - pool.setCorePoolSize(maxPoolSz); - pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion); - return pool; - } - - @Bean(name = "hazelcastServiceTest") - public HazelcastService hazelcastService(@Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, HazelcastClientParams params) { - Config cfg = new Config(); - cfg.setInstanceName("localhost"); - - NetworkConfig networkConfig = new NetworkConfig(); - JoinConfig joinConfig = new JoinConfig(); - joinConfig.setMulticastConfig(new MulticastConfig().setEnabled(false)); - joinConfig.setTcpIpConfig(new TcpIpConfig().setEnabled(true).setMembers(List.of("127.0.0.1"))); - networkConfig.setJoin(joinConfig); - cfg.setNetworkConfig(networkConfig); - hazelcastInstance = Hazelcast.getOrCreateHazelcastInstance(cfg); - HazelcastHelper.imdgSystem_setStorageState(true, hazelcastInstance); - return new HazelcastService(taskExecutorHazelcastClientInitializer, taskExecutorIdGeneratorAwaiter, params); - } - - @Bean(name = "taskExecutorHazelcastClientInitializer") - public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() { - return createThreadPoolTaskExecutor(1, true); - } - - @Bean(name = "taskExecutorIdGeneratorAwaiter") - public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() { - return createThreadPoolTaskExecutor(1, false); - } - - @Bean(name = "hazelcastClientParams") - public HazelcastClientParams getHazelcastClientParams() { - HazelcastClientParams params = new HazelcastClientParams(); - params.setLogin("dev"); - params.setPassword("dev-pass"); - params.setClusterMembers("127.0.0.1"); - params.setInstanceName("hzTestClient" + new Random().nextInt()); - params.setNearCacheConfig(new NearCacheConfig()); - return params; - } -} diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/SFTPTestConfig.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/SFTPTestConfig.java index 3eb5e0288..3274dab37 100644 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/SFTPTestConfig.java +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/SFTPTestConfig.java @@ -3,6 +3,7 @@ package ru.spcex.clearing.registry.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.integration.sftp.session.SftpFileInfo; +import ru.spcex.clearing.registry.conf.SFTPReportsConfig; import java.io.File; import java.util.ArrayList; diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/TestConfig.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/TestConfig.java index 4835acd19..49995252f 100644 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/TestConfig.java +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/config/TestConfig.java @@ -4,8 +4,10 @@ import org.mockito.Mockito; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.integration.sftp.session.SftpFileInfo; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.registry.config.settings.ReportsStore; +import ru.spcex.clearing.registry.conf.CmdArgsParser; +import ru.spcex.clearing.registry.conf.SFTPReportsConfig; +import ru.spcex.clearing.registry.conf.properties.AProperties; +import ru.spcex.clearing.registry.conf.properties.ReportsStore; import java.io.File; import java.nio.charset.Charset; @@ -16,12 +18,13 @@ import java.util.List; @Configuration public class TestConfig { @Bean - public RegistryServiceSettings testSettings() { - RegistryServiceSettings registryServiceSettings = new RegistryServiceSettings(); + public AProperties testSettings() { + AProperties registryServiceSettings = new AProperties(Mockito.mock(CmdArgsParser.class)); ReportsStore store = new ReportsStore(); - store.setLocalTempDir("out"); + //store.setLocalTempDir("out"); + registryServiceSettings.setOutFolder("out"); registryServiceSettings.setReportsStore(store); - registryServiceSettings.setCsvMode(true); + //registryServiceSettings.setCsvMode(true); return registryServiceSettings; } diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterServiceTest.java deleted file mode 100644 index 679d151c7..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/AdmittedLiabilitiesRegisterServiceTest.java +++ /dev/null @@ -1,129 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.register.AdmittedLiabilitiesRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import javax.annotation.PostConstruct; -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - AdmittedLiabilitiesRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, -}) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class AdmittedLiabilitiesRegisterServiceTest { - //consts - - private static int requestCount = 0; - private static final String securitySymbol = "SYMBOL"; - private static final Long companyId = 1L; - private static final String clearingCode = "CODE"; - private static final String account = "ACCOUNT"; - private static final BigDecimal balance = new BigDecimal(1); - private static final LocalDate clearingDate = LocalDate.now(); - private static final String COMPANY_FULL_NAME = "ROGA"; - private Long REGISTRY_SPY_ID; - private final Long sessionId = 0L; - private Imdg registryMap; - private Imdg companyMap; - private Imdg admittedLiabilitiesRegisterMap; - @Autowired - private AdmittedLiabilitiesRegisterService admittedLiabilitiesRegisterService; - - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @PostConstruct - private void init() { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - //initializing of imdg - companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - admittedLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_AdmittedLiabilitiesRegister, AdmittedLiabilitiesRegister.class); - // initialing objects for imdg repos - - Long securityId = 1L; - Registry registry = new Registry(); - registry.setRegistryDesignation(RegistryDesignation.O.getKey()); - registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); - registry.setRegistryUnit(RegistryUnit.T.getKey()); - registry.setRegistryStatus(RegistryStatus.OK.getKey()); - registry.setSecurityId(securityId); - registry.setSessionId(sessionId); - registry.setSecuritySymbol(securitySymbol); - registry.setCompanyId(companyId); - registry.setClearingCode(clearingCode); - registry.setAccount(account); - registry.setBalance(balance); - registry.setClearingDate(clearingDate); - REGISTRY_SPY_ID = registryMap.insert(registry); - - Company company = new Company(); - company.setId(1L); - company.setFullName(COMPANY_FULL_NAME); - companyMap.insert(company); - } - - @Test - @Order(1) - void executionRegisterNewForClearingDate() { - - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) admittedLiabilitiesRegisterService.getConsumer(), - Task.createRegistry_ADLR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = admittedLiabilitiesRegisterMap.getAllValues(); - AdmittedLiabilitiesRegister admittedLiabilitiesRegister = allValues.iterator().next(); - assertEquals(companyId, admittedLiabilitiesRegister.getCompanyId()); - assertEquals(clearingCode, admittedLiabilitiesRegister.getClearingCode()); - assertEquals(account, admittedLiabilitiesRegister.getAccount()); - assertEquals(balance, admittedLiabilitiesRegister.getAmount()); - assertEquals(clearingDate, admittedLiabilitiesRegister.getClearingDate()); - assertEquals(COMPANY_FULL_NAME, admittedLiabilitiesRegister.getCompanyFullName()); - } - -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterServiceTest.java deleted file mode 100644 index d6484bfeb..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/CoveredLiabilitiesRegisterServiceTest.java +++ /dev/null @@ -1,127 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.register.CoveredLiabilitiesRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import javax.annotation.PostConstruct; -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - CoveredLiabilitiesRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, -}) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class CoveredLiabilitiesRegisterServiceTest { - private static int requestCount = 0; - private static final String securitySymbol = "SYMBOL"; - private static final Long companyId = 1L; - private static final String clearingCode = "CODE"; - private static final String account = "ACCOUNT"; - private static final BigDecimal balance = new BigDecimal(1); - private static final LocalDate clearingDate = LocalDate.now(); - private static final String COMPANY_FULL_NAME = "ROGA"; - private Imdg coveredLiabilitiesRegisterMap; - private Imdg registryMap; - private Imdg companyMap; - private Long REGISTRY_SPY_ID; - private final Long sessionId = 0L; - - @Autowired - private CoveredLiabilitiesRegisterService coveredLiabilitiesRegisterService; - - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @PostConstruct - private void init() { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - //initializing of imdg - companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - coveredLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CoveredLiabilitiesRegister, CoveredLiabilitiesRegister.class); - // initialing objects for imdg repos - - Long securityId = 1L; - Registry registry = new Registry(); - registry.setRegistryDesignation(RegistryDesignation.O.getKey()); - registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); - registry.setRegistryUnit(RegistryUnit.T.getKey()); - registry.setRegistryStatus(RegistryStatus.OK.getKey()); - registry.setSecurityId(securityId); - registry.setSessionId(sessionId); - registry.setSecuritySymbol(securitySymbol); - registry.setCompanyId(companyId); - registry.setClearingCode(clearingCode); - registry.setAccount(account); - registry.setBalance(balance); - registry.setClearingDate(clearingDate); - REGISTRY_SPY_ID = registryMap.insert(registry); - - Company company = new Company(); - company.setId(1L); - company.setFullName(COMPANY_FULL_NAME); - companyMap.insert(company); - } - - @Test - @Order(1) - void executionRegisterNewForClearingDate() { - - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) coveredLiabilitiesRegisterService.getConsumer(), - Task.createRegistry_CDLR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = coveredLiabilitiesRegisterMap.getAllValues(); - CoveredLiabilitiesRegister coveredLiabilitiesRegister = allValues.iterator().next(); - assertEquals(companyId, coveredLiabilitiesRegister.getCompanyId()); - assertEquals(clearingCode, coveredLiabilitiesRegister.getClearingCode()); - assertEquals(account, coveredLiabilitiesRegister.getAccount()); - assertEquals(balance, coveredLiabilitiesRegister.getAmount()); - assertEquals(clearingDate, coveredLiabilitiesRegister.getClearingDate()); - assertEquals(COMPANY_FULL_NAME, coveredLiabilitiesRegister.getCompanyFullName()); - } -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterServiceTest.java deleted file mode 100644 index 25f8778db..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/DepoBalanceRegisterServiceTest.java +++ /dev/null @@ -1,171 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import com.opencsv.exceptions.CsvValidationException; -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.register.DepoBalanceRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.registry.RegistryHistory; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.SFTPTestConfig; -import ru.spcex.clearing.registry.config.TestConfig; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.io.IOException; -import java.math.BigDecimal; -import java.time.Instant; -import java.util.Arrays; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.assertEquals; - - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - DepoBalanceRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, - TestConfig.class, - SFTPTestConfig.class, -}) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class DepoBalanceRegisterServiceTest implements InitializingBean { - private static int requestCount = 0; - - private static final Long companyId = 1L; - private static final Long sessionId = 1L; - private static final String account = "ACCOUNT"; - private static final BigDecimal balance = new BigDecimal(1); - private static final String SECURITY_SYMBOL= "SECURITY_SYMBOL"; - - private Imdg depoBalanceRegisterMap; - private Imdg registryHistoryMap; - - @Autowired - private DepoBalanceRegisterService depoBalanceRegisterService; - - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @Autowired - private RegistryServiceSettings settings; - - @Autowired - @Qualifier("reportOutDir") - private File outFolder; - - - @Override - public void afterPropertiesSet() throws Exception { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - //initializing of imdg - registryHistoryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryHistory, RegistryHistory.class); - depoBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoBalanceRegister, DepoBalanceRegister.class); - // initialing objects for imdg repos - } - - private RegistryHistory init() { - Registry registry = new Registry(); - registry.setRegistryDesignation(RegistryDesignation.A.getKey()); - registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); - registry.setRegistryUnit(RegistryUnit.T.getKey()); - registry.setDiffBalance(BigDecimal.ZERO); - registry.setTradingClearingRegistry("not null value"); - registry.setCompanyId(companyId); - registry.setAccountType(AccountType.Depo.getKey()); - registry.setAccount(account); - registry.setBalance(balance); - registry.setSecuritySymbol(SECURITY_SYMBOL); - RegistryHistory registryHistory = new RegistryHistory(); - registryHistory.setObject(registry); - registryHistory.setEventTime(Instant.now()); - registryHistoryMap.insert(registryHistory); - return registryHistory; - } - - @Test - @Order(1) - void executionRegisterNewForEventTime() { - RegistryHistory source = init(); - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(false); - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) depoBalanceRegisterService.getConsumer(), - Task.createRegistry_GRRT.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = depoBalanceRegisterMap.getAllValues(); - DepoBalanceRegister depoBalanceRegister = allValues.iterator().next(); - assertEquals(companyId, depoBalanceRegister.getCompanyId()); - assertEquals(account, depoBalanceRegister.getDepoCode()); - assertEquals(balance, depoBalanceRegister.getQuantity()); - assertEquals(SECURITY_SYMBOL, depoBalanceRegister.getSecuritySymbol()); - settings.setCsvMode(oldCsvMode); - registryHistoryMap.delete(source); - } - -// @Test - @Order(2) - void executionRegisterNewForEventTime_Csv() throws CsvValidationException, IOException { - RegistryHistory source = init(); - ReportTestUtils.resetDir(outFolder); - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(true); - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) depoBalanceRegisterService.getConsumer(), - Task.createRegistry_GRRT.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports/depo_balance_register_expected.csv").getFile()); - ReportTestUtils.compareCSVFiles(expectedFile, outFile, Arrays.asList("Дата", "Время", "Номер отчета")); - - settings.setCsvMode(oldCsvMode); - ReportTestUtils.deleteDir(outFolder); - registryHistoryMap.delete(source); - } - -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterServiceTest.java deleted file mode 100644 index 687060b70..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/DepoPaymentInstructionRegisterServiceTest.java +++ /dev/null @@ -1,195 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import com.opencsv.exceptions.CsvValidationException; -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.payment.PaymentInstruction; -import ru.clearing.classes.statics.data.register.DepoPaymentInstructionRegister; -import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; -import ru.clearing.platform.dictionary.InOutDirectionDictionary; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.SFTPTestConfig; -import ru.spcex.clearing.registry.config.TestConfig; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.Task; -import ru.spcex.platform.enumeration.TransactionStatus; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.io.IOException; -import java.math.BigDecimal; -import java.time.LocalDate; -import java.util.Arrays; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - DepoPaymentInstructionRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, - TestConfig.class, - SFTPTestConfig.class, -}) -class DepoPaymentInstructionRegisterServiceTest implements InitializingBean { - private Imdg depoPaymentInstructionRegisterMap; - private Imdg paymentInstructionMap; - private Imdg sessionMap; - private Imdg tradingClearingRegistryMap; - private Imdg inOutDirectionDictionaryMap; - private Imdg accountMap; - - private static int requestCount = 0; - private static final Long SESSION_ID = 1L; - private static final String SESSION_SECTION = "FOND"; - private static final Long TRADING_CLEARING_REGISTRY_DEPO_ACCOUNT_ID = 100L; - private static final Long TRADING_CLEARING_REGISTRY_COMPANY_ID = 101L; - private static final String TRADING_CLEARING_REGISTRY_TYPE = "TYPE"; - private static final String TRADING_CLEARING_REGISTRY_CODE = "CODE"; - private static final String SET_CREDIT_LEG_DIRECTION = "PAYMENT_INSTRUCTION_CREDIT_LEG"; - private static final BigDecimal SET_CREDIT_LEG_AMOUNT = new BigDecimal(1); - private static final Long IN_OUT_DIRECTION_DICTIONARY_ID = 123L; - @Autowired - private DepoPaymentInstructionRegisterService depoPaymentInstructionRegisterService; - - @Autowired - private RegistryServiceSettings settings; - - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @Autowired - @Qualifier("reportOutDir") - private File outFolder; - - @Override - public void afterPropertiesSet() throws Exception { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - //initializing of imdg - depoPaymentInstructionRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoPaymentInstructionRegister, DepoPaymentInstructionRegister.class); - paymentInstructionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); - sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - tradingClearingRegistryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); - inOutDirectionDictionaryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_InOutDirectionDictionary, InOutDirectionDictionary.class); - accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); - // initialing objects for imdg repos - - Session session = new Session(); - session.setSection(SESSION_SECTION); - session.setId(SESSION_ID); - sessionMap.update(session); - - PaymentInstruction paymentInstruction = new PaymentInstruction(); - paymentInstruction.setSessionId(SESSION_ID); - paymentInstruction.setClearingDate(LocalDate.now()); - paymentInstruction.setCreditLeg_accountId(TRADING_CLEARING_REGISTRY_DEPO_ACCOUNT_ID); - paymentInstruction.setSenderId(TRADING_CLEARING_REGISTRY_COMPANY_ID); - paymentInstruction.setCreditLeg_direction(SET_CREDIT_LEG_DIRECTION); - paymentInstruction.setCreditLeg_amount(SET_CREDIT_LEG_AMOUNT); - paymentInstruction.setTransactionStatus(TransactionStatus.sent.getKey()); - paymentInstructionMap.insert(paymentInstruction); - - - TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry(); - tradingClearingRegistry.setCompanyId(TRADING_CLEARING_REGISTRY_COMPANY_ID); - tradingClearingRegistry.setDepoAccountId(TRADING_CLEARING_REGISTRY_DEPO_ACCOUNT_ID); - tradingClearingRegistry.setTradingClearingRegistryType(TRADING_CLEARING_REGISTRY_TYPE); - tradingClearingRegistry.setCode(TRADING_CLEARING_REGISTRY_CODE); - tradingClearingRegistryMap.insert(tradingClearingRegistry); - - InOutDirectionDictionary inOutDirectionDictionary = new InOutDirectionDictionary(); - inOutDirectionDictionary.setCode(SET_CREDIT_LEG_DIRECTION); - inOutDirectionDictionary.setId(IN_OUT_DIRECTION_DICTIONARY_ID); - inOutDirectionDictionaryMap.update(inOutDirectionDictionary); - - Account account = new Account(); - account.setId(TRADING_CLEARING_REGISTRY_DEPO_ACCOUNT_ID); - account.setAccountType(AccountType.Depo.getKey()); - accountMap.update(account); - } - - @Test - @Order(1) - void executionRegisterNewForClearingDate() { - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(false); - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) depoPaymentInstructionRegisterService.getConsumer(), - Task.createRegistry_GORD.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = depoPaymentInstructionRegisterMap.getAllValues(); - DepoPaymentInstructionRegister depoPaymentInstructionRegister = allValues.iterator().next(); - assertEquals(SESSION_ID, depoPaymentInstructionRegister.getSessionId()); - assertEquals(TRADING_CLEARING_REGISTRY_COMPANY_ID, depoPaymentInstructionRegister.getCompanyId()); - assertEquals(TRADING_CLEARING_REGISTRY_TYPE, depoPaymentInstructionRegister.getTradingClearingRegistryType()); - assertEquals(TRADING_CLEARING_REGISTRY_CODE, depoPaymentInstructionRegister.getTradingClearingRegistry()); - assertEquals(IN_OUT_DIRECTION_DICTIONARY_ID, depoPaymentInstructionRegister.getDirection()); - assertEquals(SET_CREDIT_LEG_AMOUNT, depoPaymentInstructionRegister.getQuantity()); - - settings.setCsvMode(oldCsvMode); - } - -// @Test - @Order(2) - void executionRegisterNewForClearingDate_CSV() throws CsvValidationException, IOException { - ReportTestUtils.resetDir(outFolder); - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(true); - - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) depoPaymentInstructionRegisterService.getConsumer(), - Task.createRegistry_GORD.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports/depo_payment_instruction_register_expected.csv").getFile()); - ReportTestUtils.compareCSVFiles(expectedFile, outFile, Arrays.asList("Время формирования", "Дата распоряжения", "Номер распоряжения")); - - settings.setCsvMode(oldCsvMode); - - ReportTestUtils.deleteDir(outFolder); - } -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterServiceTest.java deleted file mode 100644 index 735ac3811..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExcludeLiabilitiesRegisterServiceTest.java +++ /dev/null @@ -1,143 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.time.TimeUtil; - -import javax.annotation.PostConstruct; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - ExcludeLiabilitiesRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, -}) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class ExcludeLiabilitiesRegisterServiceTest { - private static int requestCount = 0; - - @Autowired - private ExcludeLiabilitiesRegisterService excludeLiabilitiesRegisterService; - private Imdg excludeLiabilitiesRegisterMap; - private Imdg registryMap; - private Imdg sessionMap; - private Imdg companySymbolMap; - - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @PostConstruct - private void init() { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - excludeLiabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_ExcludeLiabilitiesRegister, ExcludeLiabilitiesRegister.class); - registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - companySymbolMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, ru.clearing.classes.statics.data.company.CompanySymbols.class); - } - - private static final Long SESSION_ID = 10L; - private static final Long SECURITY_ID = 101L; - private static final Long REGISTRY_COMPANY_ID = 10L; - private static final String REGISTRY_COMPANY_FULL_NAME = "full_nome"; - private static final String REGISTRY_CODE = "full_nome"; - private static final String REGISTRY_ACCOUNT = "full_nome"; - private static final String REGISTRY_STATUS = RegistryStatus.FAIL.getKey(); - private static final BigDecimal REGISTRY_BALANCE = new BigDecimal(1); - private static final LocalDate SESSION_CLEARING_DATE = LocalDate.now(); - private static final LocalDate REGISTRY_SETTLEMENT_DATE = LocalDate.now(); - private static final Instant SESSION_UPDATED = Instant.now(); - private static final String COMPANY_SYMBOL_VALUE = "COMPANY_SYMBOL_VALUE"; - @Test - @Order(1) - void executionRegisterNewForClearingDate() { - Registry registry = new Registry(); - registry.setRegistryDesignation(RegistryDesignation.O.getKey()); - registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); - registry.setRegistryUnit(RegistryUnit.T.getKey()); - registry.setRegistryStatus(REGISTRY_STATUS); - registry.setSessionId(SESSION_ID); - registry.setCompanyId(REGISTRY_COMPANY_ID); - registry.setFullName(REGISTRY_COMPANY_FULL_NAME); - registry.setRegistryCode(REGISTRY_CODE); - registry.setAccount(REGISTRY_ACCOUNT); - registry.setBalance(REGISTRY_BALANCE); - registry.setSettlementDate(REGISTRY_SETTLEMENT_DATE); - registry.setSecurityId(SECURITY_ID); - registryMap.insert(registry); - - Session session = new Session(); - session.setId(SESSION_ID); - session.setClearingDate(SESSION_CLEARING_DATE); - session.setUpdated(SESSION_UPDATED); - sessionMap.update(session); - CompanySymbols companySymbols = new CompanySymbols(); - companySymbols.setCompanyId(REGISTRY_COMPANY_ID); - companySymbols.setCompanySymbol(CompanySymbol.INN.getKey()); - companySymbols.setCompanySymbolValue(COMPANY_SYMBOL_VALUE); - companySymbolMap.insert(companySymbols); - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) excludeLiabilitiesRegisterService.getConsumer(), - Task.createRegistry_EXLR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = excludeLiabilitiesRegisterMap.getAllValues(); - ExcludeLiabilitiesRegister excludeLiabilitiesRegister = allValues.iterator().next(); - assertEquals(SESSION_ID, excludeLiabilitiesRegister.getSessionId()); - assertEquals(REGISTRY_COMPANY_ID, excludeLiabilitiesRegister.getCompanyId()); - assertEquals(REGISTRY_COMPANY_FULL_NAME, excludeLiabilitiesRegister.getCompanyFullName()); - assertEquals(REGISTRY_CODE, excludeLiabilitiesRegister.getRegistryCode()); - assertEquals(REGISTRY_ACCOUNT, excludeLiabilitiesRegister.getAccount()); - assertEquals(REGISTRY_STATUS, excludeLiabilitiesRegister.getRegistryStatus()); - assertEquals(REGISTRY_BALANCE, excludeLiabilitiesRegister.getSumLiabilities()); - assertEquals(SESSION_CLEARING_DATE, excludeLiabilitiesRegister.getValidFromDate()); - assertEquals(REGISTRY_SETTLEMENT_DATE, excludeLiabilitiesRegister.getSettlementDate()); - assertEquals(TimeUtil.toLocalDate(SESSION_UPDATED), excludeLiabilitiesRegister.getValidToDate()); - assertEquals(COMPANY_SYMBOL_VALUE, excludeLiabilitiesRegister.getInn()); - - } - -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExecutionRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExecutionRegisterServiceTest.java deleted file mode 100644 index 455ea076f..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ExecutionRegisterServiceTest.java +++ /dev/null @@ -1,332 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import com.opencsv.exceptions.CsvValidationException; -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.execution.ExecutionDeposit; -import ru.clearing.classes.statics.data.execution.ExecutionFond; -import ru.clearing.classes.statics.data.register.ExecutionRegister; -import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.SFTPTestConfig; -import ru.spcex.clearing.registry.config.TestConfig; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.CompanySymbol; -import ru.spcex.platform.enumeration.MoneyFlowSide; -import ru.spcex.platform.enumeration.Side; -import ru.spcex.platform.enumeration.Task; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.io.IOException; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.time.ZoneOffset; -import java.util.Collection; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - ExecutionRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, - TestConfig.class, - SFTPTestConfig.class -}) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class ExecutionRegisterServiceTest implements InitializingBean { - LocalDate TRADING_DATE = LocalDate.of(2020, 1, 1); - Instant EXCHANGE_EXECUTION_TIME = LocalDate.of(2020, 1, 1).atStartOfDay().toInstant(ZoneOffset.UTC); - Long COUNTER_PARTY_ID = 888L; - Long COMPANY_ID = 777L; - Long EXCHANGE_EXECUTION_ID = 777L; - Long SECURITY_ID = 888L; - BigDecimal SETTLEMENT_AMOUNT = BigDecimal.valueOf(777L); - BigDecimal QUANTITY = BigDecimal.valueOf(888L); - - String COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID = "COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID"; - String COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID = "COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID"; - - Long MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID; - Long MONEY_ACCOUNT_FOR_TKR_ID; - Long DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID; - Long DEPO_ACCOUNT_FOR_TKR_ID; - - Long TKR_FOR_COUNTER_PARTY_TKR_ID; - Long TKR_FOR_TKR_ID; - - String MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR = "MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR"; - String MONEY_ACCOUNT_FOR_TKR = "MONEY_ACCOUNT_FOR_TKR"; - String DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR = "DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR"; - String DEPO_ACCOUNT_FOR_TKR = "DEPO_ACCOUNT_FOR_TKR"; - - String COUNTER_PARTY_TKR = "COUNTER_PARTY_TKR"; - String PARTY_TKR = "PARTY_TKR"; - - private static int requestCount = 0; - - private Imdg accountImdg; - private Imdg executionDepositImdg; - private Imdg executionFondImdg; - private Imdg companySymbolsImdg; - private Imdg tradingClearingRegistryImdg; - private Imdg executionRegisterImdg; - - @Autowired - private ExecutionRegisterService executionRegisterService; - - @Autowired - private RegistryServiceSettings settings; - - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @Autowired - @Qualifier("reportOutDir") - private File outFolder; - - - @Override - public void afterPropertiesSet() throws Exception { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class); - executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class); - companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); - tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); - accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); - executionRegisterImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionRegister, ExecutionRegister.class); - - Account moneyAccountForCounterPartyTkr = new Account(); - moneyAccountForCounterPartyTkr.setAccount(MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR); - MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID = accountImdg.insert(moneyAccountForCounterPartyTkr); - - Account moneyAccountForTkr = new Account(); - moneyAccountForTkr.setAccount(MONEY_ACCOUNT_FOR_TKR); - MONEY_ACCOUNT_FOR_TKR_ID = accountImdg.insert(moneyAccountForTkr); - - Account depoAccountForCounterPartyTkr = new Account(); - depoAccountForCounterPartyTkr.setAccount(DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR); - DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID = accountImdg.insert(depoAccountForCounterPartyTkr); - - Account depoAccountForTkr = new Account(); - depoAccountForTkr.setAccount(DEPO_ACCOUNT_FOR_TKR); - DEPO_ACCOUNT_FOR_TKR_ID = accountImdg.insert(depoAccountForTkr); - - TradingClearingRegistry tkrForCounterPartyTkrId = new TradingClearingRegistry(); - tkrForCounterPartyTkrId.setMoneyAccountId(MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID); - tkrForCounterPartyTkrId.setDepoAccountId(DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR_ID); - TKR_FOR_COUNTER_PARTY_TKR_ID = tradingClearingRegistryImdg.insert(tkrForCounterPartyTkrId); - - TradingClearingRegistry tkrForTkrId = new TradingClearingRegistry(); - tkrForTkrId.setMoneyAccountId(MONEY_ACCOUNT_FOR_TKR_ID); - tkrForTkrId.setDepoAccountId(DEPO_ACCOUNT_FOR_TKR_ID); - TKR_FOR_TKR_ID = tradingClearingRegistryImdg.insert(tkrForTkrId); - - CompanySymbols companySymbolsForCompanyId = new CompanySymbols(); - companySymbolsForCompanyId.setCompanyId(COMPANY_ID); - companySymbolsForCompanyId.setCompanySymbol(CompanySymbol.CLRC.getKey()); - companySymbolsForCompanyId.setCompanySymbolValue(COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID); - companySymbolsImdg.insert(companySymbolsForCompanyId); - - CompanySymbols companySymbolsForCounterPartyId = new CompanySymbols(); - companySymbolsForCounterPartyId.setCompanyId(COUNTER_PARTY_ID); - companySymbolsForCounterPartyId.setCompanySymbol(CompanySymbol.CLRC.getKey()); - companySymbolsForCounterPartyId.setCompanySymbolValue(COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID); - companySymbolsImdg.insert(companySymbolsForCounterPartyId); - } - -// @Test - @Order(3) - void executionRegisterNewForClearingDate_CSV() throws IOException, CsvValidationException { - ReportTestUtils.resetDir(outFolder); - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(true); - - ExecutionFond executionFond = new ExecutionFond(); - executionFond.setClearingDate(LocalDate.now()); - executionFond.setTradingDate(TRADING_DATE); - executionFond.setExchangeExecutionId(EXCHANGE_EXECUTION_ID); - executionFond.setExchangeExecutionTime(EXCHANGE_EXECUTION_TIME); - executionFond.setSecurityId(SECURITY_ID); - executionFond.setSettlementAmount(SETTLEMENT_AMOUNT); - executionFond.setQuantity(QUANTITY); - executionFond.setCounterPartyTradingClearingRegistryId(TKR_FOR_COUNTER_PARTY_TKR_ID); - executionFond.setTradingClearingRegistryId(TKR_FOR_TKR_ID); - executionFond.setCompanyId(COMPANY_ID); - executionFond.setCounterPartyId(COUNTER_PARTY_ID); - executionFond.setSide(Side.SELL.getKey()); - executionFond.setCounterPartyTradingClearingRegistry(COUNTER_PARTY_TKR); - executionFond.setPartyTradingClearingRegistry(PARTY_TKR); - executionFondImdg.insert(executionFond); - - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) executionRegisterService.getConsumer(), - Task.createRegistry_ECNR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports/execution_register_expected.csv").getFile()); - ReportTestUtils.compareCSVFiles(expectedFile, outFile, List.of()); - - executionFondImdg.delete(executionFond); - settings.setCsvMode(oldCsvMode); - ReportTestUtils.deleteDir(outFolder); - } - - @Test - @Order(2) - void executionRegisterNewForClearingDate() { - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(false); - - ExecutionFond executionFond = new ExecutionFond(); - executionFond.setClearingDate(LocalDate.now()); - executionFond.setTradingDate(TRADING_DATE); - executionFond.setExchangeExecutionId(EXCHANGE_EXECUTION_ID); - executionFond.setExchangeExecutionTime(EXCHANGE_EXECUTION_TIME); - executionFond.setSecurityId(SECURITY_ID); - executionFond.setSettlementAmount(SETTLEMENT_AMOUNT); - executionFond.setQuantity(QUANTITY); - executionFond.setCounterPartyTradingClearingRegistryId(TKR_FOR_COUNTER_PARTY_TKR_ID); - executionFond.setTradingClearingRegistryId(TKR_FOR_TKR_ID); - executionFond.setCompanyId(COMPANY_ID); - executionFond.setCounterPartyId(COUNTER_PARTY_ID); - executionFond.setSide(Side.SELL.getKey()); - executionFond.setCounterPartyTradingClearingRegistry(COUNTER_PARTY_TKR); - executionFond.setPartyTradingClearingRegistry(PARTY_TKR); - executionFondImdg.insert(executionFond); - - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) executionRegisterService.getConsumer(), - Task.createRegistry_ECNR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - Collection allValues = executionRegisterImdg.getAllValues(); - ExecutionRegister executionRegister = allValues.iterator().next(); - assertEquals(executionRegister.getTradingDate(), TRADING_DATE); - assertEquals(executionRegister.getExchangeExecutionId(), EXCHANGE_EXECUTION_ID); - assertEquals(executionRegister.getExchangeExecutionTime(), EXCHANGE_EXECUTION_TIME); - assertEquals(executionRegister.getSecurityId(), SECURITY_ID); - assertEquals(executionRegister.getSellerId(), COMPANY_ID); - assertEquals(executionRegister.getSellerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID); - assertEquals(executionRegister.getSellerTradingClearingRegister(), PARTY_TKR); - assertEquals(executionRegister.getSellerMoneyAccount(), MONEY_ACCOUNT_FOR_TKR); - assertEquals(executionRegister.getSellerDepoAccount(), DEPO_ACCOUNT_FOR_TKR); - assertEquals(executionRegister.getBuyerId(), COUNTER_PARTY_ID); - assertEquals(executionRegister.getBuyerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID); - assertEquals(executionRegister.getBuyerTradingClearingRegister(), COUNTER_PARTY_TKR); - assertEquals(executionRegister.getBuyerMoneyAccount(), MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR); - assertEquals(executionRegister.getBuyerDepoAccount(), DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR); - assertEquals(executionRegister.getAmount(), SETTLEMENT_AMOUNT); - assertEquals(executionRegister.getQuantity(), QUANTITY); - assertEquals(executionRegister.getClearingDate(), LocalDate.now()); - - executionFondImdg.delete(executionFond); - - settings.setCsvMode(oldCsvMode); - } - - @Test - @Order(1) - void executionRegisterNewFromRequest() { - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(false); - - ExecutionDeposit executionDeposit = new ExecutionDeposit(); - executionDeposit.setClearingDate(LocalDate.now()); - executionDeposit.setTradingDate(TRADING_DATE); - executionDeposit.setExchangeExecutionId(EXCHANGE_EXECUTION_ID); - executionDeposit.setExchangeExecutionTime(EXCHANGE_EXECUTION_TIME); - executionDeposit.setSecurityId(SECURITY_ID); - executionDeposit.setFirstLegAmount(SETTLEMENT_AMOUNT); - executionDeposit.setQuantity(QUANTITY); - executionDeposit.setCounterPartyTradingClearingRegistryId(TKR_FOR_COUNTER_PARTY_TKR_ID); - executionDeposit.setTradingClearingRegistryId(TKR_FOR_TKR_ID); - executionDeposit.setCompanyId(COMPANY_ID); - executionDeposit.setCounterPartyId(COUNTER_PARTY_ID); - executionDeposit.setSide(MoneyFlowSide.SELL.getKey()); - executionDeposit.setCounterPartyTradingClearingRegistry(COUNTER_PARTY_TKR); - executionDeposit.setPartyTradingClearingRegistry(PARTY_TKR); - executionDepositImdg.insert(executionDeposit); - - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) executionRegisterService.getConsumer(), - Task.createRegistry_ECNR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - Collection allValues = executionRegisterImdg.getAllValues(); - ExecutionRegister executionRegister = allValues.iterator().next(); - assertEquals(executionRegister.getTradingDate(), TRADING_DATE); - assertEquals(executionRegister.getExchangeExecutionId(), EXCHANGE_EXECUTION_ID); - assertEquals(executionRegister.getExchangeExecutionTime(), EXCHANGE_EXECUTION_TIME); - assertEquals(executionRegister.getSecurityId(), SECURITY_ID); - assertEquals(executionRegister.getSellerId(), COMPANY_ID); - assertEquals(executionRegister.getSellerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COMPANY_ID); - assertEquals(executionRegister.getSellerTradingClearingRegister(), PARTY_TKR); - assertEquals(executionRegister.getSellerMoneyAccount(), MONEY_ACCOUNT_FOR_TKR); - assertEquals(executionRegister.getSellerDepoAccount(), DEPO_ACCOUNT_FOR_TKR); - assertEquals(executionRegister.getBuyerId(), COUNTER_PARTY_ID); - assertEquals(executionRegister.getBuyerClearingCode(), COMPANY_SYMBOL_VALUE_FOR_COUNTER_PARTY_ID); - assertEquals(executionRegister.getBuyerTradingClearingRegister(), COUNTER_PARTY_TKR); - assertEquals(executionRegister.getBuyerMoneyAccount(), MONEY_ACCOUNT_FOR_COUNTER_PARTY_TKR); - assertEquals(executionRegister.getBuyerDepoAccount(), DEPO_ACCOUNT_FOR_COUNTER_PARTY_TKR); - assertEquals(executionRegister.getAmount(), SETTLEMENT_AMOUNT); - assertNull(executionRegister.getQuantity()); - assertEquals(executionRegister.getClearingDate(), LocalDate.now()); - - executionDepositImdg.delete(executionDeposit); - - settings.setCsvMode(oldCsvMode); - } - -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterServiceTest.java deleted file mode 100644 index 65f73a3b8..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/LiabilitiesRegisterServiceTest.java +++ /dev/null @@ -1,169 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.company.CompanySymbols; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.register.LiabilitiesRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.SFTPReportsConfig; -import ru.spcex.clearing.registry.config.TestConfig; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.time.TimeUtil; - -import javax.annotation.PostConstruct; -import java.io.File; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.util.Collection; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - LiabilitiesRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, - TestConfig.class, -}) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class LiabilitiesRegisterServiceTest { - private static int requestCount = 0; - private static final String REGISTRY_DESIGNATION = RegistryDesignation.O.getKey(); - private static final String REGISTRY_INSTRUMENT_TYPE = RegistryInstrumentType.M.getKey(); - private static final String REGISTRY_UNIT = RegistryUnit.T.getKey(); - private static final String REGISTRY_FULL_NAME = "MY FULLNAME"; - private static final String REGISTRY_CODE = REGISTRY_DESIGNATION + REGISTRY_INSTRUMENT_TYPE + "A" + REGISTRY_UNIT; // OMAT - private static final String REGISTRY_ACCOUNT = "ANY ACCOUNT"; - private static final String REGISTRY_STATUS = RegistryStatus.CLRD.getKey(); - private static final Long REGISTRY_SESSION_ID = 1234L; - private static final String REGISTRY_SESSION_TYPE = SessionType.XDEP.getKey(); - private static final Long REGISTRY_COMPANY_ID = 10101L; - private static final Long REGISTRY_SECURITY_ID = 123411L; - private static final String REGISTRY_CLEARING_CODE = "ANY CL CODE" ; - private static final String REGISTRY_SECURITY_SYMBOL = "MFD1-symbol"; - private static final BigDecimal REGISTRY_BALANCE = new BigDecimal(123411L); - private static final LocalDate REGISTRY_SETTLEMENT_DATE = LocalDate.now(); - private static final LocalDate SESSION_CLEARING_DATE = LocalDate.now(); - private static final Instant SESSION_UPDATE = Instant.now(); - private static final String COMPANY_SYMBOL_INN = CompanySymbol.INN.getKey(); - private static final String COMPANY_SYMBOL_VALUE = "ANY VALUE"; - private static final String REGISTRY_CONTRACT = "ANY CONTRACT VALUE"; - - @Autowired - private LiabilitiesRegisterService liabilitiesRegisterService; - private Imdg liabilitiesRegisterMap; - private Imdg registryMap; - private Imdg sessionMap; - private Imdg companySymbolsMap; - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @Autowired - SFTPReportsConfig.ReportsGateway reportsGateway; // mock TestMockSFTP - - @PostConstruct - private void init() { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - this.liabilitiesRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesRegister, LiabilitiesRegister.class); - this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); - this.sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - this.companySymbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); - } - - @Test - @Order(1) - void executionRegisterNewForClearingDate() { - Registry registry = new Registry(); - registry.setRegistryUnit(REGISTRY_UNIT); - registry.setRegistryInstrumentType(REGISTRY_INSTRUMENT_TYPE); - registry.setRegistryDesignation(REGISTRY_DESIGNATION); - registry.setSessionId(REGISTRY_SESSION_ID); - registry.setCompanyId(REGISTRY_COMPANY_ID); - registry.setFullName(REGISTRY_FULL_NAME); - registry.setRegistryCode(REGISTRY_CODE); - registry.setAccount(REGISTRY_ACCOUNT); - registry.setRegistryStatus(REGISTRY_STATUS); - registry.setBalance(REGISTRY_BALANCE); - registry.setSettlementDate(REGISTRY_SETTLEMENT_DATE); - registry.setSecurityId(REGISTRY_SECURITY_ID); - registry.setSessionType(REGISTRY_SESSION_TYPE); - registry.setClearingCode(REGISTRY_CLEARING_CODE); - registry.setSecuritySymbol(REGISTRY_SECURITY_SYMBOL); - registry.setContract(REGISTRY_CONTRACT); - registryMap.insert(registry); - - Session session = new Session(); - session.setId(REGISTRY_SESSION_ID); - session.setClearingDate(SESSION_CLEARING_DATE); - session.setUpdated(SESSION_UPDATE); - sessionMap.update(session); - - CompanySymbols companySymbols = new CompanySymbols(); - companySymbols.setCompanyId(REGISTRY_COMPANY_ID); - companySymbols.setCompanySymbol(COMPANY_SYMBOL_INN); - companySymbols.setCompanySymbolValue(COMPANY_SYMBOL_VALUE); - companySymbolsMap.insert(companySymbols); - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) liabilitiesRegisterService.getConsumer(), - Task.createRegistry_LBSR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = liabilitiesRegisterMap.getAllValues(); - assertEquals(0, allValues.size()); // пока объекты не создаются, только в csv/xlsx файлы записываются -// LiabilitiesRegister liabilitiesRegister = allValues.iterator().next(); -// assertEquals(REGISTRY_COMPANY_ID, liabilitiesRegister.getCompanyId()); -// assertEquals(REGISTRY_FULL_NAME, liabilitiesRegister.getCompanyFullName()); -// assertEquals(REGISTRY_CODE, liabilitiesRegister.getRegistryCode()); -// assertEquals(REGISTRY_ACCOUNT, liabilitiesRegister.getAccount()); -// assertEquals(REGISTRY_STATUS, liabilitiesRegister.getRegistryStatus()); -// assertEquals(REGISTRY_BALANCE, liabilitiesRegister.getSumLiabilities()); -// assertEquals(REGISTRY_SETTLEMENT_DATE, liabilitiesRegister.getSettlementDate()); -// assertEquals(SESSION_CLEARING_DATE, liabilitiesRegister.getValidFromDate()); -// assertEquals(TimeUtil.toLocalDate(SESSION_UPDATE), liabilitiesRegister.getValidToDate()); -// assertEquals(COMPANY_SYMBOL_VALUE, liabilitiesRegister.getInn()); - - // out file verify: - // out\registry_240131104359228.xlsx - List sendFiles = ((TestConfig.TestMockSFTP) reportsGateway).getSendFiles(); // mock TestMockSFTP - assertEquals(1, sendFiles.size()); - File tempFile = sendFiles.get(0); - assertTrue(tempFile.length() > 1000, "Out file \"" + tempFile + "\" too small: " + tempFile.length()); - tempFile.delete(); - } -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterServiceTest.java deleted file mode 100644 index 6ce6b7457..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyBalanceRegisterServiceTest.java +++ /dev/null @@ -1,192 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import com.opencsv.exceptions.CsvValidationException; -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.register.MoneyBalanceRegister; -import ru.clearing.classes.statics.data.registry.Registry; -import ru.clearing.classes.statics.data.registry.RegistryHistory; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.SFTPTestConfig; -import ru.spcex.clearing.registry.config.TestConfig; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.*; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.io.IOException; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.util.Arrays; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - MoneyBalanceRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, - TestConfig.class, - SFTPTestConfig.class, -}) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class MoneyBalanceRegisterServiceTest implements InitializingBean { - private static final String REGISTRY_DESIGNATION = RegistryDesignation.A.getKey(); - private static final String REGISTRY_INSTRUMENT_TYPE = RegistryInstrumentType.M.getKey(); - private static final String REGISTRY_FULL_NAME = "MY FULLNAME"; - private static final String REGISTRY_CODE = "ANY CODE"; - private static final String REGISTRY_ACCOUNT = "CLRN VALUE"; - private static final String ACCOUNT_ACCOUNT = "ACCOUNT"; - private static final String REGISTRY_ACCOUNT_TYPE = "CLRN"; - private static final String REGISTRY_STATUS = "ANY STATUS"; - private static final Long REGISTRY_SESSION_ID = 1234L; - private static final Long REGISTRY_COMPANY_ID = 10101L; - private static final Long REGISTRY_SECURITY_ID = 123411L; - private static final BigDecimal REGISTRY_BALANCE = new BigDecimal(123411L); - private static final LocalDate REGISTRY_SETTLEMENT_DATE = LocalDate.now(); - private static final String COMPANY_SYMBOL_INN = CompanySymbol.INN.getKey(); - private static final String COMPANY_SYMBOL_VALUE = "ANY VALUE"; - private static final String COMPANY_SHORTNAME = "ANY VALUE"; - private static int requestCount = 0; - @Autowired - private MoneyBalanceRegisterService moneyBalanceRegisterService; - private Imdg moneyBalanceRegisterMap; - private Imdg registryHistoryMap; - private Imdg companyMap; - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @Autowired - private RegistryServiceSettings settings; - - @Autowired - @Qualifier("reportOutDir") - private File outFolder; - - @Override - public void afterPropertiesSet() throws Exception { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - - moneyBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyBalanceRegister, MoneyBalanceRegister.class); - companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - registryHistoryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryHistory, RegistryHistory.class); - - Company company = new Company(); - company.setId(2L); - company.setShortName(COMPANY_SHORTNAME); - companyMap.insert(company); - } - - private RegistryHistory init() { - Registry registry = new Registry(); - registry.setTradingClearingRegistry("not null value"); - registry.setDiffBalance(BigDecimal.ZERO); - registry.setRegistryUnit(RegistryUnit.T.getKey()); - registry.setRegistryInstrumentType(REGISTRY_INSTRUMENT_TYPE); - registry.setRegistryDesignation(REGISTRY_DESIGNATION); - registry.setSessionId(REGISTRY_SESSION_ID); - registry.setCompanyId(REGISTRY_COMPANY_ID); - registry.setFullName(REGISTRY_FULL_NAME); - registry.setRegistryCode(REGISTRY_CODE); - registry.setAccount(REGISTRY_ACCOUNT); - registry.setAccountType(REGISTRY_ACCOUNT_TYPE); - registry.setRegistryStatus(REGISTRY_STATUS); - registry.setBalance(REGISTRY_BALANCE); - registry.setSettlementDate(REGISTRY_SETTLEMENT_DATE); - registry.setSecurityId(REGISTRY_SECURITY_ID); - RegistryHistory registryHistory = new RegistryHistory(); - registryHistory.setObject(registry); - registryHistory.setEventTime(Instant.now()); - registryHistoryMap.insert(registryHistory); - - return registryHistory; - } - - @Test - @Order(1) - void executionRegisterNewForClearingDate() { - RegistryHistory source = init(); - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(false); - - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - launcherCommandRequest.setCompanyId(REGISTRY_COMPANY_ID); - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) moneyBalanceRegisterService.getConsumer(), - Task.createRegistry_GBRR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = moneyBalanceRegisterMap.getAllValues(); - MoneyBalanceRegister moneyBalanceRegister = allValues.iterator().next(); - assertEquals(REGISTRY_COMPANY_ID, moneyBalanceRegister.getCompanyId()); - assertEquals(REGISTRY_BALANCE, moneyBalanceRegister.getRemainderSum()); - assertEquals(REGISTRY_ACCOUNT, moneyBalanceRegister.getAccount()); - assertEquals(COMPANY_SHORTNAME, moneyBalanceRegister.getSetHouseName()); - - settings.setCsvMode(oldCsvMode); - registryHistoryMap.delete(source); - } - - -// @Test - @Order(2) - void executionRegisterNewForClearingDate_CSV() throws CsvValidationException, IOException { - ReportTestUtils.resetDir(outFolder); - RegistryHistory source = init(); - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(true); - - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - launcherCommandRequest.setCompanyId(REGISTRY_COMPANY_ID); - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) moneyBalanceRegisterService.getConsumer(), - Task.createRegistry_GBRR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports/money_balance_register_expected.csv").getFile()); - ReportTestUtils.compareCSVFiles(expectedFile, outFile, Arrays.asList("Дата", "Время", "Номер отчета")); - - settings.setCsvMode(oldCsvMode); - ReportTestUtils.deleteDir(outFolder); - registryHistoryMap.delete(source); - } -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterServiceTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterServiceTest.java deleted file mode 100644 index fbbaa4674..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/MoneyPaymentInstructionRegisterServiceTest.java +++ /dev/null @@ -1,189 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import com.opencsv.exceptions.CsvValidationException; -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.Producer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.clearing.classes.statics.data.account.Account; -import ru.clearing.classes.statics.data.company.Company; -import ru.clearing.classes.statics.data.misc.Session; -import ru.clearing.classes.statics.data.payment.PaymentInstruction; -import ru.clearing.classes.statics.data.register.MoneyPaymentInstructionRegister; -import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; -import ru.spcex.clearing.registry.config.SFTPTestConfig; -import ru.spcex.clearing.registry.config.TestConfig; -import ru.spcex.clearing.registry.config.ValidationConfig; -import ru.spcex.clearing.registry.config.settings.RegistryServiceSettings; -import ru.spcex.clearing.test.TestUtils; -import ru.spcex.clearing.test.config.ImdgTestConfig; -import ru.spcex.clearing.test.config.KafkaTestConfig; -import ru.spcex.platform.enumeration.AccountType; -import ru.spcex.platform.enumeration.Task; -import ru.spcex.platform.enumeration.TransactionStatus; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.File; -import java.io.IOException; -import java.math.BigDecimal; -import java.time.Instant; -import java.time.LocalDate; -import java.util.Arrays; -import java.util.Collection; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = { - ValidationConfig.class, - MoneyPaymentInstructionRegisterService.class, - ImdgTestConfig.class, - KafkaTestConfig.class, - TestConfig.class, - SFTPTestConfig.class, -}) -class MoneyPaymentInstructionRegisterServiceTest implements InitializingBean { - private static int requestCount = 0; - private Imdg moneyPaymentInstructionRegisterMap; - private Imdg paymentInstructionMap; - private Imdg sessionMap; - private Imdg companyMap; - private Imdg accountMap; - - private final String CREDITLEG_ACCOUNT_CONST = "CREDITLEG_ACCOUNT_CONST"; - private final Long CREDITLEG_ACCOUNT_ID_CONST = 101L; - private final BigDecimal CREDITLEG_AMOUNT_CONST = new BigDecimal(1); - private final String CREDITLEG_CURRENCYCODE_CONST = "CREDITLEG_CURRENCYCODE_CONST"; - private final String DEBITLEG_ACCOUNT_CONST = "DEBITLEG_ACCOUNT_CONST"; - private final String COMPANY_SHORT_NAME_SENDER_CONST = "COMPANY_SHORT_NAME_SENDER_CONST"; - private final String COMPANY_SHORT_NAME_ADDRESSEE_CONST = "COMPANY_SHORT_NAME_ADDRESSEE_CONST"; - @Autowired - @Qualifier("hazelcastServiceTest") - private ImdgProvider imdgProvider; - - @Autowired - @Qualifier("mockProducer") - private Producer producer; - - @Autowired - private MoneyPaymentInstructionRegisterService moneyPaymentInstructionRegisterService; - - @Autowired - @Qualifier("reportOutDir") - private File outFolder; - - @Autowired - private RegistryServiceSettings settings; - - @Override - public void afterPropertiesSet() throws Exception { - ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId(); - companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - moneyPaymentInstructionRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyPaymentInstructionRegister, MoneyPaymentInstructionRegister.class); - paymentInstructionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class); - sessionMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); - accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class); - - Long sessionId = 1L; - Long companySenderId = 1L; - Long companyAddresseeId = 2L; - Session sessionMkr = new Session(); - sessionMkr.setSection("MKR"); - sessionMkr.setId(sessionId); - sessionMap.update(sessionMkr); - PaymentInstruction paymentInstruction = new PaymentInstruction(); - paymentInstruction.setSessionId(sessionId); - paymentInstruction.setClearingDate(LocalDate.now()); - paymentInstruction.setCreditLeg_account(CREDITLEG_ACCOUNT_CONST); - paymentInstruction.setCreditLeg_accountId(CREDITLEG_ACCOUNT_ID_CONST); - paymentInstruction.setCreditLeg_amount(CREDITLEG_AMOUNT_CONST); - paymentInstruction.setCreditLeg_currencyCode(CREDITLEG_CURRENCYCODE_CONST); - paymentInstruction.setDebitLeg_account(DEBITLEG_ACCOUNT_CONST); - paymentInstruction.setSenderId(companySenderId); - paymentInstruction.setAddresseeId(companyAddresseeId); - paymentInstruction.setTransactionStatus(TransactionStatus.sent.getKey()); - paymentInstruction.setCreated(Instant.now()); - paymentInstructionMap.insert(paymentInstruction); - Company companySender = new Company(); - companySender.setId(companySenderId); - companySender.setShortName(COMPANY_SHORT_NAME_SENDER_CONST); - companyMap.update(companySender); - Company companyAddressee = new Company(); - companyAddressee.setId(companyAddresseeId); - companyAddressee.setShortName(COMPANY_SHORT_NAME_ADDRESSEE_CONST); - companyMap.update(companyAddressee); - - Account account = new Account(); - account.setId(CREDITLEG_ACCOUNT_ID_CONST); - account.setAccountType(AccountType.Clrn.getKey()); - accountMap.update(account); - } - - - - @Test - @Order(1) - void executionRegisterNewForClearingDate() throws CsvValidationException, IOException { - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(false); - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) moneyPaymentInstructionRegisterService.getConsumer(), - Task.createRegistry_GORR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - //take all values is procceed imdg - Collection allValues = moneyPaymentInstructionRegisterMap.getAllValues(); - MoneyPaymentInstructionRegister moneyPaymentInstructionRegister = allValues.iterator().next(); - assertEquals(CREDITLEG_ACCOUNT_CONST, moneyPaymentInstructionRegister.getCreditLegAccount()); - assertEquals(CREDITLEG_AMOUNT_CONST, moneyPaymentInstructionRegister.getCreditLegAmount()); - assertEquals(CREDITLEG_CURRENCYCODE_CONST, moneyPaymentInstructionRegister.getCreditLegCurrencyCode()); - assertEquals(DEBITLEG_ACCOUNT_CONST, moneyPaymentInstructionRegister.getDebitLegAccount()); - assertEquals(COMPANY_SHORT_NAME_SENDER_CONST, moneyPaymentInstructionRegister.getSender()); - assertEquals(COMPANY_SHORT_NAME_ADDRESSEE_CONST, moneyPaymentInstructionRegister.getAddressee()); - - settings.setCsvMode(oldCsvMode); - } - -// @Test - @Order(2) - void executionRegisterNewForClearingDate_CSV() throws CsvValidationException, IOException { - ReportTestUtils.resetDir(outFolder); - boolean oldCsvMode = settings.isCsvMode(); - settings.setCsvMode(true); - //making launcherCommand - LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest(); - - String jsonString = TestUtils.getJsonStringForSystem(launcherCommandRequest, 0L); - - TestUtils.addRecordToKafka((MockConsumer) moneyPaymentInstructionRegisterService.getConsumer(), - Task.createRegistry_GORR.topic(), - requestCount++, - 0, - jsonString); - - TestUtils.waitingSendAndCheckRecord(0L, producer); - - File outFile = outFolder.listFiles()[0]; - File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports/money_payment_instruction_register_expected.csv").getFile()); - ReportTestUtils.compareCSVFiles(expectedFile, outFile, Arrays.asList("Время формирования", "Дата распоряжения", "Номер распоряжения")); - - settings.setCsvMode(oldCsvMode); - ReportTestUtils.deleteDir(outFolder); - } -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ReportTestUtils.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ReportTestUtils.java deleted file mode 100644 index a0b0c28d6..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ReportTestUtils.java +++ /dev/null @@ -1,106 +0,0 @@ -package ru.spcex.clearing.registry.service; - -import com.opencsv.CSVParser; -import com.opencsv.CSVParserBuilder; -import com.opencsv.CSVReader; -import com.opencsv.CSVReaderBuilder; -import com.opencsv.exceptions.CsvValidationException; -import org.apache.commons.io.FileUtils; -import org.junit.jupiter.api.Assertions; - -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.*; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class ReportTestUtils { - - public static void compareCSVFiles(File expectedFile, File actualFile, List columnsForSkip) throws IOException, CsvValidationException { - if (columnsForSkip == null) columnsForSkip = Collections.emptyList(); - CSVParser csvParser = new CSVParserBuilder().withSeparator(',').withQuoteChar('\"').build(); - CSVReader expectedCSVReader = new CSVReaderBuilder(new FileReader(expectedFile)).withCSVParser(csvParser).build(); - CSVReader actualCSVReader = new CSVReaderBuilder(new FileReader(actualFile)).withCSVParser(csvParser).build(); - - Map expectedValueForColumn = new HashMap<>(); - Map actualValueForColumn = new HashMap<>(); - - String[] expectedHeaders = expectedCSVReader.readNext(); - String[] actualHeaders = actualCSVReader.readNext(); - assertEquals(expectedHeaders.length, actualHeaders.length); - - for (int headerIdx = 0; headerIdx < expectedHeaders.length; headerIdx++) { - String expectedHeader = expectedHeaders[headerIdx]; - String actualHeader = actualHeaders[headerIdx]; - if (!columnsForSkip.contains(expectedHeader)) expectedValueForColumn.put(expectedHeader, headerIdx); - if (!columnsForSkip.contains(actualHeader)) actualValueForColumn.put(actualHeader, headerIdx); - } - - List expectedLines = new ArrayList<>(); - do { - String[] expectedLine = expectedCSVReader.readNext(); - if (expectedLine == null) break; - expectedLines.add(expectedLine); - } while (true); - - List actualLines = new ArrayList<>(); - do { - String[] actualLine = actualCSVReader.readNext(); - if (actualLine == null) break; - actualLines.add(actualLine); - } while (true); - if (expectedLines.size() != actualLines.size()) { - Assertions.fail("expected and actual lines not equal"); - } - - for (String[] actualLine : actualLines) { - boolean findEqual = false; - for (String[] expectedLine : expectedLines) { - boolean lineEqual = true; - for (String expectedHeader : expectedValueForColumn.keySet()) { - int expectedIdx = expectedValueForColumn.get(expectedHeader); - int actualIdx = actualValueForColumn.get(expectedHeader); - String expected = expectedLine[expectedIdx]; - String actual = actualLine[actualIdx]; - lineEqual = expected.equals(actual); - if (!lineEqual) break; - } - if (lineEqual) { - findEqual = true; - break; - } - } - if (findEqual) continue; - Assertions.fail("For actual line '%s' not found expected line".formatted(String.join(", ", actualLine))); - } - - List errors = new ArrayList<>(); - for (int idx = 0; idx < expectedHeaders.length; idx++) { - if (!Objects.equals(expectedHeaders[idx], actualHeaders[idx])) { - errors.add("expected header (%s) for idx = %d not equal actual header (%s)".formatted( - expectedHeaders[idx], - idx, - actualHeaders[idx]) - ); - } - } - if (!errors.isEmpty()) { - Assertions.fail("Files equal, but header sequence broken, cause: %s".formatted(String.join(",", errors))); - } - - expectedCSVReader.close(); - actualCSVReader.close(); - } - - public static void resetDir(File folder) throws IOException { - FileUtils.deleteDirectory(folder); - folder = new File("out"); - folder.mkdirs(); - } - - public static void deleteDir(File folder) throws IOException { - FileUtils.deleteDirectory(folder); - } - -} diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/util/PreClearMapTest.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/util/PreClearMapTest.java deleted file mode 100644 index e6b8a8add..000000000 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/util/PreClearMapTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package ru.spcex.clearing.registry.util; - -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; -import ru.clearing.classes.objects.BusinessObject; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; -import ru.spcex.platform.imdg.iml.hazelcast.adapter.predicate.ImdgPredicateBuilderHazelcast; -import ru.spcex.platform.utils.time.TimeUtil; - -import java.time.LocalDate; - -import static org.junit.jupiter.api.Assertions.*; - -class PreClearMapTest { - - @Test - void instanceForLocalDateField() { - LocalDate dt = LocalDate.of(2023, 9, 29); - Imdg map = Mockito.mock(Imdg.class); - Mockito.when(map.getMapName()).thenReturn("Map_Test"); - ImdgPredicateBuilder pb = new ImdgPredicateBuilderHazelcast(); - Mockito.when(map.predicateBuilder()).thenReturn(pb); - - PreClearMap pcm = PreClearMap.instanceForLocalDateField(map, "dateField"); - assertEquals("PreClearMap{map=Map_Test, predicateBuilder=LocalDate predicate on dateField}", pcm.toString()); - - ImdgPredicate predicate = pcm.predicateBuilder.query(pb, dt); - assertEquals("dateField=2023-09-29", predicate.toString()); - } - - @Test - void instanceForInstantField() { - LocalDate dt = LocalDate.of(2023, 9, 29); - Imdg map = Mockito.mock(Imdg.class); - Mockito.when(map.getMapName()).thenReturn("Map_Test"); - ImdgPredicateBuilder pb = new ImdgPredicateBuilderHazelcast(); - Mockito.when(map.predicateBuilder()).thenReturn(pb); - - PreClearMap pcm = PreClearMap.instanceForInstantField(map, "dateField"); - assertEquals("PreClearMap{map=Map_Test, predicateBuilder=Instant predicate on dateField}", pcm.toString()); - - ImdgPredicate predicate = pcm.predicateBuilder.query(pb, dt); - assertEquals("(dateField>=2023-09-28T00:00:00Z AND dateField<2023-09-30T00:00:00Z)", predicate.toString()); -// String expectedQuery = "(dateField>=" + TimeUtil.localDateToInstant(dt) + " AND dateField<" + TimeUtil.localDateToInstant(dt.plusDays(1)) + ")"; -// assertEquals("(dateField>=2023-09-28T21:00:00Z AND dateField<2023-09-29T21:00:00Z)", predicate.toString()); -// assertEquals(expectedQuery, predicate.toString()); - } -} \ No newline at end of file diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/MatcherFactory.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/MatcherFactory.java index bd87052c0..28d93b4ad 100644 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/MatcherFactory.java +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/MatcherFactory.java @@ -1,38 +1,38 @@ -package ru.spcex.clearing.registry.utils; - -import java.util.Arrays; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Factory for creating test matchers. - *

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

+ * Comparing actual and expected objects via AssertJ + */ +public class MatcherFactory { + + public static Matcher usingIgnoringFieldsComparator(String... fieldsToIgnore) { + return new Matcher<>(fieldsToIgnore); + } + + public static class Matcher { + private final String[] fieldsToIgnore; + + private Matcher(String... fieldsToIgnore) { + this.fieldsToIgnore = fieldsToIgnore; + } + + public void assertMatch(T actual, T expected) { + assertThat(actual).usingRecursiveComparison().ignoringFields(fieldsToIgnore).isEqualTo(expected); + } + + @SafeVarargs + public final void assertMatch(Iterable actual, T... expected) { + assertMatch(actual, Arrays.asList(expected)); + } + + public void assertMatch(Iterable actual, Iterable expected) { + assertThat(actual).usingRecursiveFieldByFieldElementComparatorIgnoringFields(fieldsToIgnore).isEqualTo(expected); + } + } +} diff --git a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/TestUtils.java b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/TestUtils.java index 4795327bb..83348dc99 100644 --- a/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/TestUtils.java +++ b/clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/utils/TestUtils.java @@ -1,128 +1,128 @@ -package ru.spcex.clearing.registry.utils; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.kafka.clients.consumer.ConsumerRecord; -import org.apache.kafka.clients.consumer.MockConsumer; -import org.apache.kafka.clients.producer.MockProducer; -import org.apache.kafka.clients.producer.Producer; -import org.apache.kafka.clients.producer.ProducerRecord; -import org.apache.kafka.clients.producer.RecordMetadata; -import org.apache.kafka.common.TopicPartition; -import org.mockito.ArgumentCaptor; -import ru.spcex.clearing.platform.messaging.domain.ActionType; -import ru.spcex.clearing.platform.messaging.domain.BaseRequest; -import ru.spcex.clearing.platform.messaging.domain.Consts; -import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; -import ru.spcex.platform.classes.base.SpcexObjectBase; -import ru.spcex.platform.imdg.api.Imdg; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.*; -import static ru.spcex.clearing.platform.messaging.service.Status.Success; -import static ru.spcex.clearing.registry.utils.MatcherFactory.usingIgnoringFieldsComparator; - -public class TestUtils { - public static final MatcherFactory.Matcher> BASE_REQUEST_MATCHER = usingIgnoringFieldsComparator(); - private static final ObjectMapper objectMapper = new ObjectMapper(); - - public static void waitingWhenAddedRecordAndCheckIt(Long id, MockProducer mockProducer, ArgumentCaptor producerRecord) { - BaseRequest predictableBaseRequest = new BaseRequest<>(); - predictableBaseRequest.setId(id); - predictableBaseRequest.setActionType(ActionType.SYSTEM); - RequestInfoUpdate requestInfoUpdate = new RequestInfoUpdate(); - requestInfoUpdate.setId(id); - requestInfoUpdate.setStatus(Success); - predictableBaseRequest.setRequestPayload(requestInfoUpdate); - - //waiting for kafka producer send message (finale event) - verify(mockProducer, timeout(30_000L).times(1)) - .send(producerRecord.capture()); - - BaseRequest baseRequestResult = (BaseRequest) producerRecord.getValue().value(); - assertEquals(Consts.REQUEST_INFO_UPDATE, producerRecord.getValue().topic()); - BASE_REQUEST_MATCHER.assertMatch(baseRequestResult, predictableBaseRequest); - } - - public static void addRecordToKafka(MockConsumer mockConsumer, String topic, int partition, long offset, String jsonValue) { - TopicPartition tp = new TopicPartition(topic, partition); - HashMap startOffsets = new HashMap<>(); - startOffsets.put(tp, 0L); - mockConsumer.updateBeginningOffsets(startOffsets); - mockConsumer.schedulePollTask(() -> { - mockConsumer.rebalance(Collections.singletonList(tp)); - mockConsumer.addRecord(new ConsumerRecord<>(topic, partition, offset, "key", jsonValue)); - }); - } - - public static String getJsonStringForNew(T accountRequest, long id) { - return getJsonBaseRequest(accountRequest, id, ActionType.NEW); - } - - public static String getJsonStringForUPDATE(T accountRequest, long id) { - return getJsonBaseRequest(accountRequest, id, ActionType.UPDATE); - } - - public static String getJsonStringForDELETE(T accountRequest, long id) { - return getJsonBaseRequest(accountRequest, id, ActionType.DELETE); - } - - private static String getJsonBaseRequest(T accountRequest, long id, ActionType actionType) { - BaseRequest baseRequest = new BaseRequest<>(); - baseRequest.setRequestPayload(accountRequest); - baseRequest.setId(id); - baseRequest.setActionType(actionType); - String jsonBaseRequest; - try { - jsonBaseRequest = objectMapper.writeValueAsString(baseRequest); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - return jsonBaseRequest; - } - - public static void setFuture(ArgumentCaptor captor, Producer mockProducer){ - TestUtils.FutureRecordMetadata future = spy(new TestUtils.FutureRecordMetadata()); - doReturn(future).when(mockProducer).send(captor.capture()); - } - - public static void clearAllInImdg(Imdg imdg) { - Collection values = imdg.getAllValues(); - values.forEach(imdg::delete); - } - - public static class FutureRecordMetadata implements Future { - @Override - public boolean cancel(boolean mayInterruptIfRunning) { - return false; - } - - @Override - public boolean isCancelled() { - return false; - } - - @Override - public boolean isDone() { - return false; - } - - @Override - public RecordMetadata get() throws InterruptedException, ExecutionException { - return null; - } - - @Override - public RecordMetadata get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - return null; - } - } -} +package ru.spcex.clearing.registry.utils; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.producer.MockProducer; +import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.apache.kafka.common.TopicPartition; +import org.mockito.ArgumentCaptor; +import ru.spcex.clearing.platform.messaging.domain.ActionType; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.imdg.api.Imdg; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; +import static ru.spcex.clearing.platform.messaging.service.Status.Success; +import static ru.spcex.clearing.registry.utils.MatcherFactory.usingIgnoringFieldsComparator; + +public class TestUtils { + public static final MatcherFactory.Matcher> BASE_REQUEST_MATCHER = usingIgnoringFieldsComparator(); + private static final ObjectMapper objectMapper = new ObjectMapper(); + + public static void waitingWhenAddedRecordAndCheckIt(Long id, MockProducer mockProducer, ArgumentCaptor producerRecord) { + BaseRequest predictableBaseRequest = new BaseRequest<>(); + predictableBaseRequest.setId(id); + predictableBaseRequest.setActionType(ActionType.SYSTEM); + RequestInfoUpdate requestInfoUpdate = new RequestInfoUpdate(); + requestInfoUpdate.setId(id); + requestInfoUpdate.setStatus(Success); + predictableBaseRequest.setRequestPayload(requestInfoUpdate); + + //waiting for kafka producer send message (finale event) + verify(mockProducer, timeout(30_000L).times(1)) + .send(producerRecord.capture()); + + BaseRequest baseRequestResult = (BaseRequest) producerRecord.getValue().value(); + assertEquals(Consts.REQUEST_INFO_UPDATE, producerRecord.getValue().topic()); + BASE_REQUEST_MATCHER.assertMatch(baseRequestResult, predictableBaseRequest); + } + + public static void addRecordToKafka(MockConsumer mockConsumer, String topic, int partition, long offset, String jsonValue) { + TopicPartition tp = new TopicPartition(topic, partition); + HashMap startOffsets = new HashMap<>(); + startOffsets.put(tp, 0L); + mockConsumer.updateBeginningOffsets(startOffsets); + mockConsumer.schedulePollTask(() -> { + mockConsumer.rebalance(Collections.singletonList(tp)); + mockConsumer.addRecord(new ConsumerRecord<>(topic, partition, offset, "key", jsonValue)); + }); + } + + public static String getJsonStringForNew(T accountRequest, long id) { + return getJsonBaseRequest(accountRequest, id, ActionType.NEW); + } + + public static String getJsonStringForUPDATE(T accountRequest, long id) { + return getJsonBaseRequest(accountRequest, id, ActionType.UPDATE); + } + + public static String getJsonStringForDELETE(T accountRequest, long id) { + return getJsonBaseRequest(accountRequest, id, ActionType.DELETE); + } + + private static String getJsonBaseRequest(T accountRequest, long id, ActionType actionType) { + BaseRequest baseRequest = new BaseRequest<>(); + baseRequest.setRequestPayload(accountRequest); + baseRequest.setId(id); + baseRequest.setActionType(actionType); + String jsonBaseRequest; + try { + jsonBaseRequest = objectMapper.writeValueAsString(baseRequest); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + return jsonBaseRequest; + } + + public static void setFuture(ArgumentCaptor captor, Producer mockProducer){ + TestUtils.FutureRecordMetadata future = spy(new TestUtils.FutureRecordMetadata()); + doReturn(future).when(mockProducer).send(captor.capture()); + } + + public static void clearAllInImdg(Imdg imdg) { + Collection values = imdg.getAllValues(); + values.forEach(imdg::delete); + } + + public static class FutureRecordMetadata implements Future { + @Override + public boolean cancel(boolean mayInterruptIfRunning) { + return false; + } + + @Override + public boolean isCancelled() { + return false; + } + + @Override + public boolean isDone() { + return false; + } + + @Override + public RecordMetadata get() throws InterruptedException, ExecutionException { + return null; + } + + @Override + public RecordMetadata get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { + return null; + } + } +} diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml index 81a6a7056..47bd73c02 100644 --- a/clearing-parent/reports-service/pom.xml +++ b/clearing-parent/reports-service/pom.xml @@ -8,12 +8,12 @@ reports-service reports-service Service for creating reports - SPCEX-3.11.0.0 + SPCEX-3.12.7 clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSRepCashNettoReport.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSRepCashNettoReport.java index 5feee9809..05981229a 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSRepCashNettoReport.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSRepCashNettoReport.java @@ -63,6 +63,19 @@ public class KSRepCashNettoReport { @CsvDate(value = "dd.MM.yyyy") private LocalDate trExecDate; + + public KSRepCashNettoReport cloneWithoutValues() { + KSRepCashNettoReport result = new KSRepCashNettoReport(); + result.setFirmId(firmId); + result.setSessionId(sessionId); + result.setSessionDate(sessionDate); + result.setAccount(account); + result.setTkr(tkr); + result.setDate(date); + result.setLotCurrency(lotCurrency); + return result; + } + public String getFirmId() { return firmId; } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSRepDepoRegisterQuantitiesReport.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSRepDepoRegisterQuantitiesReport.java index 693a6f56e..87a5de0ca 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSRepDepoRegisterQuantitiesReport.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/bean/KSRepDepoRegisterQuantitiesReport.java @@ -49,7 +49,7 @@ public class KSRepDepoRegisterQuantitiesReport { private String tradeNum; @CsvBindByName(column = "OPER_TYPE") - @CsvBindByPosition(position = 8) + @CsvBindByPosition(position = 9) private String operType; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java index 9c4ac65f5..8f6e33288 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/builders/ks/KSRepCashNettoReportBuilder.java @@ -26,6 +26,7 @@ import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.enumeration.ReportBuilderType; import ru.spcex.platform.enumeration.ReportKeys; +import ru.spcex.platform.enumeration.Section; import ru.spcex.platform.enumeration.SessionType; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -125,7 +126,6 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder sessionTypeForValue = Set.of( SessionType.IPOT, SessionType.TRDT, @@ -213,44 +215,59 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder registries = new ArrayList<>(); + List accounts = new ArrayList<>(); + try (CSVReader csvReader = new CSVReaderBuilder( + new FileReader( + getClass().getClassLoader().getResource("expected_reports_csv/ks/ksRepCashNetto_registries.csv").getFile() + ) + ).withSkipLines(1) + .withCSVParser(parser) + .build()) { + do { + String[] row = csvReader.readNext(); + if (row == null) break; + Registry registry = new Registry(); + registry.setSessionId(sessionId); + registry.setClearingDate(LocalDate.now()); + registry.setTradingCode(row[1]); + registry.setTradingClearingRegistry(row[14]); + registry.setRegistryDesignation(row[8]); + registry.setRegistryInstrumentType(row[9]); + registry.setRegistryCapacity(row[10]); + registry.setRegistryUnit(row[11]); + registry.setRegistryCode(row[12]); + registry.setAccountType(row[6]); + registry.setAccount(row[7]); + if (row[6].equalsIgnoreCase(AccountType.Info.getKey())) { + Account account = new Account(); + account.setCompanyId(1L); + account.setAccountType(AccountType.Anlt.getKey()); + account.setAccount(row[7]); + accountImdg.insert(account); + accounts.add(account); + } + registry.setSessionType(row[42]); + registry.setSection(row[47]); + registry.setBalance(new BigDecimal(row[18].replace(',', '.'))); + registry.setSecuritySymbol(row[17]); + registryImdg.insert(registry); + registries.add(registry); + } while (true); + } + + String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); + + TestUtils.addRecordToKafka((MockConsumer) reportService.getConsumer(), + Consts.CREATE_REPORT_FOR_SESSION_ID, + reportRequestWithSessionIdCnt++, + 0, + jsonString); + + TestUtils.waitingSendAndCheckRecord(0L, producer); + + File outFile = outFolder.listFiles()[0]; + File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_REP_CASH_NETTO_extended_expected.csv").getFile()); + compareCSVFiles(expectedFile, outFile, Arrays.asList("SESSION_ID", "DATE", "ACCOUNT", "SESSION_DATE", "TR_EXECDATE")); + + for (Registry registry : registries) registryImdg.delete(registry); + for (Account account : accounts) accountImdg.delete(account); + sessionImdg.delete(session); + } + private void compareCSVFiles(File expectedFile, File actualFile, List columnsForSkip) throws IOException, CsvValidationException { if (columnsForSkip == null) columnsForSkip = Collections.emptyList(); @@ -1204,7 +1320,14 @@ public class ReportServiceTest_KS { String expected = expectedLine[expectedIdx]; String actual = actualLine[actualIdx]; lineEqual = expected.equals(actual); - if (!lineEqual) break; + if (!lineEqual) { + if (bigDecimalPattern.matcher(expected).find() && bigDecimalPattern.matcher(actual).find()) { + BigDecimal actualBD = new BigDecimal(actual.replace(',', '.')); + BigDecimal expectedBD = new BigDecimal(expected.replace(',', '.')); + lineEqual = Math.abs(actualBD.subtract(expectedBD).compareTo(bigDecimalZero)) <= 0; + } + if (!lineEqual) break; + } } if (lineEqual) { findEqual = true; diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv index d10562182..f671ff6a5 100644 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_expected.csv @@ -1,3 +1,3 @@ -"FIRMID","SESSION_ID","SESSION_DATE","ACCOUNT","TKR","VALUE","DATE","OBL_VALUE","REQ_VALUE" -"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","TKR","22.22","16.11.2023","","" -"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT_FROM_ACCOUNT","TKR","","16.11.2023","22.22","44.44" \ No newline at end of file +"FIRMID","SESSION_ID","SESSION_DATE","ACCOUNT","TKR","VALUE","DATE","OBL_VALUE","REQ_VALUE","LOT_CURRENCY","CURRENCY_NETTO","TR_EXECDATE" +"TRADING_CODE","146","20.01.1970T02:49:58","ACCOUNT","TKR","22.22","26.06.2024",,,,, +"TRADING_CODE","146","20.01.1970T02:49:58","ACCOUNT_FROM_ACCOUNT","TKR",,"26.06.2024","22.22","44.44",,, diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_extended_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_extended_expected.csv new file mode 100644 index 000000000..ca75c8e60 --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_NETTO_extended_expected.csv @@ -0,0 +1,16 @@ +"FIRMID","SESSION_ID","SESSION_DATE","ACCOUNT","TKR","VALUE","DATE","OBL_VALUE","REQ_VALUE","LOT_CURRENCY","CURRENCY_NETTO","TR_EXECDATE" +"95","2","20.01.1970T02:49:58","30411810300000002049","0095CAT00001",,"27.06.2024",,,"UZS","-10000","27.06.2024" +"8","2","20.01.1970T02:49:58","3,04118607E+019","0008MAT00001",,"27.06.2024",,,"UZS","10000","27.06.2024" +"8","2","20.01.1970T02:49:58","3,041181E+019","0008CAT00001","9743.90","27.06.2024",,,"RUB",, +"8","2","20.01.1970T02:49:58","3,041181E+019","0008CAT00001",,"27.06.2024","0.00","7000000000.00","RUB",, +"8","2","20.01.1970T02:49:58","3,04118102E+019","0008MAT00001",,"27.06.2024",,,"RUB","-69.75","27.06.2024" +"472","2","20.01.1970T02:49:58","3,04118605E+019","0472CAT00001",,"27.06.2024",,,"UZS","-10000000","27.06.2024" +"302","2","20.01.1970T02:49:58","3,04118107E+019","0302MAT00001",,"27.06.2024","10000000000.00","0.00","RUB",, +"472","2","20.01.1970T02:49:58","3,04111569E+019","0472CAT00001",,"27.06.2024",,,"CNY","10","27.06.2024" +"472","2","20.01.1970T02:49:58","3,0411810101E+019","0472CAT00001","-9743.90","27.06.2024",,,"RUB",, +"472","2","20.01.1970T02:49:58","3,0411810101E+019","0472CAT00001",,"27.06.2024",,,"RUB","69627.92","27.06.2024" +"45","2","20.01.1970T02:49:58","3,04118103E+019","0045CAT00001",,"27.06.2024","0.00","3000000000.00","RUB",, +"234","2","20.01.1970T02:49:58","3,99118100000003E+019","0234CAT00001",,"27.06.2024",,,"RUB","-69627.92","27.06.2024" +"234","2","20.01.1970T02:49:58","3,99118100000003E+019","0234CAT00001",,"27.06.2024",,,"UZS","10000000","27.06.2024" +"95","2","20.01.1970T02:49:58","30411810300000002094","0095CAT00001",,"27.06.2024",,,"RUB","69.75","27.06.2024" +"234","2","20.01.1970T02:49:58","3,99118100000003E+019","0234CAT00001",,"27.06.2024",,,"CNY","-10","27.06.2024" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv index 36c9eb47c..2d9508a04 100644 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTERS_expected.csv @@ -1,3 +1,2 @@ -"FIRMID","ACCOUNT","TKR","DATE","REGISTER_CODE","REGISTER_NAME","OPEN_BALANCE","CHANGE_BALANCE","ADD_WITHDRAW","CLOSE_BALANCE","REMARKS","TRADE_NUM" -"TRADING_CODE","ACCOUNT_FROM_ACCOUNT","TRADING_CLEARING_REGISTRY","29.12.2023","AM_T","AM_T_NAME","77.78","189.00","111.00","377.78",, -"TRADING_CODE","ACCOUNT","TRADING_CLEARING_REGISTRY","29.12.2023","AM_T","AM_T_NAME","77.78","189.00","111.00","377.78",, +"FIRMID","ACCOUNT","TKR","DATE","REGISTER_CODE","REGISTER_NAME","OPEN_BALANCE","CHANGE_BALANCE","ADD_WITHDRAW","CLOSE_BALANCE","REMARKS","TRADE_NUM","CURRENCY" +"TRADING_CODE","ACCOUNT","TRADING_CLEARING_REGISTRY","01.07.2024","AM_T","AM_T_NAME","77.78","189.00","111.00","377.78",,, diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTER_SUMS_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTER_SUMS_expected.csv index 4f826ad73..02ad2f873 100644 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTER_SUMS_expected.csv +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_CASH_REGISTER_SUMS_expected.csv @@ -1,4 +1,4 @@ -"FIRMID","ACCOUNT","TKR","REGISTER_CODE","ADD_SUM","ADD_TIME","ADD_DATE","TRADE_NUM" -"TRADING_CODE","","0008CAT00001","AM_T","0.00","15:30:57","01.11.2023","" -"TRADING_CODE","ACCOUNT","0008CAT00001","AM_T","0.00","15:30:57","01.11.2023","" -"TRADING_CODE","ACCOUNT_FROM_ACCOUNT","0008CAT00001","AM_T","0.00","15:30:57","01.11.2023","" +"FIRMID","ACCOUNT","TKR","REGISTER_CODE","ADD_SUM","ADD_TIME","ADD_DATE","TRADE_NUM","OPER_TYPE","CURRENCY" +"TRADING_CODE","ACCOUNT","0008CAT00001","AM_T","0.00","13:10:34","03.06.2024",,"?", +"TRADING_CODE",,"0008CAT00001","AM_T","0.00","13:10:34","03.06.2024",,"?", +"TRADING_CODE","ACCOUNT_FROM_ACCOUNT","0008CAT00001","AM_T","0.00","13:10:34","03.06.2024",,"?", diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTER_QUANTITIES_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTER_QUANTITIES_expected.csv index 0b605405d..5169460be 100644 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTER_QUANTITIES_expected.csv +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_DEPO_REGISTER_QUANTITIES_expected.csv @@ -1,2 +1,2 @@ -"FIRMID","ACCOUNT","TKR","SECURITYID","REGISTER_CODE","ADD_QUANTITY","ADD_TIME","ADD_DATE","TRADE_NUM" -"TRADING_CODE","ACCOUNT_SYMBOL_VALUE","0008CAT00001","SECURITY_SYMBOL","AS_T","10","13:55:53","02.10.2023","" +"FIRMID","ACCOUNT","TKR","SECURITYID","REGISTER_CODE","ADD_QUANTITY","ADD_TIME","ADD_DATE","TRADE_NUM","OPER_TYPE" +"TRADING_CODE","ACCOUNT_SYMBOL_VALUE","0008CAT00001","SECURITY_SYMBOL","AS_T","10","13:24:04","03.06.2024","","ENR" diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_TRADES_expected.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_TRADES_expected.csv index bfd6724ff..68217b9a4 100644 --- a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_TRADES_expected.csv +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/KS_REP_TRADES_expected.csv @@ -1,5 +1,5 @@ -"SESSION_ID","SESSION_DATE","TR_ID","AGREEMENT_NUMBER","FIRM_ID","TKR","ACCOUNT","DEPO_ACCOUNT","CASH_LIABILITY","DEPO_LIABILITY","TRADE_NUM","CLASS_CODE","TRADE_DATE","STATUS","REPAYM_DATE" -"7","20.01.1970T07:09:07","222","CONTRACT","TRADING_CODE","TKR",,,"8888.89","0","222","3333","20.01.1970T02:49:58","2","01.01.2000" -"6","20.01.1970T15:54:43","222",,"TRADING_CODE","TKR",,"ACCOUNT","-8888.89","123","222","3333","20.01.1970T02:49:58","1", -"6","20.01.1970T15:54:43","222",,"TRADING_CODE","TKR",,"ACC_SYMBOL_VALUE","8888.89","-123","222","3333","20.01.1970T02:49:58","2", -"6","20.01.1970T15:54:43","222",,"TRADING_CODE","TKR",,"ACC_SYMBOL_VALUE","-8888.89","123","222","3333","20.01.1970T02:49:58","2", +"SESSION_ID","SESSION_DATE","TR_ID","AGREEMENT_NUMBER","FIRM_ID","TKR","ACCOUNT","DEPO_ACCOUNT","CASH_LIABILITY","DEPO_LIABILITY","TRADE_NUM","CLASS_CODE","TRADE_DATE","STATUS","REPAYM_DATE","LOT_CURRENCY" +"136","20.01.1970T07:09:07","222","CONTRACT","TRADING_CODE","TKR",,,"8888.89","0","222","3333","20.01.1970T02:49:58","2","01.01.2000", +"135","20.01.1970T15:54:43","222",,"TRADING_CODE","TKR",,"ACC_SYMBOL_VALUE","-8888.89","123","222","3333","20.01.1970T02:49:58","2",, +"135","20.01.1970T15:54:43","222",,"TRADING_CODE","TKR",,"ACCOUNT","-8888.89","123","222","3333","20.01.1970T02:49:58","1",, +"135","20.01.1970T15:54:43","222",,"TRADING_CODE","TKR",,"ACC_SYMBOL_VALUE","8888.89","-123","222","3333","20.01.1970T02:49:58","2",, diff --git a/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/ksRepCashNetto_registries.csv b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/ksRepCashNetto_registries.csv new file mode 100644 index 000000000..ee191b2e6 --- /dev/null +++ b/clearing-parent/reports-service/src/test/resources/expected_reports_csv/ks/ksRepCashNetto_registries.csv @@ -0,0 +1,19 @@ +company_id;trading_code;clearing_code;short_name;full_name;account_id;account_type;account;registry_designation;registry_instrument_type;registry_capacity;registry_unit;registry_code;trading_clearing_registry_id;trading_clearing_registry;registry_status;security_id;security_symbol;balance;open_balance;close_balance;credit;debit;settled_credit;settled_debit;check_balance;diff_balance;plan_balance;balance_dimension;settlement_date;settlement_code;trading_date;clearing_date;refund_date;value_date;price;contract;counter_party_id;comment;parent_id;group_id;session_id;session_type;payment_id;id;created_at;updated_at;section +4500120;95;95;Банк ВТБ (ПАО);Банк ВТБ (публичное акционерное общество);4410078;CLRN;30411810300000002094;C;M;A;T;CMAT;21240012;0095CAT00001;CLRD;643;RUB;69,75;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7515;38840009;80162;(null);(null);507;47580029;UNIT;(null);47580094;24.06.2024 14:16;24.06.2024 15:19;CURR +80162;8;8;ПАО Сбербанк;Публичное акционерное общество «Сбербанк России»;38690096;CLRN;3,04118607E+019;C;M;A;T;CMAT;130040;0008MAT00001;CLRD;860;UZS;10000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7515;38840009;4500120;(null);(null);507;47580029;UNIT;(null);47580076;24.06.2024 14:16;24.06.2024 15:19;CURR +80022;472;472;ПАО "Промсвязьбанк";Публичное акционерное общество «Промсвязьбанк» ;38690028;CLRN;3,04111569E+019;C;M;A;T;CMAT;1860016;0472CAT00001;CLRD;156;CNY;10;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;12,9575;38840004;4500072;(null);(null);508;47580029;UNIT;(null);47580074;24.06.2024 14:16;24.06.2024 15:19;CURR +80136;45;45;АО "АБ "РОССИЯ";Акционерное общество «Акционерный Банк «РОССИЯ»;130023;CLRN;3,04118103E+019;C;M;A;T;CMAT;1860025;0045CAT00001;CLRD;643;RUB;3000000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;25.06.2024;24.06.2024;17,12;DT1000S001U/240624/45/24062400000001;80074;(null);(null);24062400000001;47580029;UNIT;(null);47580072;24.06.2024 14:16;24.06.2024 15:19;MKR +4500072;234;234;Банк "ВБРР" (АО);Акционерное общество "Всероссийский банк развития регионов";47130002;INFO;3,99118600000001E+019;C;M;A;T;CMAT;47130004;0234CAT00001;CLRD;860;UZS;10000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7575;38840005;80022;(null);(null);1518298;47580029;UNIT;(null);47580093;24.06.2024 14:16;24.06.2024 15:19;CURR +80162;8;8;ПАО Сбербанк;Публичное акционерное общество «Сбербанк России»;130013;CLRN;3,041181E+019;C;M;A;T;CMAT;1930000;0008CAT00001;CLRD;643;RUB;7000000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;25.06.2024;24.06.2024;16,88;DT1000S001U/240624/8/24062400000002;80074;(null);(null);24062400000002;47580029;UNIT;(null);47580079;24.06.2024 14:16;24.06.2024 15:19;MKR +4500072;234;234;Банк "ВБРР" (АО);Акционерное общество "Всероссийский банк развития регионов";4410023;INFO;3,99118100000003E+019;C;M;A;T;CMAT;47130004;0234CAT00001;CLRD;643;RUB;129,58;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;12,9575;38840004;80022;(null);(null);508;47580029;UNIT;(null);47580073;24.06.2024 14:16;24.06.2024 15:19;CURR +80162;8;8;ПАО Сбербанк;Публичное акционерное общество «Сбербанк России»;130013;CLRN;3,041181E+019;C;M;A;T;CMAT;1930000;0008CAT00001;CLRD;643;RUB;9743,9;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;97;(null);80022;(null);(null);1461034;47580029;UNIT;(null);47580085;24.06.2024 14:16;24.06.2024 15:19;FOND +80022;472;472;ПАО "Промсвязьбанк";Публичное акционерное общество «Промсвязьбанк» ;130005;CLRN;3,0411810101E+019;C;M;A;T;CMAT;1860016;0472CAT00001;CLRD;643;RUB;69757,5;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7575;38840005;4500072;(null);(null);1518298;47580029;UNIT;(null);47580090;24.06.2024 14:16;24.06.2024 15:19;CURR +80022;472;472;ПАО "Промсвязьбанк";Публичное акционерное общество «Промсвязьбанк» ;38690032;CLRN;3,04118605E+019;L;M;A;T;LMAT;1860016;0472CAT00001;CLRD;860;UZS;10000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7575;38840005;4500072;(null);(null);1518298;47580029;UNIT;(null);47580075;24.06.2024 14:16;24.06.2024 15:19;CURR +4500072;234;234;Банк "ВБРР" (АО);Акционерное общество "Всероссийский банк развития регионов";47130000;INFO;3,99111560000002E+019;L;M;A;T;LMAT;47130004;0234CAT00001;CLRD;156;CNY;10;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;12,9575;38840004;80022;(null);(null);508;47580029;UNIT;(null);47580087;24.06.2024 14:16;24.06.2024 15:19;CURR +80022;472;472;ПАО "Промсвязьбанк";Публичное акционерное общество «Промсвязьбанк» ;130005;CLRN;3,0411810101E+019;L;M;A;T;LMAT;1860016;0472CAT00001;CLRD;643;RUB;129,58;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;12,9575;38840004;4500072;(null);(null);508;47580029;UNIT;(null);47580083;24.06.2024 14:16;24.06.2024 15:19;CURR +80022;472;472;ПАО "Промсвязьбанк";Публичное акционерное общество «Промсвязьбанк» ;130005;CLRN;3,0411810101E+019;L;M;A;T;LMAT;1860016;0472CAT00001;CLRD;643;RUB;9743,9;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;97;(null);80162;(null);(null);1461034;47580029;UNIT;(null);47580095;24.06.2024 14:16;24.06.2024 15:19;FOND +80074;302;302;Комитет финансов СПб;Комитет финансов Санкт-Петербурга;130019;CLRN;3,04118107E+019;L;M;A;T;LMAT;130034;0302MAT00001;CLRD;643;RUB;7000000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;25.06.2024;24.06.2024;16,88;DT1000S001U/240624/8/24062400000002;80162;(null);(null);24062400000002;47580029;UNIT;(null);47580089;24.06.2024 14:16;24.06.2024 15:19;MKR +4500072;234;234;Банк "ВБРР" (АО);Акционерное общество "Всероссийский банк развития регионов";4410023;INFO;3,99118100000003E+019;L;M;A;T;LMAT;47130004;0234CAT00001;CLRD;643;RUB;69757,5;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7575;38840005;80022;(null);(null);1518298;47580029;UNIT;(null);47580078;24.06.2024 14:16;24.06.2024 15:19;CURR +80074;302;302;Комитет финансов СПб;Комитет финансов Санкт-Петербурга;130019;CLRN;3,04118107E+019;L;M;A;T;LMAT;130034;0302MAT00001;CLRD;643;RUB;3000000000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;25.06.2024;24.06.2024;17,12;DT1000S001U/240624/45/24062400000001;80136;(null);(null);24062400000001;47580029;UNIT;(null);47580086;24.06.2024 14:16;24.06.2024 15:19;MKR +80162;8;8;ПАО Сбербанк;Публичное акционерное общество «Сбербанк России»;130017;CLRN;3,04118102E+019;L;M;A;T;LMAT;130040;0008MAT00001;CLRD;643;RUB;69,75;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7515;38840009;4500120;(null);(null);507;47580029;UNIT;(null);47580084;24.06.2024 14:16;24.06.2024 15:19;CURR +4500120;95;95;Банк ВТБ (ПАО);Банк ВТБ (публичное акционерное общество);38690016;CLRN;30411810300000002049;L;M;A;T;LMAT;21240012;0095CAT00001;CLRD;860;UZS;10000;(null);(null);0;0;0;0;0;0;0;MONY;24.06.2024;T0;24.06.2024;24.06.2024;(null);24.06.2024;69,7515;38840009;80162;(null);(null);507;47580029;UNIT;(null);47580088;24.06.2024 14:16;24.06.2024 15:19;CURR diff --git a/clearing-parent/scheduler-service/pom.xml b/clearing-parent/scheduler-service/pom.xml index 570c096d2..eaf166830 100644 --- a/clearing-parent/scheduler-service/pom.xml +++ b/clearing-parent/scheduler-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 4.0.0 @@ -51,7 +51,7 @@ ru.spcex.clearing cleaning-builders - SPCEX-3.11.0.0 + SPCEX-3.12.7 compile diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherService.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherService.java index 61dcf3a23..c4a73ecfc 100644 --- a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherService.java +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherService.java @@ -98,6 +98,7 @@ public class LauncherService extends QueueConsumer implements InitializingBean { req.setCreditLeg_amount(launcherNew.getCreditLeg_amount()); req.setCreditLeg_accountId(launcherNew.getCreditLeg_accountId()); req.setDebitLeg_accountId(launcherNew.getDebitLeg_accountId()); + // launcherNew.getCorrespondentAccountId() = getDebitLeg_accountId req.setSwiftCode(launcherNew.getSwiftCode()); final String destination = Consts.PAYMENT_INSTRUCTION_CLEARING_OUTBOUND_ACTION; diff --git a/clearing-parent/scheduler-service/src/test/java/ru/spcex/clearing/scheduler/service/LauncherServiceTest.java b/clearing-parent/scheduler-service/src/test/java/ru/spcex/clearing/scheduler/service/LauncherServiceTest.java index 85b59251b..3fc4ed31d 100644 --- a/clearing-parent/scheduler-service/src/test/java/ru/spcex/clearing/scheduler/service/LauncherServiceTest.java +++ b/clearing-parent/scheduler-service/src/test/java/ru/spcex/clearing/scheduler/service/LauncherServiceTest.java @@ -20,6 +20,7 @@ import ru.spcex.clearing.test.MatcherFactory; import javax.annotation.PostConstruct; import java.math.BigDecimal; +import java.time.LocalDate; import java.time.LocalTime; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -83,6 +84,8 @@ class LauncherServiceTest extends AbstractServiceTest { launcherCommandRequest.setDebitLeg_accountId(145L); launcherCommandRequest.setSwiftCode("SWIFT"); launcherCommandRequest.setFromTime(LocalTime.of(12,23)); + launcherCommandRequest.setFromDate(LocalDate.of(2024,12,21)); + launcherCommandRequest.setToDate(LocalDate.of(2024,12,21)); BaseRequest predictableBaseRequest = new BaseRequest<>(); predictableBaseRequest.setRequestPayload(launcherCommandRequest); diff --git a/clearing-parent/securities-service/pom.xml b/clearing-parent/securities-service/pom.xml index 0c85a5901..f5ecfd52d 100644 --- a/clearing-parent/securities-service/pom.xml +++ b/clearing-parent/securities-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 4.0.0 diff --git a/clearing-parent/security-util/pom.xml b/clearing-parent/security-util/pom.xml index d91ea73ca..0da2b7828 100644 --- a/clearing-parent/security-util/pom.xml +++ b/clearing-parent/security-util/pom.xml @@ -8,12 +8,12 @@ security-util clearing Clearing misc util for verify user roles jar - SPCEX-3.11.0.0 + SPCEX-3.12.7 clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 @@ -35,13 +35,13 @@ ru.spcex.clearing classes - SPCEX-3.11.0.0 + SPCEX-3.12.7 compile ru.spcex.clearing dictionary - SPCEX-3.11.0.0 + SPCEX-3.12.7 compile diff --git a/clearing-parent/swt-exporter/pom.xml b/clearing-parent/swt-exporter/pom.xml index 072cf89a2..86fd430a8 100644 --- a/clearing-parent/swt-exporter/pom.xml +++ b/clearing-parent/swt-exporter/pom.xml @@ -3,13 +3,13 @@ 4.0.0 swt-exporter Swt exporter - SPCEX-3.11.0.0 + SPCEX-3.12.7 jar ru.spcex.clearing clearing-parent - SPCEX-3.11.0.0 + SPCEX-3.12.7 @@ -35,7 +35,7 @@ ru.spcex.clearing classes - SPCEX-3.11.0.0 + SPCEX-3.12.7 compile diff --git a/clearing-parent/swt-exporter/src/main/java/ru/spcex/clearing/swt/exporter/config/SFTPConfig.java b/clearing-parent/swt-exporter/src/main/java/ru/spcex/clearing/swt/exporter/config/SFTPConfig.java index e5557aa57..c22344859 100644 --- a/clearing-parent/swt-exporter/src/main/java/ru/spcex/clearing/swt/exporter/config/SFTPConfig.java +++ b/clearing-parent/swt-exporter/src/main/java/ru/spcex/clearing/swt/exporter/config/SFTPConfig.java @@ -1,5 +1,7 @@ package ru.spcex.clearing.swt.exporter.config; +import java.io.File; +import java.util.List; import com.jcraft.jsch.ChannelSftp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -7,15 +9,17 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; import org.springframework.expression.common.LiteralExpression; import org.springframework.integration.annotation.Gateway; -import org.springframework.integration.annotation.MessagingGateway; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.dsl.IntegrationFlow; import org.springframework.integration.dsl.IntegrationFlows; +import static org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway.Command.LS; import org.springframework.integration.file.remote.session.CachingSessionFactory; import org.springframework.integration.file.remote.session.SessionFactory; +import org.springframework.integration.gateway.AnnotationGatewayProxyFactoryBean; import org.springframework.integration.sftp.gateway.SftpOutboundGateway; import org.springframework.integration.sftp.outbound.SftpMessageHandler; import org.springframework.integration.sftp.session.DefaultSftpSessionFactory; @@ -24,23 +28,14 @@ import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; import ru.spcex.clearing.swt.exporter.config.settings.ExportSwtServiceSettings; -import java.io.File; -import java.util.List; - -import static org.springframework.integration.file.remote.gateway.AbstractRemoteFileOutboundGateway.Command.LS; - +@Profile("!test") @Configuration @ConditionalOnProperty(value="export-swt-service.sftp-out.sftp-out-dir") public class SFTPConfig { protected Logger log = LoggerFactory.getLogger(getClass()); - private final ExportSwtServiceSettings settings; - - public SFTPConfig(ExportSwtServiceSettings settings) { - this.settings = settings; - } @Bean("sftpSessionFactory") - public SessionFactory sftpSessionFactory() { + public SessionFactory sftpSessionFactory(ExportSwtServiceSettings settings) { DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true); factory.setHost(settings.getSftpOut().getServerIp()); factory.setPort(settings.getSftpOut().getServerPort()); @@ -52,7 +47,8 @@ public class SFTPConfig { @Bean("sftpHandler") @ServiceActivator(inputChannel = "toSftpChannel") - public MessageHandler handler(@Qualifier("sftpSessionFactory") SessionFactory sessionFactory) { + public MessageHandler handler(@Qualifier("sftpSessionFactory") SessionFactory sessionFactory, + ExportSwtServiceSettings settings) { SftpMessageHandler handler = new SftpMessageHandler(sessionFactory); handler.setRemoteDirectoryExpression(new LiteralExpression(settings.getSftpOut().getSftpOutDir())); log.info("Configure sftp output directory \"{}\"", settings.getSftpOut().getSftpOutDir()); @@ -69,7 +65,8 @@ public class SFTPConfig { @Bean("sftpHandlerList") @ServiceActivator(inputChannel = "listSftpChannel") - public MessageHandler handlerList(@Qualifier("sftpSessionFactory") SessionFactory sessionFactory) { + public MessageHandler handlerList(@Qualifier("sftpSessionFactory") SessionFactory sessionFactory, + ExportSwtServiceSettings settings) { String expression = "'/%s'".formatted(settings.getSftpOut().getSftpOutDir()); return new SftpOutboundGateway(sessionFactory, LS.getCommand(), expression); } @@ -95,7 +92,12 @@ public class SFTPConfig { .get(); } - @MessagingGateway(name = "notificationsSftpGateway") + // https://stackoverflow.com/questions/53655208/profile-doesnt-work-with-messaging-gateway + @Bean("notificationsSftpGateway") + public AnnotationGatewayProxyFactoryBean dbfGateway() { + return new AnnotationGatewayProxyFactoryBean(SftpGateway.class); + } + public interface SftpGateway { @Gateway(requestChannel = "toSftpChannel") void sendToSftp(File file); diff --git a/clearing-parent/swt-exporter/src/main/java/ru/spcex/clearing/swt/exporter/config/SFTPMockConfig.java b/clearing-parent/swt-exporter/src/main/java/ru/spcex/clearing/swt/exporter/config/SFTPMockConfig.java new file mode 100644 index 000000000..e32412272 --- /dev/null +++ b/clearing-parent/swt-exporter/src/main/java/ru/spcex/clearing/swt/exporter/config/SFTPMockConfig.java @@ -0,0 +1,32 @@ +package ru.spcex.clearing.swt.exporter.config; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.integration.sftp.session.SftpFileInfo; + +@Profile("test") +@Configuration +public class SFTPMockConfig { + @Bean("notificationsSftpGateway") + public SFTPConfig.SftpGateway dbfGateway(){ + return new SftpGateway(); + } + + public static class SftpGateway implements SFTPConfig.SftpGateway{ + + @Override + public void sendToSftp(File file) { + + } + + @Override + public List listFiles(String dir) { + return new ArrayList<>(); + } + } + +} diff --git a/clearing-parent/swt-exporter/src/main/java/ru/spcex/clearing/swt/exporter/services/exportimpl/DF12Exporter.java b/clearing-parent/swt-exporter/src/main/java/ru/spcex/clearing/swt/exporter/services/exportimpl/DF12Exporter.java index 3ffcf1729..1d9e4dede 100644 --- a/clearing-parent/swt-exporter/src/main/java/ru/spcex/clearing/swt/exporter/services/exportimpl/DF12Exporter.java +++ b/clearing-parent/swt-exporter/src/main/java/ru/spcex/clearing/swt/exporter/services/exportimpl/DF12Exporter.java @@ -1,5 +1,9 @@ package ru.spcex.clearing.swt.exporter.services.exportimpl; +import java.io.PrintWriter; +import java.time.LocalDateTime; +import java.util.Collection; +import java.util.Objects; import com.hazelcast.aws.utility.StringUtil; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.misc.Session; @@ -15,11 +19,7 @@ import ru.spcex.platform.enumeration.Section; import ru.spcex.platform.enumeration.SessionType; import ru.spcex.platform.enumeration.SwtTable; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.PrintWriter; -import java.time.LocalDateTime; -import java.util.Collection; -import java.util.Objects; +import ru.spcex.platform.utils.enumeration.IEnumKey; @Service @@ -41,10 +41,10 @@ public class DF12Exporter extends AbstractExporterService { @Override protected String sectionForFileName(SwtExporterRequest req) { Session session = session(req); - if (!Section.FOND.equalsByKey(session.getSection())) { - throw new IllegalStateException("%s is only processed for FOND section".formatted(typeForFileName())); + if (!IEnumKey.contains(session.getSection(), Section.FOND, Section.MULT)) { + throw new IllegalStateException("%s is only processed for FOND/MULT section".formatted(typeForFileName())); } - if (SessionType.TRDT.equalsByKey(session.getSessionType())) { + if (SessionType.TRDT.equalsByKey(session.getSessionType()) || SessionType.UNIT.equalsByKey(session.getSessionType())) { return "fund"; } return "bond"; diff --git a/clearing-parent/swt-exporter/src/main/java/ru/spcex/clearing/swt/exporter/services/exportimpl/DF14Exporter.java b/clearing-parent/swt-exporter/src/main/java/ru/spcex/clearing/swt/exporter/services/exportimpl/DF14Exporter.java index a17a2b7b1..cd135d8cf 100644 --- a/clearing-parent/swt-exporter/src/main/java/ru/spcex/clearing/swt/exporter/services/exportimpl/DF14Exporter.java +++ b/clearing-parent/swt-exporter/src/main/java/ru/spcex/clearing/swt/exporter/services/exportimpl/DF14Exporter.java @@ -1,5 +1,8 @@ package ru.spcex.clearing.swt.exporter.services.exportimpl; +import java.io.PrintWriter; +import java.time.LocalDateTime; +import java.util.Collection; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.sdf.SDf14; @@ -14,10 +17,7 @@ import ru.spcex.platform.enumeration.Section; import ru.spcex.platform.enumeration.SessionType; import ru.spcex.platform.enumeration.SwtTable; import ru.spcex.platform.imdg.api.ImdgProvider; - -import java.io.PrintWriter; -import java.time.LocalDateTime; -import java.util.Collection; +import ru.spcex.platform.utils.enumeration.IEnumKey; @Service @@ -41,10 +41,10 @@ public class DF14Exporter extends AbstractExporterService { @Override protected String sectionForFileName(SwtExporterRequest req) { Session session = session(req); - if (!Section.FOND.equalsByKey(session.getSection())) { - throw new IllegalStateException("%s is only processed for FOND section".formatted(typeForFileName())); + if (!IEnumKey.contains(session.getSection(), Section.FOND, Section.MULT)) { + throw new IllegalStateException("%s is not processed for %s section".formatted(typeForFileName(), session.getSection())); } - if (SessionType.TRDT.equalsByKey(session.getSessionType())) { + if (IEnumKey.contains(session.getSessionType(), SessionType.TRDT, SessionType.UNIT)) { return "fund"; } return "bond"; diff --git a/clearing-parent/swt-importer/pom.xml b/clearing-parent/swt-importer/pom.xml index 40d221c37..1c7294068 100644 --- a/clearing-parent/swt-importer/pom.xml +++ b/clearing-parent/swt-importer/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 4.0.0 diff --git a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/config/SFTPConfig.java b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/config/SFTPConfig.java index d96dfb250..b8d99b159 100644 --- a/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/config/SFTPConfig.java +++ b/clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/config/SFTPConfig.java @@ -1,5 +1,8 @@ package ru.spcex.clearing.swt.importer.config; +import java.io.File; +import java.util.Comparator; +import java.util.concurrent.TimeUnit; import com.jcraft.jsch.ChannelSftp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -7,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; import org.springframework.integration.annotation.InboundChannelAdapter; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.core.MessageSource; @@ -21,10 +25,7 @@ import org.springframework.messaging.MessageHandler; import org.springframework.scheduling.support.PeriodicTrigger; import ru.spcex.clearing.swt.importer.config.settings.ImportSWTServiceSettings; -import java.io.File; -import java.util.Comparator; -import java.util.concurrent.TimeUnit; - +@Profile("!test") @Configuration @ConditionalOnProperty(value="import-swt-service.store.sftp-in.sftp-src-dir") public class SFTPConfig { diff --git a/clearing-parent/test-clearing/pom.xml b/clearing-parent/test-clearing/pom.xml index a0e4b4f9b..c6f94fc22 100644 --- a/clearing-parent/test-clearing/pom.xml +++ b/clearing-parent/test-clearing/pom.xml @@ -4,11 +4,11 @@ ru.spcex.clearing clearing-parent - SPCEX-3.11.0.0 + SPCEX-3.12.7 test-clearing Test-clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 ru.spcex.platform diff --git a/clearing-parent/trade-importer/pom.xml b/clearing-parent/trade-importer/pom.xml index 1a678e62e..605c93879 100644 --- a/clearing-parent/trade-importer/pom.xml +++ b/clearing-parent/trade-importer/pom.xml @@ -4,12 +4,12 @@ ru.spcex.clearing clearing-parent - SPCEX-3.11.0.0 + SPCEX-3.12.7 trade-importer trade-importer Trade importer module - SPCEX-3.11.0.0 + SPCEX-3.12.7 jar @@ -51,7 +51,7 @@ ru.spcex.clearing classes - SPCEX-3.11.0.0 + SPCEX-3.12.7 compile diff --git a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java index 5454cee89..1141631b8 100644 --- a/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java +++ b/clearing-parent/trade-importer/src/main/java/ru/spcex/clearing/trade/importer/services/TradeImporterService.java @@ -29,6 +29,7 @@ import java.time.Instant; import java.time.LocalDate; import java.util.Collection; import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; import java.util.function.Supplier; @@ -64,15 +65,30 @@ public class TradeImporterService { } public synchronized void process(boolean byCommand) { - log.debug("Start process import STrades from DB. byCommand={}", byCommand); - Collection tradesFromDB = jdbcTemplate.query(String.format("SELECT * FROM %s.Trades", schema), - (resultSet, i) -> readSTrades(resultSet)); - Instant currentInstant = Instant.now(); + log.info("Start process import STrades from DB. byCommand={}", byCommand); + if (log.isDebugEnabled()) { + String countQuery = String.format("SELECT count(*) FROM %s.Trades", schema); + log.trace("Query: {}", countQuery); + Collection tradesCountFromDB = jdbcTemplate.query(countQuery, + (resultSet, i) -> resultSet.getObject(1, Long.class)); + log.debug("Count of Trades in db: {}. Will be loading.", tradesCountFromDB); + } - log.debug("load from DB STrades: {}", tradesFromDB.size()); - int created = 0; - int updated = 0; - for (STrades tradesDb : tradesFromDB) { + AtomicLong rows = new AtomicLong(); + AtomicLong created = new AtomicLong(); + AtomicLong updated = new AtomicLong(); + final long logProgressTime = 60_000L; // интервал вывода в лог каждую минуту + AtomicLong logTime = new AtomicLong(System.currentTimeMillis() + logProgressTime); + String query = String.format("SELECT * FROM %s.Trades", schema); + log.debug("Load from DB STrades. Query: {}", query); + Instant currentInstant = Instant.now(); + jdbcTemplate.query(query, resultSet -> { + rows.incrementAndGet(); + if (System.currentTimeMillis() > logTime.get()) { + log.debug("Processed {} Trades rows...", rows.get()); + logTime.set(System.currentTimeMillis() + logProgressTime); + } + STrades tradesDb = readSTrades(resultSet); if (isValidTrades(tradesDb) && fillNessessaryFields(tradesDb)) { STrades sTrades = getSTradesFromImdg(tradesDb, sTradesImdg); if (sTrades != null && byCommand) { @@ -81,20 +97,22 @@ public class TradeImporterService { tradesDb.setCreated(sTrades.getCreated()); tradesDb.setUpdated(currentInstant); sTradesImdg.update(tradesDb); - updated++; + updated.incrementAndGet(); } else if (sTrades == null) { // Создание объекта из БД tradesDb.setCreated(currentInstant); tradesDb.setUpdated(currentInstant); sTradesImdg.insert(tradesDb); - created++; + created.incrementAndGet(); } } else { log.warn(messageResolver.resolve(new EnumMessage(sTradesNotValid, tradesDb.getTradeNum()))); } - } - log.debug("Created {} new STrades, {} updated.", created, updated); - if (created > 0 || updated > 0) { + }); + + log.debug("From DB {} STrades has loaded. Created {} new STrades, {} updated.", + rows.get(), created.get(), updated.get()); + if (created.get() > 0 || updated.get() > 0) { if (byCommand) { log.debug("Successfully import STrades from DB by command. Send to kafka command, topic={}", S_TRADES_IMPORTED); } else { diff --git a/clearing-parent/utility-service/pom.xml b/clearing-parent/utility-service/pom.xml index 66c6e6a55..18df56bf1 100644 --- a/clearing-parent/utility-service/pom.xml +++ b/clearing-parent/utility-service/pom.xml @@ -5,7 +5,7 @@ clearing-parent ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 4.0.0 diff --git a/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/IClearingFacade.java b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/IClearingFacade.java new file mode 100644 index 000000000..d640f6026 --- /dev/null +++ b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/IClearingFacade.java @@ -0,0 +1,7 @@ +package ru.spcex.platform.classes.base.interfaces; + +public interface IClearingFacade { + void lock(); + void unlock(); + //something about store objects? +} 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 index 2404d3b9f..f8d564186 100644 --- 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 @@ -1,6 +1,7 @@ package ru.spcex.platform.enumeration; import ru.spcex.platform.utils.enumeration.IEnumKey; +import ru.spcex.platform.utils.text.TextUtil; public enum CurrencyCode implements IEnumKey { RUB("RUB"), @@ -12,6 +13,11 @@ public enum CurrencyCode implements IEnumKey { public static boolean isRub(String currencyCode) { return IEnumKey.containsIgnoreCase(currencyCode, RUB, RUR, SUR); } + + public static boolean isRubDefault(String currencyCode) { + return TextUtil.isEmpty(currencyCode) || isRub(currencyCode); + } + private final String key; CurrencyCode(String key) { diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ResultStatuses.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ResultStatuses.java index 54660b5ce..3eb2be166 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ResultStatuses.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ResultStatuses.java @@ -19,4 +19,8 @@ public enum ResultStatuses implements IEnumKey { public String getKey() { return key; } + + public static ResultStatuses successOrNot(final Boolean val){ + return val ? ResultStatuses.success : ResultStatuses.notSuccess; + } } diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Section.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Section.java index 159b82de1..00e7ecbbd 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Section.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Section.java @@ -5,7 +5,8 @@ import ru.spcex.platform.utils.enumeration.IEnumKey; public enum Section implements IEnumKey { MKR("MKR"), FOND("FOND"), - CURR("CURR"); + CURR("CURR"), + MULT("MULT"); Section(String key) { this.key = key; diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SessionType.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SessionType.java index da0050393..9f08df1fa 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SessionType.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SessionType.java @@ -5,7 +5,7 @@ import ru.spcex.platform.utils.enumeration.IEnumKey; public enum SessionType implements IEnumKey { IPOB("IPOB"), IPO0("IPO0"), IPOT("IPOT"), TRDT("TRDT"), MEDM("MEDM"), FINL("FINL"), XDEP("XDEP"), LIQU("LIQU"), - CURR("CURR") + CURR("CURR"), UNIT("UNIT"), ; SessionType(String key) { diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java index d316c0c6e..50988fa24 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Task.java @@ -35,18 +35,18 @@ public enum Task implements IEnumKey { terminationSession_ETRF("ETRF"),//Завершение торговой сессии по вторичным торгам reconciliationRequest_RCHK("RCHK"),//Запрос на сверку активов createRegistry_GRYT("GRYT"),//Сформировать регистр на текущий день - createRegistry_GRRT("GRRT"),//Сформировать реестр на текущий день - createRegistry_GBRR("GBRR"),//Сформировать реестр на текущий день - createRegistry_GORD("GORD"), // Формирование реестра распоряжений, направленных расчетному депозитарию - createRegistry_GORR("GORR"), // Формирование реестра распоряжений, направленных расчетному депозитарию - createRegistry_GCMR("GCMR"), // Формирование реестра участников клиринга - createRegistry_GSRR("GSRR"), // Формирование реестра отправленных отчетов - createRegistry_GACA("GACA"), // Создание файла остатков CSV по клиринговым счетам + @Deprecated createRegistry_GRRT("GRRT"),//Сформировать реестр остатков ценных бумаг на текущий день + createRegistry_GBRR("GBRR"),//Сформировать реестра остатков денежных средств на текущий день + @Deprecated createRegistry_GORD("GORD"), // Формирование реестра распоряжений, направленных расчетному депозитарию + @Deprecated createRegistry_GORR("GORR"), // Формирование реестра распоряжений, направленных расчетному депозитарию + @Deprecated createRegistry_GCMR("GCMR"), // Формирование реестра участников клиринга + @Deprecated createRegistry_GSRR("GSRR"), // Формирование реестра отправленных отчетов + @Deprecated createRegistry_GACA("GACA"), // Создание файла остатков CSV по клиринговым счетам @Deprecated createRegistry_ADLR("ADLR"), // формирование admittedLiabilitiesRegister @Deprecated createRegistry_CDLR("CDLR"), // формирование coveredLiabilitiesRegister @Deprecated createRegistry_EXLR("EXLR"), // формирование excludeLiabilitiesRegister - createRegistry_LBSR("LBSR"), // формирование liabilitiesRegister - createRegistry_ECNR("ECNR"), // формирование executionRegister + @Deprecated createRegistry_LBSR("LBSR"), // формирование liabilitiesRegister + @Deprecated createRegistry_ECNR("ECNR"), // формирование executionRegister createRegistry_STRS("STRS"), // Начало торговой сессии createRegistry_ETRS("ETRS"), // Завершение торговой сессии forming_CMBA("CMBA"), // Формирование распоряжения на перевод с ТБС diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/CurrencyCodeValidationRule.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/CurrencyCodeValidationRule.java index 3f3e864da..b88ce9c5d 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/CurrencyCodeValidationRule.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/CurrencyCodeValidationRule.java @@ -4,6 +4,7 @@ import java.util.Optional; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.classes.base.interfaces.WithCurrency; +import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.validation.ImdgValidationContext; @@ -32,8 +33,9 @@ public class CurrencyCodeValidationRule implements IValidationRule curImdg = context.obtainMap(IMDGDistributedNames.Map_Currency, SpcexObjectBase.class); ImdgPredicateBuilder pb = curImdg.predicateBuilder(); + String currencyCode = obj.currency() == null ? CurrencyCode.RUB.getKey() : obj.currency(); SpcexObjectBase currency = curImdg.getFirstObjectByPredicate( - pb.equals("currencyCode", obj.currency()) + pb.equals("currencyCode", currencyCode) ); if (currency == null) { return of(errEnum, obj.currency()); 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 b5327eb6d..293950cc9 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 @@ -101,6 +101,8 @@ public interface Consts { String DESTINATION_PROFILE_DOCUMENT_DELETE = "profile-document-delete"; String DESTINATION_CLIENT_CODE_NEW = "client-code-new"; + String DESTINATION_CLIENT_CODE_NEW_FROM_GATEWAY = "client-code-new-from-gateway"; + String DESTINATION_CLIENT_CODE_UPDATE_FROM_GATEWAY = "client-code-update-from-gateway"; String DESTINATION_CLIENT_CODE_NEW_UM_COMPANY = "client-code-new-from-api-um-company"; String DESTINATION_CLIENT_CODE_UPDATE = "client-code-update"; String DESTINATION_CLIENT_CODE_DELETE = "client-code-delete"; @@ -110,6 +112,7 @@ public interface Consts { String DESTINATION_TRADING_CLEARING_REGISTRY_AUTO_NEW = "trading-clearing-registry-auto-new"; String DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE = "trading-clearing-registry-update"; String DESTINATION_TRADING_CLEARING_REGISTRY_BLOCK = "trading-clearing-registry-block"; + String DESTINATION_TRADING_CLEARING_REGISTRY_CHECK = "trading-clearing-registry-check"; String CLEARING_NOTIFICATION_FEEDBACK = "clearing-notification-feedback"; String ACCOUNT_NOTIFICATION_FEEDBACK = "account-notification-feedback"; @@ -171,22 +174,22 @@ public interface Consts { String REGISTRY_RETURN_DEPOSIT_ACTION = "registry-return-deposit-action"; String REGISTRY_CHANGE_REFUND_DATE_ACTION = "registry-change-refund-date-action"; String REGISTRY_CHANGE_STATUS_EXTRACT_ACTION = "registry-change-status-extract-action"; - String REGISTRY_COVERED_DEAL_REGISTER_NEW = "registry-covered-deal-register-new"; - String REGISTRY_ADMITTED_DEAL_REGISTER_NEW = "registry-admitted-deal-register-new"; + @Deprecated String REGISTRY_COVERED_DEAL_REGISTER_NEW = "registry-covered-deal-register-new"; + @Deprecated String REGISTRY_ADMITTED_DEAL_REGISTER_NEW = "registry-admitted-deal-register-new"; String REGISTRY_DEAL_REGISTER_NEW = "registry-deal-register-new"; - String REGISTRY_DEPO_BALANCE_REGISTER_NEW = "registry-depo-balance-register-new"; - String REGISTRY_MONEY_BALANCE_REGISTER_NEW = "registry-money-balance-register-new"; - String REGISTRY_ADMITTED_LIABILITIES_REGISTER_NEW = "registry-admitted-liabilities-register-new"; - String REGISTRY_COVERED_LIABILITIES_REGISTER_NEW = "registry-covered-liabilities-register-new"; - String REGISTRY_MONEY_PAYMENT_INSTRUCTION_REGISTER_NEW = "registry-money-payment-instruction-register-new"; - String REGISTRY_DEPO_PAYMENT_INSTRUCTION_REGISTER_NEW = "registry-depo-payment-instruction-register-new"; - String REGISTRY_EXCLUDE_LIABILITIES_REGISTER_NEW = "registry-exclude-liabilities-register-new"; - String REGISTRY_LIABILITIES_REGISTER_NEW = "registry-liabilities-register-new"; - String REGISTRY_EXECUTION_REGISTER_ON_SAVE = "registry-execution-register-on-save"; - String REGISTRY_EXECUTION_REGISTER_UPDATE = "registry-execution-register-update"; + @Deprecated String REGISTRY_DEPO_BALANCE_REGISTER_NEW = "registry-depo-balance-register-new"; + @Deprecated String REGISTRY_MONEY_BALANCE_REGISTER_NEW = "registry-money-balance-register-new"; + @Deprecated String REGISTRY_ADMITTED_LIABILITIES_REGISTER_NEW = "registry-admitted-liabilities-register-new"; + @Deprecated String REGISTRY_COVERED_LIABILITIES_REGISTER_NEW = "registry-covered-liabilities-register-new"; + @Deprecated String REGISTRY_MONEY_PAYMENT_INSTRUCTION_REGISTER_NEW = "registry-money-payment-instruction-register-new"; + @Deprecated String REGISTRY_DEPO_PAYMENT_INSTRUCTION_REGISTER_NEW = "registry-depo-payment-instruction-register-new"; + @Deprecated String REGISTRY_EXCLUDE_LIABILITIES_REGISTER_NEW = "registry-exclude-liabilities-register-new"; + @Deprecated String REGISTRY_LIABILITIES_REGISTER_NEW = "registry-liabilities-register-new"; + @Deprecated String REGISTRY_EXECUTION_REGISTER_ON_SAVE = "registry-execution-register-on-save"; + @Deprecated String REGISTRY_EXECUTION_REGISTER_UPDATE = "registry-execution-register-update"; String REGISTRY_IDENTIFICATION_FUNDS = "registry-identification-funds"; - String DESTINATION_TRADING_CLEARING_REGISTRY_ON_TCRLIST_NEW = "registry-on-trading_clearing_registry_list-new"; + @Deprecated String DESTINATION_TRADING_CLEARING_REGISTRY_ON_TCRLIST_NEW = "registry-on-trading_clearing_registry_list-new"; String DESTINATION_CURRENCY_PAIR_SECURITIES_NEW = "currency-pair-securities-new"; @@ -206,6 +209,7 @@ public interface Consts { String REGISTRY_CLEAR_MEMBER_REGISTER_CHANGE_NEW = "registry-clear-member-register-change-new"; String REPORTS_TO_GATEWAY = "reports-to-gateway"; + String ACCOUNTS_TO_GATEWAY = "accounts-to-gateway"; String REGISTRY_NEW = "registry-new"; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountNewRequest.java index dcc8df01b..964b8b449 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountNewRequest.java @@ -27,6 +27,8 @@ public class BankAccountNewRequest { public Long companyId; @JsonProperty public String swiftCode; + @JsonProperty + private String intermediarySwiftCode; public String getBankIdentificationCode() { return bankIdentificationCode; @@ -123,4 +125,12 @@ public class BankAccountNewRequest { public void setSwiftCode(String swiftCode) { this.swiftCode = swiftCode; } + + public String getIntermediarySwiftCode() { + return intermediarySwiftCode; + } + + public void setIntermediarySwiftCode(String intermediarySwiftCode) { + this.intermediarySwiftCode = intermediarySwiftCode; + } } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountUpdateRequest.java index 688a473e0..ff513688a 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountUpdateRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/BankAccountUpdateRequest.java @@ -25,6 +25,8 @@ public class BankAccountUpdateRequest { public String account;//Номер счета @JsonProperty public String swiftCode; + @JsonProperty + private String intermediarySwiftCode; public Long getId() { return id; @@ -113,4 +115,12 @@ public class BankAccountUpdateRequest { public void setSwiftCode(String swiftCode) { this.swiftCode = swiftCode; } + + public String getIntermediarySwiftCode() { + return intermediarySwiftCode; + } + + public void setIntermediarySwiftCode(String intermediarySwiftCode) { + this.intermediarySwiftCode = intermediarySwiftCode; + } } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClientCodeNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClientCodeNewRequest.java index ed883bd8a..44c904b10 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClientCodeNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/ClientCodeNewRequest.java @@ -1,8 +1,7 @@ package ru.spcex.clearing.platform.messaging.domain.cud.account; -import com.fasterxml.jackson.annotation.JsonProperty; - import java.util.List; +import com.fasterxml.jackson.annotation.JsonProperty; public class ClientCodeNewRequest { @JsonProperty diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/CorrespondentAccountNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/CorrespondentAccountNewRequest.java index d27ab05a0..f430c86a2 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/CorrespondentAccountNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/CorrespondentAccountNewRequest.java @@ -1,8 +1,9 @@ package ru.spcex.clearing.platform.messaging.domain.cud.account; import com.fasterxml.jackson.annotation.JsonProperty; +import ru.spcex.platform.classes.base.interfaces.WithCurrency; -public class CorrespondentAccountNewRequest { +public class CorrespondentAccountNewRequest implements WithCurrency { @JsonProperty public Long companyId; @@ -57,4 +58,9 @@ public class CorrespondentAccountNewRequest { public void setCurrency(String currency) { this.currency = currency; } + + @Override + public String currency() { + return this.currency; + } } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/TkrAccount.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/TkrAccount.java new file mode 100644 index 000000000..61da8efe1 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/TkrAccount.java @@ -0,0 +1,80 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.account; + +import java.util.List; +import com.fasterxml.jackson.annotation.JsonProperty; +import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest; + +public class TkrAccount { + @JsonProperty + private String typeOperationClient; + @JsonProperty + private String companyId; + @JsonProperty + private Long tradingCode; + @JsonProperty + private String clientCode; + @JsonProperty + private Boolean enabled; + @JsonProperty + private String tkrCode; + @JsonProperty + private String depoAccount; + @JsonProperty + private List moneyAccounts; + + public String getCompanyId() { + return companyId; + } + + public void setCompanyId(String companyId) { + this.companyId = companyId; + } + + public Long getTradingCode() { + return tradingCode; + } + + public void setTradingCode(Long tradingCode) { + this.tradingCode = tradingCode; + } + + public String getClientCode() { + return clientCode; + } + + public void setClientCode(String clientCode) { + this.clientCode = clientCode; + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public String getTkrCode() { + return tkrCode; + } + + public void setTkrCode(String tkrCode) { + this.tkrCode = tkrCode; + } + + public String getDepoAccount() { + return depoAccount; + } + + public void setDepoAccount(String depoAccount) { + this.depoAccount = depoAccount; + } + + public List getMoneyAccounts() { + return moneyAccounts; + } + + public void setMoneyAccounts(List moneyAccounts) { + this.moneyAccounts = moneyAccounts; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/TkrAccountsGatewayRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/TkrAccountsGatewayRequest.java new file mode 100644 index 000000000..00870335c --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/TkrAccountsGatewayRequest.java @@ -0,0 +1,28 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.account; + +import java.util.List; +import java.util.UUID; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class TkrAccountsGatewayRequest { + @JsonProperty + private UUID requestId; + @JsonProperty + private List accounts; + + public UUID getRequestId() { + return requestId; + } + + public void setRequestId(UUID requestId) { + this.requestId = requestId; + } + + public List getAccounts() { + return accounts; + } + + public void setAccounts(List accounts) { + this.accounts = accounts; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/gateway/MoneyAccountMsgRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/gateway/MoneyAccountMsgRequest.java new file mode 100644 index 000000000..bb2a87322 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/gateway/MoneyAccountMsgRequest.java @@ -0,0 +1,28 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.gateway; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class MoneyAccountMsgRequest { + @JsonProperty("curr_code") + private String currCode; + @JsonProperty("account") + private String account; + @JsonProperty("status") + private String status; + + public String getCurrCode() { + return currCode; + } + + public void setCurrCode(String currCode) { + this.currCode = currCode; + } + + 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/gateway/MoneyAccountMsgResponse.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/gateway/MoneyAccountMsgResponse.java new file mode 100644 index 000000000..58f4f1661 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/gateway/MoneyAccountMsgResponse.java @@ -0,0 +1,46 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.gateway; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class MoneyAccountMsgResponse { + @JsonProperty("curr_code") + private String currCode; + @JsonProperty("account") + private String account; + @JsonProperty("eks_account") + private String eksAccount; + @JsonProperty("is_active") + private Boolean isActive; + + public String getCurrCode() { + return currCode; + } + + public void setCurrCode(String currCode) { + this.currCode = currCode; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getEksAccount() { + return eksAccount; + } + + public void setEksAccount(String eksAccount) { + this.eksAccount = eksAccount; + } + + public Boolean getActive() { + return isActive; + } + + public void setActive(Boolean active) { + isActive = active; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/gateway/SendTkrRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/gateway/SendTkrRequest.java new file mode 100644 index 000000000..ecec57639 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/gateway/SendTkrRequest.java @@ -0,0 +1,29 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.gateway; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class SendTkrRequest { + @JsonProperty + private UUID requestId; + @JsonProperty + private List tkrs = new ArrayList<>(); + + public UUID getRequestId() { + return requestId; + } + + public void setRequestId(UUID requestId) { + this.requestId = requestId; + } + + public List getTkrs() { + return tkrs; + } + + public void setTkrs(List tkrs) { + this.tkrs = tkrs; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/gateway/Tkr.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/gateway/Tkr.java new file mode 100644 index 000000000..5f64c256a --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/gateway/Tkr.java @@ -0,0 +1,108 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.gateway; + +import java.util.ArrayList; +import java.util.List; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Tkr { + @JsonProperty("company_id") + private String companyId; + @JsonProperty("trading_code") + private Long tradingCode; + @JsonProperty("client_code") + private String clientCode; + @JsonProperty("tkr_code") + private String tkrCode; + @JsonProperty("tkr_type") + private String tkrType; + @JsonProperty("account_type_name") + private String accountTypeName; + @JsonProperty("depo_account") + private String depoAccount; + @JsonProperty("is_active") + private Boolean isActive; + @JsonProperty("error_message") + private String errorMessage; + @JsonProperty("money_account") + private List moneyAccounts = new ArrayList<>(); + + public String getCompanyId() { + return companyId; + } + + public void setCompanyId(String companyId) { + this.companyId = companyId; + } + + public Long getTradingCode() { + return tradingCode; + } + + public void setTradingCode(Long tradingCode) { + this.tradingCode = tradingCode; + } + + public String getClientCode() { + return clientCode; + } + + public void setClientCode(String clientCode) { + this.clientCode = clientCode; + } + + public String getTkrCode() { + return tkrCode; + } + + public void setTkrCode(String tkrCode) { + this.tkrCode = tkrCode; + } + + public String getTkrType() { + return tkrType; + } + + public void setTkrType(String tkrType) { + this.tkrType = tkrType; + } + + public String getAccountTypeName() { + return accountTypeName; + } + + public void setAccountTypeName(String accountTypeName) { + this.accountTypeName = accountTypeName; + } + + public String getDepoAccount() { + return depoAccount; + } + + public void setDepoAccount(String depoAccount) { + this.depoAccount = depoAccount; + } + + public List getMoneyAccounts() { + return moneyAccounts; + } + + public void setMoneyAccounts(List moneyAccounts) { + this.moneyAccounts = moneyAccounts; + } + + public Boolean getActive() { + return isActive; + } + + public void setActive(Boolean active) { + isActive = active; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/schedule/LauncherCommandRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/schedule/LauncherCommandRequest.java index 939aa8aa6..be464313c 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/schedule/LauncherCommandRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/schedule/LauncherCommandRequest.java @@ -1,12 +1,16 @@ package ru.spcex.clearing.platform.messaging.domain.cud.schedule; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalTimeDeserializer; +import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalTimeSerializer; import java.math.BigDecimal; +import java.time.LocalDate; import java.time.LocalTime; public class LauncherCommandRequest { @@ -43,6 +47,8 @@ public class LauncherCommandRequest { @JsonProperty private Long addresseeId; @JsonProperty + private Long correspondentAccountId; + @JsonProperty private Long debitLeg_accountId; @JsonProperty private String swiftCode; @@ -51,6 +57,14 @@ public class LauncherCommandRequest { @JsonDeserialize(using = LocalTimeDeserializer.class) @JsonProperty public LocalTime fromTime; + @JsonSerialize(using = LocalDateSerializer.class) + @JsonDeserialize(using = LocalDateDeserializer.class) + @JsonProperty + public LocalDate fromDate; + @JsonSerialize(using = LocalDateSerializer.class) + @JsonDeserialize(using = LocalDateDeserializer.class) + @JsonProperty + public LocalDate toDate; public Long getUserId() { return userId; @@ -164,6 +178,14 @@ public class LauncherCommandRequest { this.addresseeId = addresseeId; } + public Long getCorrespondentAccountId() { + return correspondentAccountId; + } + + public void setCorrespondentAccountId(Long correspondentAccountId) { + this.correspondentAccountId = correspondentAccountId; + } + public Long getDebitLeg_accountId() { return debitLeg_accountId; } @@ -195,4 +217,20 @@ public class LauncherCommandRequest { public void setSwiftCode(String swiftCode) { this.swiftCode = swiftCode; } + + public LocalDate getFromDate() { + return fromDate; + } + + public void setFromDate(LocalDate fromDate) { + this.fromDate = fromDate; + } + + public LocalDate getToDate() { + return toDate; + } + + public void setToDate(LocalDate toDate) { + this.toDate = toDate; + } } diff --git a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/localization/SpringPropertiesLocalizer.java b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/localization/SpringPropertiesLocalizer.java new file mode 100644 index 000000000..02c21d1f4 --- /dev/null +++ b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/localization/SpringPropertiesLocalizer.java @@ -0,0 +1,41 @@ +package ru.spcex.platform.utils.localization; + +import java.util.Locale; +import org.springframework.context.support.ResourceBundleMessageSource; +import ru.spcex.platform.utils.enumeration.IEnumKey; + +/** + * Если в зависимостях не будет spring-context, кинет NoClassDefFound + */ +public class SpringPropertiesLocalizer { + private final ResourceBundleMessageSource errorMessages; + private Locale defaultLocale; + + public SpringPropertiesLocalizer(ResourceBundleMessageSource errorMessages) { + this.errorMessages = errorMessages; + this.defaultLocale = Locale.ENGLISH; + } + + public void setDefaultLocale(String defaultLocale) { + this.defaultLocale = new Locale(defaultLocale); + } + + public String resolve(IEnumKey msg, Locale locale, Object... args) { + return errorMessages.getMessage(msg.getKey(), args, locale); + } + + public String resolve(IEnumKey msg, Object... args) { + return errorMessages.getMessage(msg.getKey(), args, defaultLocale); + } + +// public String resolve(EnumMessage errorMessage, Locale locale) { +// Long id = errorMessage.getSubject().getId(); +// return errorMessages.getMessage(id.toString(), errorMessage.getArgs(), locale); + //String messageTemplate = +// if (errorMessage.getArgs().length > 0) +// return String.format(messageTemplate, errorMessage.getArgs()); +// else { +// return messageTemplate; +// } +// } +} diff --git a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/time/TimeUtil.java b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/time/TimeUtil.java index 3da417437..af410c60f 100644 --- a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/time/TimeUtil.java +++ b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/time/TimeUtil.java @@ -1,6 +1,7 @@ package ru.spcex.platform.utils.time; import java.sql.Time; +import java.sql.Timestamp; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; @@ -37,6 +38,18 @@ public class TimeUtil { return Date.from(instant); } + public static Timestamp toTimestampFromInstant(Instant instant) { + if (instant == null) return null; + return java.sql.Timestamp.from(instant); + } + + public static Instant instPlusMicros(Instant i, Long ms) { + if (ms == null) return i; + if (i == null) return null; + return i.plus(ms, ChronoUnit.MICROS); + + } + public static Date toDateFromLocalDateTime(LocalDateTime localDateTime) { return localDateTime != null ? Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()) : null; } diff --git a/platform-parent/pom.xml b/platform-parent/pom.xml index 0b5d0e566..fe6a75028 100644 --- a/platform-parent/pom.xml +++ b/platform-parent/pom.xml @@ -14,7 +14,7 @@ ru.spcex.clearing clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 diff --git a/pom.xml b/pom.xml index f6e229c58..5c80fbc6b 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ __parent_ROOT Clearing main parent pom - SPCEX-3.11.0.0 + SPCEX-3.12.7 clearing-parent @@ -24,7 +24,7 @@ 17 Maven - SPCEX-3.11.0.0 + SPCEX-3.12.7 2.6.3 diff --git a/z-distr/pom.xml b/z-distr/pom.xml index 80b1a4ebb..27caa6647 100644 --- a/z-distr/pom.xml +++ b/z-distr/pom.xml @@ -5,7 +5,7 @@ clearing ru.spcex.clearing - SPCEX-3.11.0.0 + SPCEX-3.12.7 4.0.0 @@ -17,6 +17,7 @@ ${project.basedir}/target/clearing ${project.basedir}/target/clearing/settings ${project.basedir}/target/clearing/bin + ${project.basedir}/target/clearing/services ${project.basedir}/target/clearing/db @@ -124,6 +125,10 @@ ${folder_root_clearing_backend-api}/target/backend-api.jar ${folder.clearing.distr.bin}/backend-api.jar + + ${folder_root_clearing_backend-api}/target/backend-api.jar + ${folder.clearing.distr.services}/backend-api/backend-api.jar + ${folder_root_clearing_backend-api}/src/main/resources/application.properties ${folder.clearing.distr.settings}/backend-api/application.properties @@ -151,6 +156,10 @@ ${folder_root_clearing_securities-service}/target/securities-service.jar ${folder.clearing.distr.bin}/securities-service.jar + + ${folder_root_clearing_securities-service}/target/securities-service.jar + ${folder.clearing.distr.services}/securities-service/securities-service.jar + ${folder_root_clearing_securities-service}/src/main/resources/application.properties ${folder.clearing.distr.settings}/securities-service/application.properties @@ -170,6 +179,10 @@ ${folder_root_clearing_imdg}/target/imdg-exec.jar ${folder.clearing.distr.bin}/imdg.jar + + ${folder_root_clearing_imdg}/target/imdg-exec.jar + ${folder.clearing.distr.services}/imdg/imdg.jar + ${folder_root_clearing_imdg}/src/main/resources/application.properties ${folder.clearing.distr.settings}/imdg/application.properties @@ -190,6 +203,10 @@ ${folder_root_clearing_imdg_hist}/target/imdg-hist.jar ${folder.clearing.distr.bin}/imdg-hist.jar + + ${folder_root_clearing_imdg_hist}/target/imdg-hist.jar + ${folder.clearing.distr.services}/imdg-hist/imdg-hist.jar + ${folder_root_clearing_imdg_hist}/src/main/resources/application.properties ${folder.clearing.distr.settings}/imdg-hist/application.properties @@ -210,6 +227,10 @@ ${folder_root_dbf-exporter}/target/dbf-exporter.jar ${folder.clearing.distr.bin}/dbf-exporter.jar + + ${folder_root_dbf-exporter}/target/dbf-exporter.jar + ${folder.clearing.distr.services}/dbf-exporter/dbf-exporter.jar + ${folder_root_dbf-exporter}/src/main/resources/application.properties ${folder.clearing.distr.settings}/dbf-exporter/application.properties @@ -229,6 +250,10 @@ ${folder_root_dbf-importer}/target/dbf-importer.jar ${folder.clearing.distr.bin}/dbf-importer.jar + + ${folder_root_dbf-importer}/target/dbf-importer.jar + ${folder.clearing.distr.services}/dbf-importer/dbf-importer.jar + ${folder_root_dbf-importer}/src/main/resources/application.properties ${folder.clearing.distr.settings}/dbf-importer/application.properties @@ -249,6 +274,10 @@ ${folder_root_lim-exporter}/target/lim-exporter.jar ${folder.clearing.distr.bin}/lim-exporter.jar + + ${folder_root_lim-exporter}/target/lim-exporter.jar + ${folder.clearing.distr.services}/lim-exporter/lim-exporter.jar + ${folder_root_lim-exporter}/src/main/resources/application.properties ${folder.clearing.distr.settings}/lim-exporter/application.properties @@ -268,6 +297,10 @@ ${folder_root_swt-exporter}/target/swt-exporter.jar ${folder.clearing.distr.bin}/swt-exporter.jar + + ${folder_root_swt-exporter}/target/swt-exporter.jar + ${folder.clearing.distr.services}/swt-exporter/swt-exporter.jar + ${folder_root_swt-exporter}/src/main/resources/application.properties ${folder.clearing.distr.settings}/swt-exporter/application.properties @@ -287,6 +320,10 @@ ${folder_root_swt-importer}/target/swt-importer.jar ${folder.clearing.distr.bin}/swt-importer.jar + + ${folder_root_swt-importer}/target/swt-importer.jar + ${folder.clearing.distr.services}/swt-importer/swt-importer.jar + ${folder_root_swt-importer}/src/main/resources/application.properties ${folder.clearing.distr.settings}/swt-importer/application.properties @@ -306,6 +343,10 @@ ${folder_root_trade-importer}/target/trade-importer.jar ${folder.clearing.distr.bin}/trade-importer.jar + + ${folder_root_trade-importer}/target/trade-importer.jar + ${folder.clearing.distr.services}/trade-importer/trade-importer.jar + ${folder_root_trade-importer}/src/main/resources/application.properties ${folder.clearing.distr.settings}/trade-importer/application.properties @@ -325,6 +366,10 @@ ${folder_root_extdb-importer}/target/extdb-importer.jar ${folder.clearing.distr.bin}/extdb-importer.jar + + ${folder_root_extdb-importer}/target/extdb-importer.jar + ${folder.clearing.distr.services}/extdb-importer/extdb-importer.jar + ${folder_root_extdb-importer}/src/main/resources/application.properties ${folder.clearing.distr.settings}/extdb-importer/application.properties @@ -344,6 +389,10 @@ ${folder_root_account-service}/target/account-service.jar ${folder.clearing.distr.bin}/account-service.jar + + ${folder_root_account-service}/target/account-service.jar + ${folder.clearing.distr.services}/account-service/account-service.jar + ${folder_root_account-service}/src/main/resources/application.properties ${folder.clearing.distr.settings}/account-service/application.properties @@ -363,6 +412,10 @@ ${folder_root_company-service}/target/company-service.jar ${folder.clearing.distr.bin}/company-service.jar + + ${folder_root_company-service}/target/company-service.jar + ${folder.clearing.distr.services}/company-service/company-service.jar + ${folder_root_company-service}/src/main/resources/application.properties ${folder.clearing.distr.settings}/company-service/application.properties @@ -382,6 +435,10 @@ ${folder_root_clearing-service}/target/clearing-service.jar ${folder.clearing.distr.bin}/clearing-service.jar + + ${folder_root_clearing-service}/target/clearing-service.jar + ${folder.clearing.distr.services}/clearing-service/clearing-service.jar + ${folder_root_clearing-service}/src/main/resources/application.properties ${folder.clearing.distr.settings}/clearing-service/application.properties @@ -401,6 +458,10 @@ ${folder_root_scheduler-service}/target/scheduler-service.jar ${folder.clearing.distr.bin}/scheduler-service.jar + + ${folder_root_scheduler-service}/target/scheduler-service.jar + ${folder.clearing.distr.services}/scheduler-service/scheduler-service.jar + ${folder_root_scheduler-service}/src/main/resources/application.properties ${folder.clearing.distr.settings}/scheduler-service/application.properties @@ -420,6 +481,10 @@ ${folder_root_reports-service}/target/reports-service.jar ${folder.clearing.distr.bin}/reports-service.jar + + ${folder_root_reports-service}/target/reports-service.jar + ${folder.clearing.distr.services}/reports-service/reports-service.jar + ${folder_root_reports-service}/src/main/resources/application.properties ${folder.clearing.distr.settings}/reports-service/application.properties @@ -439,6 +504,10 @@ ${folder_root_registry-service}/target/registry-service.jar ${folder.clearing.distr.bin}/registry-service.jar + + ${folder_root_registry-service}/target/registry-service.jar + ${folder.clearing.distr.services}/registry-service/registry-service.jar + ${folder_root_registry-service}/src/main/resources/application.properties ${folder.clearing.distr.settings}/registry-service/application.properties @@ -458,6 +527,10 @@ ${folder_root_utility-service}/target/utility-service.jar ${folder.clearing.distr.bin}/utility-service.jar + + ${folder_root_utility-service}/target/utility-service.jar + ${folder.clearing.distr.services}/utility-service/utility-service.jar + ${folder_root_utility-service}/src/main/resources/application.properties ${folder.clearing.distr.settings}/utility-service/application.properties @@ -480,6 +553,10 @@ ${folder.clearing.distr.bin}/gateway-api.jar + + ${folder_root_gateway-api}/target/gateway-api.jar + ${folder.clearing.distr.services}/gateway-api/gateway-api.jar + ${folder_root_gateway-api}/src/main/resources/application.properties