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
-
+
-
+
@@ -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 extends ExecutionCommon> 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 extends ExecutionCommon> findExecutionFondBySessionId(Long sessionId, SessionType sessionType) {
- Imdg extends ExecutionCommon> 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 extends ExecutionCommon> excImdg;
+ if (sessionType.equals(SessionType.CURR)) {
+ excImdg = executionCurrencyImdg;
+ } else {
+ excImdg = executionFondImdg;
+ }
+ return findExecutionFondBySessionId(sessionId, excImdg);
}
+ }
+
+ protected Collection extends ExecutionCommon> findExecutionFondBySessionId(
+ Long sessionId,
+ Imdg extends ExecutionCommon> 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 extends ExecutionCommon> 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 extends SpcexObjectBase> 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