Compare commits
124 commits
test
...
10_01_2024
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7c2ce48bd1 | ||
|
|
0fd9208e41 | ||
|
|
ab80d194a5 | ||
|
|
6590d63026 | ||
|
|
b96fcaae7d | ||
|
|
517dc8669a | ||
|
|
8df2442aa6 | ||
|
|
c959023094 | ||
|
|
54c3d7c235 | ||
|
|
892bdcb769 | ||
|
|
66ead14acb | ||
|
|
072a5dbcd9 | ||
|
|
730ae2aba4 | ||
|
|
5ad1b0d569 | ||
|
|
2a400e1a8a | ||
|
|
c8336ce8a4 | ||
|
|
08867e3cb9 | ||
|
|
999b0999de | ||
|
|
038f676eef | ||
|
|
c5a62a0bd4 | ||
|
|
ab34364a22 | ||
|
|
91b6f9efbc | ||
|
|
9a279eead8 | ||
|
|
c5f79afb50 | ||
|
|
de9619376b | ||
|
|
0dd5cec12e | ||
|
|
cd488b19d8 | ||
|
|
1ec2b25714 | ||
|
|
8fe43dee98 | ||
|
|
49b3191a63 | ||
|
|
2a81e33b78 | ||
|
|
313ff28cbd | ||
|
|
2656d6a78c | ||
|
|
dc21de68f2 | ||
|
|
2c2cc64595 | ||
|
|
17910bd224 | ||
|
|
02e2b3a3f2 | ||
|
|
fe48b00464 | ||
|
|
3f5fa0433f | ||
|
|
4e78439e54 | ||
|
|
673bb48938 | ||
|
|
0dc90cf828 | ||
|
|
afbe819255 | ||
|
|
9b8e68a94c | ||
|
|
d5e764131d | ||
|
|
793171b3da | ||
|
|
4bcc725c26 | ||
|
|
2da0ac042c | ||
|
|
99f4dbe292 | ||
|
|
4bd6dab4b1 | ||
|
|
e028aee516 | ||
|
|
7641b2691c | ||
|
|
970da463fc | ||
|
|
5639f9ff8b | ||
|
|
8e948bc27a | ||
|
|
0b2bef797e | ||
|
|
e04460b194 | ||
|
|
0c00c7fdb3 | ||
|
|
494bafbe18 | ||
|
|
4b1b6113f4 | ||
|
|
53198ca9f5 | ||
|
|
3e6b8911c9 | ||
|
|
1d4d831ea7 | ||
|
|
085b0cf4ce | ||
|
|
632bdf9e09 | ||
|
|
866c063b0d | ||
|
|
911c90bc45 | ||
|
|
8ae41b9d16 | ||
|
|
37a741e866 | ||
|
|
4a0df9bb48 | ||
|
|
939ea451a1 | ||
|
|
ee0f95fcde | ||
|
|
4581592380 | ||
|
|
4e431ee798 | ||
|
|
10d8803651 | ||
|
|
fac5dca462 | ||
|
|
06b38cc61f | ||
|
|
4dfb642e1b | ||
|
|
740c138ead | ||
|
|
0d134db9c6 | ||
|
|
deaa77a05c | ||
|
|
c86f1e907a | ||
|
|
04bc8e9edf | ||
|
|
e8cba0467a | ||
|
|
9f988d34c0 | ||
|
|
3fbb5931df | ||
|
|
15242a0a75 | ||
|
|
5cd8608584 | ||
|
|
943ec5f762 | ||
|
|
20f6c6a939 | ||
|
|
9e9a801bde | ||
|
|
a8386a9ed9 | ||
|
|
fd25105fe8 | ||
|
|
858e02084b | ||
|
|
eb3bed4a1d | ||
|
|
8079ec1fb3 | ||
|
|
cc2f20de3c | ||
|
|
145d3f4c74 | ||
|
|
e6ede79021 | ||
|
|
a2ebfd945b | ||
|
|
c7ad0a181c | ||
|
|
12ff85188f | ||
|
|
9c827763de | ||
|
|
59d0b000d1 | ||
|
|
60e7c6ac39 | ||
|
|
9b26fb2290 | ||
|
|
81c4c9fa99 | ||
|
|
9ac71532f7 | ||
|
|
79eaffbda6 | ||
|
|
8deebfafbb | ||
|
|
31de64e5bb | ||
|
|
afeede8baa | ||
|
|
286b3ace2c | ||
|
|
2f54dcaccf | ||
|
|
bcb4307acd | ||
|
|
0bc0f9461f | ||
|
|
681e612bbd | ||
|
|
b5b204bf5f | ||
|
|
a2dcd21867 | ||
|
|
9eff119ff2 | ||
|
|
2a61062eb9 | ||
|
|
fba4a07513 | ||
|
|
7b24b1d6ab | ||
|
|
e7c48f17e6 |
149 changed files with 4732 additions and 1264 deletions
|
|
@ -0,0 +1,101 @@
|
||||||
|
package ru.spcex.clearing.account.config.validation;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import ru.clearing.classes.statics.data.account.Account;
|
||||||
|
import ru.clearing.classes.statics.data.account.AccountSymbols;
|
||||||
|
import ru.spcex.clearing.account.errors.AccountError;
|
||||||
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountSymbolsNewRequest;
|
||||||
|
import ru.spcex.clearing.validation.common.rules.FieldNotBlankRequiredRule;
|
||||||
|
import ru.spcex.clearing.validation.common.rules.IdPresentRule;
|
||||||
|
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
||||||
|
import ru.spcex.platform.enumeration.AccountType;
|
||||||
|
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;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidator;
|
||||||
|
import ru.spcex.platform.utils.validation.ValidatorImpl;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class AccountSymbolsValidationConfig {
|
||||||
|
|
||||||
|
@Bean("accountSymbolsDepoNewRequest")
|
||||||
|
public Function<AccountSymbolsNewRequest, IValidator> accountSymbolsDepoNewRequestValidator(
|
||||||
|
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
|
||||||
|
) {
|
||||||
|
return accountSymbolsNewRequest -> {
|
||||||
|
ImdgValidationContext<AccountSymbolsNewRequest> context = new ImdgValidationContext<>();
|
||||||
|
context.setValidatedObject(accountSymbolsNewRequest);
|
||||||
|
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
|
||||||
|
addImdg.accept(IMDGDistributedNames.Map_Account);
|
||||||
|
addImdg.accept(IMDGDistributedNames.Map_AccountSymbols);
|
||||||
|
return new ValidatorImpl<>(context,
|
||||||
|
IdPresentRule.instance("accountId",
|
||||||
|
AccountSymbolsNewRequest::getAccountId,
|
||||||
|
IMDGDistributedNames.Map_Account,
|
||||||
|
Account.class,
|
||||||
|
AccountError.RequiredFieldEmpty,
|
||||||
|
AccountError.AccountNotFound,
|
||||||
|
true,
|
||||||
|
(Account account) -> {
|
||||||
|
if (AccountType.Depo.equalsByKey(account.getAccountType())) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return AccountError.AccountDepoTypeRequired;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
),
|
||||||
|
FieldNotBlankRequiredRule.instance("accountSymbolValue",
|
||||||
|
AccountSymbolsNewRequest::getAccountSymbolValue,
|
||||||
|
AccountError.RequiredFieldEmpty, true),
|
||||||
|
new DuplicateAccountSymbolsRule()
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static class DuplicateAccountSymbolsRule implements IValidationRule<ImdgValidationContext<AccountSymbolsNewRequest>> {
|
||||||
|
@Override
|
||||||
|
public Optional<EnumMessage> validate(ImdgValidationContext<AccountSymbolsNewRequest> context) {
|
||||||
|
AccountSymbolsNewRequest validatedObject = context.getValidatedObject();
|
||||||
|
Imdg<AccountSymbols> accountSymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
|
||||||
|
|
||||||
|
ImdgPredicateBuilder pb = accountSymbolsImdg.predicateBuilder();
|
||||||
|
ImdgPredicate query = pb.or(
|
||||||
|
pb.equals("accountId", validatedObject.getAccountId()),
|
||||||
|
pb.equals("accountSymbolValue", validatedObject.getAccountSymbolValue())
|
||||||
|
);
|
||||||
|
Collection<AccountSymbols> existAccSymbols = accountSymbolsImdg.getCollectionObjectsByPredicate(query);
|
||||||
|
|
||||||
|
if (existAccSymbols.isEmpty()) {
|
||||||
|
return empty();
|
||||||
|
} else {
|
||||||
|
AccountSymbols existAS = existAccSymbols.iterator().next();
|
||||||
|
String duplicateMsg = "";
|
||||||
|
if (validatedObject.getAccountId() != null && validatedObject.getAccountId().equals(existAS.getAccountId())) {
|
||||||
|
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
|
||||||
|
Account linkedAccount = accountImdg.getSingleObjectByID(existAS.getAccountId());
|
||||||
|
if (linkedAccount != null) {
|
||||||
|
duplicateMsg = linkedAccount.getAccount();
|
||||||
|
} else {
|
||||||
|
duplicateMsg = "" + existAS.getAccountId();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (validatedObject.getAccountSymbolValue() != null &&
|
||||||
|
validatedObject.getAccountSymbolValue().equals(existAS.getAccountSymbolValue())) {
|
||||||
|
if (!duplicateMsg.isEmpty())
|
||||||
|
duplicateMsg += ", ";
|
||||||
|
duplicateMsg += existAS.getAccountSymbolValue();
|
||||||
|
}
|
||||||
|
return of(AccountError.AccountAlreadyExist, duplicateMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -41,6 +41,7 @@ public class ValidationConfig {
|
||||||
addImdg.accept(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
|
addImdg.accept(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
|
||||||
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary, ServiceStatusDictionary.class);
|
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary, ServiceStatusDictionary.class);
|
||||||
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
|
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
|
||||||
|
addImdg.accept(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
|
||||||
|
|
||||||
//for ClientCodeValidationConfig
|
//for ClientCodeValidationConfig
|
||||||
addImdg.accept(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
|
addImdg.accept(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ public enum AccountError implements IErrorEnumId {
|
||||||
ClearingCompanySymbolNotFound(5022L), // Для компании %s отсутствует клиринговый код».
|
ClearingCompanySymbolNotFound(5022L), // Для компании %s отсутствует клиринговый код».
|
||||||
AccountForTradingClearingRegistryAlreadyUsed(5023L),
|
AccountForTradingClearingRegistryAlreadyUsed(5023L),
|
||||||
AccountFieldNotSet(5024L),
|
AccountFieldNotSet(5024L),
|
||||||
|
AccountDepoTypeRequired(5025L),
|
||||||
TradingClearingRegistryNotFound(3022L),
|
TradingClearingRegistryNotFound(3022L),
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,122 @@
|
||||||
|
package ru.spcex.clearing.account.service;
|
||||||
|
|
||||||
|
import org.apache.kafka.clients.consumer.Consumer;
|
||||||
|
import org.apache.kafka.clients.producer.Producer;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.clearing.classes.statics.data.account.*;
|
||||||
|
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.AccountSymbolsNewRequest;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest;
|
||||||
|
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
|
||||||
|
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
|
||||||
|
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.imdg.api.Imdg;
|
||||||
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidator;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class AccountSymbolsService extends QueueConsumer implements InitializingBean {
|
||||||
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
|
private final ValidationHelper validationHelper;
|
||||||
|
private final UserRoleVerification userRoleVerification;
|
||||||
|
|
||||||
|
private final ImdgProvider imdgProvider;
|
||||||
|
private final Imdg<AccountSymbols> accountSymbolsImdg;
|
||||||
|
|
||||||
|
private final RequestHelper requestHelper;
|
||||||
|
private final Function<AccountSymbolsNewRequest, IValidator> accountSymbolsNewRequestValidator;
|
||||||
|
|
||||||
|
private final IMessageResolver messageResolver;
|
||||||
|
private final Producer<String, Object> kafkaProducer;
|
||||||
|
private final KafkaSender kafkaSender;
|
||||||
|
|
||||||
|
public AccountSymbolsService(Consumer<String, Object> kafkaQueue,
|
||||||
|
Producer<String, Object> kafkaProducer,
|
||||||
|
KafkaSender kafkaSender,
|
||||||
|
ImdgProvider imdgProvider,
|
||||||
|
ValidationHelper validationHelper,
|
||||||
|
UserRoleVerification userRoleVerification,
|
||||||
|
IMessageResolver messageResolver,
|
||||||
|
RequestHelper requestHelper,
|
||||||
|
@Qualifier("accountSymbolsDepoNewRequest")
|
||||||
|
Function<AccountSymbolsNewRequest, IValidator> accountSymbolsNewRequestValidator
|
||||||
|
) {
|
||||||
|
super(kafkaQueue, kafkaProducer);
|
||||||
|
this.kafkaProducer = kafkaProducer;
|
||||||
|
this.kafkaSender = kafkaSender;
|
||||||
|
this.validationHelper = validationHelper;
|
||||||
|
this.userRoleVerification = userRoleVerification;
|
||||||
|
this.requestHelper = requestHelper;
|
||||||
|
this.imdgProvider = imdgProvider;
|
||||||
|
this.accountSymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
|
||||||
|
this.accountSymbolsNewRequestValidator = accountSymbolsNewRequestValidator;
|
||||||
|
this.messageResolver = messageResolver;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterPropertiesSet() throws Exception {
|
||||||
|
imdgProvider.waitAvailable();
|
||||||
|
callback(AccountSymbolsNewRequest.class)
|
||||||
|
.setFunction(this::accountSymbolsNew)
|
||||||
|
.forDestination(Consts.DESTINATION_DEPO_ACCOUNT_SYMBOLS_NEW, callbacks::put);
|
||||||
|
callback(CommonIdRequest.class)
|
||||||
|
.setFunction(this::accountSymbolsDelete)
|
||||||
|
.forDestination(Consts.DESTINATION_DEPO_ACCOUNT_SYMBOLS_DELETE, callbacks::put);
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RequestInfoUpdate accountSymbolsNew(BaseRequest<AccountSymbolsNewRequest> userRequest) {
|
||||||
|
log.debug("AccountSymbolsNewRequest received, id={}", userRequest.getId());
|
||||||
|
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
|
||||||
|
if (requestInfoUpdate != null) return requestInfoUpdate;
|
||||||
|
|
||||||
|
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountSymbolsNewRequestValidator);
|
||||||
|
if (requestInfoUpdate != null) return requestInfoUpdate;
|
||||||
|
|
||||||
|
AccountSymbolsNewRequest req = userRequest.getRequestPayload();
|
||||||
|
|
||||||
|
Long id = accountSymbolsImdg.nextIDSequenceFor();
|
||||||
|
AccountSymbols accountSymbols = new AccountSymbols();
|
||||||
|
accountSymbols.setId(id);
|
||||||
|
accountSymbols.setAccountId(req.getAccountId());
|
||||||
|
accountSymbols.setAccountSymbolValue(req.getAccountSymbolValue());
|
||||||
|
|
||||||
|
accountSymbolsImdg.insert(accountSymbols);
|
||||||
|
|
||||||
|
log.debug("successfully processed, id {}. New accountSymbols.id={} was created", id, accountSymbols.getId());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RequestInfoUpdate accountSymbolsDelete(BaseRequest<CommonIdRequest> userRequest) {
|
||||||
|
log.debug("AccountSymbolsDeleteRequest(CommonIdRequest) received, id={}", userRequest.getId());
|
||||||
|
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
|
||||||
|
if (requestInfoUpdate != null) return requestInfoUpdate;
|
||||||
|
|
||||||
|
CommonIdRequest req = userRequest.getRequestPayload();
|
||||||
|
|
||||||
|
AccountSymbols accountSymbols = accountSymbolsImdg.getSingleObjectByID(req.getId());
|
||||||
|
if (accountSymbols == null) {
|
||||||
|
return requestHelper.makeErrorResponse(userRequest, AccountError.AccountNotFound, req.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
accountSymbolsImdg.delete(accountSymbols);
|
||||||
|
|
||||||
|
log.debug("successfully processed, id {}. New accountSymbols.id={} was deleted", userRequest.getId(), accountSymbols.getId());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -70,6 +70,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
|
||||||
private final Function<ClearingAccountUpdateRequest, IValidator> clearingAccountUpdateRequestValidator;
|
private final Function<ClearingAccountUpdateRequest, IValidator> clearingAccountUpdateRequestValidator;
|
||||||
|
|
||||||
private final Imdg<Account> accountImdg;
|
private final Imdg<Account> accountImdg;
|
||||||
|
private final Imdg<ClearingAccount> clearingAccountImdg;
|
||||||
private final Imdg<Company> companyImdg;
|
private final Imdg<Company> companyImdg;
|
||||||
private final Imdg<Relation> relationImdg;
|
private final Imdg<Relation> relationImdg;
|
||||||
private final Imdg<ClearingMemberCategory> clearingMemberCategoryImdg;
|
private final Imdg<ClearingMemberCategory> clearingMemberCategoryImdg;
|
||||||
|
|
@ -103,6 +104,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
|
||||||
this.clearingAccountUpdateRequestValidator = clearingAccountUpdateRequestValidator;
|
this.clearingAccountUpdateRequestValidator = clearingAccountUpdateRequestValidator;
|
||||||
|
|
||||||
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
|
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
|
||||||
|
this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
|
||||||
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||||
this.relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class);
|
this.relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class);
|
||||||
this.clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
|
this.clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
|
||||||
|
|
@ -362,11 +364,16 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
|
||||||
);
|
);
|
||||||
Account account = sDf52.getAccount() == null ? null : accountImdg.getFirstObjectByFieldValues(accountQuery);
|
Account account = sDf52.getAccount() == null ? null : accountImdg.getFirstObjectByFieldValues(accountQuery);
|
||||||
if (account == null) {
|
if (account == null) {
|
||||||
String msg = messageResolver.resolve(new EnumMessage(AccountError.AccountNotFound, sDf52.getAccount()));
|
if (SDFProcessService.SDF52_STATUS_3Open.equals(sDf52.getStatus())) {
|
||||||
log.warn("By generationId={} s_df52[{}] (query: {}) error: {}", groupId, sDf52.getId(), accountQuery, msg);
|
log.debug("By generationId={} s_df52[{}].status={}, but account not found (query: {}). COntinuse with result OK for status 3",
|
||||||
toProcessSDF53.add(new MutableTriple<>(sDf52, null,
|
groupId, sDf52.getId(), sDf52.getStatus(), accountQuery);
|
||||||
makeSdfErrorText(AccountError.AccountNotFound, SDFProcessService.SDF_STATUS_ERROR_COMPANY_NOT_FOUND)));
|
} else {
|
||||||
continue;
|
String msg = messageResolver.resolve(new EnumMessage(AccountError.AccountNotFound, sDf52.getAccount()));
|
||||||
|
log.warn("By generationId={} s_df52[{}] (query: {}) error: {}", groupId, sDf52.getId(), accountQuery, msg);
|
||||||
|
toProcessSDF53.add(new MutableTriple<>(sDf52, null,
|
||||||
|
makeSdfErrorText(AccountError.AccountNotFound, SDFProcessService.SDF_STATUS_ERROR_COMPANY_NOT_FOUND)));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
toProcessSDF53.add(new MutableTriple<>(sDf52, account, SDFProcessService.SDF_STATUS_OK));
|
toProcessSDF53.add(new MutableTriple<>(sDf52, account, SDFProcessService.SDF_STATUS_OK));
|
||||||
toUpdate.add(new Pair<>(sDf52, account));
|
toUpdate.add(new Pair<>(sDf52, account));
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,11 @@ public class SDFProcessService {
|
||||||
public static final String SDF_STATUS_ERROR_NO_TRADE = "4"; // (Ошибка. Торги не идут)
|
public static final String SDF_STATUS_ERROR_NO_TRADE = "4"; // (Ошибка. Торги не идут)
|
||||||
public static final String SDF_STATUS_ERROR = "9"; // (Другие ошибки, выявленные в КС) - если получены другие ошибки (т.е. account НЕ обновлена по sDf52).
|
public static final String SDF_STATUS_ERROR = "9"; // (Другие ошибки, выявленные в КС) - если получены другие ошибки (т.е. account НЕ обновлена по sDf52).
|
||||||
|
|
||||||
|
protected static final Long SDF52_STATUS_0Blocked = 0L;
|
||||||
|
protected static final Long SDF52_STATUS_1Unblocked = 1L;
|
||||||
|
protected static final Long SDF52_STATUS_2Closed = 2L;
|
||||||
|
protected static final Long SDF52_STATUS_3Open = 3L;
|
||||||
|
|
||||||
final protected Logger log = LoggerFactory.getLogger(getClass());
|
final protected Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
protected final Producer<String, Object> kafkaResponseQueue;
|
protected final Producer<String, Object> kafkaResponseQueue;
|
||||||
|
|
@ -129,12 +134,12 @@ public class SDFProcessService {
|
||||||
* @return AccountStatus или null
|
* @return AccountStatus или null
|
||||||
*/
|
*/
|
||||||
public AccountStatus parseSdf52Status(Long status) {
|
public AccountStatus parseSdf52Status(Long status) {
|
||||||
if (Long.valueOf(1L).equals(status) || Long.valueOf(3L).equals(status)) {
|
if (SDF52_STATUS_1Unblocked.equals(status) || SDF52_STATUS_3Open.equals(status)) {
|
||||||
return AccountStatus.ACTIVE;
|
return AccountStatus.ACTIVE;
|
||||||
} else if (Long.valueOf(0L).equals(status)) {
|
} else if (SDF52_STATUS_0Blocked.equals(status)) {
|
||||||
return AccountStatus.BLOCKED;
|
return AccountStatus.BLOCKED;
|
||||||
}
|
}
|
||||||
if (Long.valueOf(2L).equals(status)) {
|
if (SDF52_STATUS_2Closed.equals(status)) {
|
||||||
return AccountStatus.CLOSE;
|
return AccountStatus.CLOSE;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,164 @@
|
||||||
|
package ru.spcex.clearing.account.service;
|
||||||
|
|
||||||
|
import org.apache.kafka.clients.consumer.MockConsumer;
|
||||||
|
import org.apache.kafka.clients.producer.Producer;
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
import org.springframework.kafka.core.KafkaTemplate;
|
||||||
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||||
|
import ru.clearing.classes.statics.data.account.*;
|
||||||
|
import ru.spcex.clearing.account.config.BeanConfiguration;
|
||||||
|
import ru.spcex.clearing.account.config.validation.AccountSymbolsValidationConfig;
|
||||||
|
import ru.spcex.clearing.account.config.validation.ValidationConfig;
|
||||||
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountSymbolsNewRequest;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
|
||||||
|
import ru.spcex.clearing.test.MatcherFactory;
|
||||||
|
import ru.spcex.clearing.test.TestObjectCreator;
|
||||||
|
import ru.spcex.clearing.test.config.ImdgTestConfig;
|
||||||
|
import ru.spcex.clearing.test.config.KafkaTestConfig;
|
||||||
|
import ru.spcex.platform.enumeration.*;
|
||||||
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.annotation.PreDestroy;
|
||||||
|
|
||||||
|
import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator;
|
||||||
|
import static ru.spcex.clearing.test.TestUtils.*;
|
||||||
|
import static ru.spcex.clearing.test.config.KafkaTestConfig.setMockFuture;
|
||||||
|
|
||||||
|
@ExtendWith(SpringExtension.class)
|
||||||
|
@ContextConfiguration(classes = {
|
||||||
|
BeanConfiguration.class,
|
||||||
|
ValidationConfig.class,
|
||||||
|
AccountSymbolsValidationConfig.class,
|
||||||
|
AccountSymbolsService.class,
|
||||||
|
ImdgTestConfig.class,
|
||||||
|
KafkaTestConfig.class})
|
||||||
|
class AccountSymbolsServiceTest {
|
||||||
|
public static final MatcherFactory.Matcher<AccountSymbols> ACCOUNT_SYMBOL_MATCHER = usingIgnoringFieldsComparator();
|
||||||
|
private static final int PARTITION = 0;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
AccountSymbolsService accountSymbolsService;
|
||||||
|
@Autowired
|
||||||
|
@Qualifier("hazelcastServiceTest")
|
||||||
|
private ImdgProvider hazelcastServiceTest;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
@Qualifier("mockProducer")
|
||||||
|
protected Producer<String, Object> mockProducer;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
@Qualifier("kafkaTestTemplate")
|
||||||
|
protected KafkaTemplate<String, Object> kafkaTemplate;
|
||||||
|
|
||||||
|
private Imdg<AccountSymbols> accountSymbolsImdg;
|
||||||
|
|
||||||
|
private Imdg<Account> accountImdg;
|
||||||
|
private Long accountId;
|
||||||
|
private Imdg<ClearingAccount> clearingAccountImdg;
|
||||||
|
private Long clearingAccountId;
|
||||||
|
|
||||||
|
static int newRequestCnt = 0;
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
private void init() {
|
||||||
|
hazelcastServiceTest.waitAvailable();
|
||||||
|
accountSymbolsImdg = hazelcastServiceTest.getImdg(
|
||||||
|
IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class
|
||||||
|
);
|
||||||
|
accountImdg = hazelcastServiceTest.getImdg(
|
||||||
|
IMDGDistributedNames.Map_Account, Account.class
|
||||||
|
);
|
||||||
|
clearingAccountImdg = hazelcastServiceTest.getImdg(
|
||||||
|
IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class
|
||||||
|
);
|
||||||
|
|
||||||
|
Account account = new Account();
|
||||||
|
account.setStatus(ServiceStatus.Active.getKey());
|
||||||
|
account.setAccountType(AccountType.Clrn.getKey());
|
||||||
|
accountId = accountImdg.insert(account);
|
||||||
|
|
||||||
|
ClearingAccount clearingAccount = new ClearingAccount();
|
||||||
|
clearingAccount.setAccountId(accountId);
|
||||||
|
clearingAccount.setClearingAccountType("CAT");
|
||||||
|
clearingAccountId = clearingAccountImdg.insert(clearingAccount);
|
||||||
|
|
||||||
|
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PreDestroy
|
||||||
|
private void destroyTest() {
|
||||||
|
//clean test data
|
||||||
|
Account account = accountImdg.getSingleObjectByID(accountId);
|
||||||
|
if (account != null)
|
||||||
|
accountImdg.delete(account);
|
||||||
|
ClearingAccount clearingAccount = clearingAccountImdg.getSingleObjectByID(clearingAccountId);
|
||||||
|
if (clearingAccount != null)
|
||||||
|
clearingAccountImdg.delete(clearingAccount);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void tradingClearingRegistryNew_moneyAccount_clearingAccount() {
|
||||||
|
setMockFuture(kafkaTemplate);
|
||||||
|
AccountSymbolsNewRequest accountSymbolsNewRequest = new AccountSymbolsNewRequest();
|
||||||
|
accountSymbolsNewRequest.setAccountId(accountId);
|
||||||
|
accountSymbolsNewRequest.setAccountSymbolValue("SYMBOL1");
|
||||||
|
|
||||||
|
AccountSymbols predictableAccountSymbols = new AccountSymbols();
|
||||||
|
predictableAccountSymbols.setAccountId(accountId);
|
||||||
|
predictableAccountSymbols.setAccountSymbolValue("SYMBOL1");
|
||||||
|
|
||||||
|
String jsonString = getJsonStringForNew(accountSymbolsNewRequest, 0L);
|
||||||
|
|
||||||
|
addRecordToKafka((MockConsumer) accountSymbolsService.getConsumer(),
|
||||||
|
Consts.DESTINATION_DEPO_ACCOUNT_SYMBOLS_NEW,
|
||||||
|
newRequestCnt,
|
||||||
|
0,
|
||||||
|
jsonString);
|
||||||
|
|
||||||
|
waitingSendAndCheckRecord(0L, mockProducer);
|
||||||
|
|
||||||
|
AccountSymbols resultNew = accountSymbolsImdg.getAllValues().iterator().next();
|
||||||
|
predictableAccountSymbols.setId(resultNew.getId());
|
||||||
|
|
||||||
|
ACCOUNT_SYMBOL_MATCHER.assertMatch(resultNew, predictableAccountSymbols);
|
||||||
|
accountSymbolsImdg.delete(resultNew); // cleanup test
|
||||||
|
|
||||||
|
newRequestCnt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void tradingClearingRegistryDelete() {
|
||||||
|
AccountSymbols existAccountSymbols = new AccountSymbols();
|
||||||
|
existAccountSymbols.setAccountId(accountId);
|
||||||
|
existAccountSymbols.setAccountSymbolValue("SYMBOL 2");
|
||||||
|
Long accountSymbolId = accountSymbolsImdg.insert(existAccountSymbols);
|
||||||
|
|
||||||
|
CommonDeleteRequest accountSymbolsDeleteRequest = new CommonDeleteRequest();
|
||||||
|
accountSymbolsDeleteRequest.setId(accountSymbolId);
|
||||||
|
|
||||||
|
String jsonString = getJsonStringForDelete(accountSymbolsDeleteRequest, 0);
|
||||||
|
|
||||||
|
//ACT
|
||||||
|
addRecordToKafka((MockConsumer) accountSymbolsService.getConsumer(),
|
||||||
|
Consts.DESTINATION_DEPO_ACCOUNT_SYMBOLS_DELETE,
|
||||||
|
PARTITION,
|
||||||
|
0,
|
||||||
|
jsonString);
|
||||||
|
|
||||||
|
//ASSERT
|
||||||
|
waitingSendAndCheckRecord(0L, mockProducer);
|
||||||
|
|
||||||
|
AccountSymbols resultUpdating = accountSymbolsImdg.getSingleObjectByID(accountSymbolId);
|
||||||
|
Assertions.assertNull(resultUpdating, "Должен был удалиться");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -195,6 +195,19 @@
|
||||||
</fileMapper>
|
</fileMapper>
|
||||||
</fileMappers>
|
</fileMappers>
|
||||||
</transformationSet>
|
</transformationSet>
|
||||||
|
<transformationSet>
|
||||||
|
<dir>src/main/resources/meta</dir>
|
||||||
|
<includes>
|
||||||
|
<include>data_initial.xml</include>
|
||||||
|
</includes>
|
||||||
|
<stylesheet>src/main/resources/meta/xsl/data.xsl</stylesheet>
|
||||||
|
<fileMappers>
|
||||||
|
<fileMapper
|
||||||
|
implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
|
||||||
|
<targetExtension>data_initial.sql</targetExtension>
|
||||||
|
</fileMapper>
|
||||||
|
</fileMappers>
|
||||||
|
</transformationSet>
|
||||||
</transformationSets>
|
</transformationSets>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
package ru.spcex.clearing.backendapi.config;
|
package ru.spcex.clearing.backendapi.config;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
|
|
@ -11,6 +13,8 @@ import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
public class BackEndApiImdgConfig {
|
public class BackEndApiImdgConfig {
|
||||||
|
Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
@Bean(name = "taskExecutorHazelcastClientInitializer")
|
@Bean(name = "taskExecutorHazelcastClientInitializer")
|
||||||
public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() {
|
public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() {
|
||||||
return createThreadPoolTaskExecutor(1, true);
|
return createThreadPoolTaskExecutor(1, true);
|
||||||
|
|
@ -38,6 +42,10 @@ public class BackEndApiImdgConfig {
|
||||||
@Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter,
|
@Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter,
|
||||||
BackendApiSettings clientSetting
|
BackendApiSettings clientSetting
|
||||||
) {
|
) {
|
||||||
|
if (clientSetting.getHazelcast() == null || clientSetting.getHazelcast().getClusterMembers() == null) {
|
||||||
|
log.warn("Property \"backend-api.hazelcast.cluster-members\" not set!");
|
||||||
|
throw new IllegalArgumentException("Property \"backend-api.hazelcast.cluster-members\" not set");
|
||||||
|
}
|
||||||
ImdgProvider imdg = new HazelcastService(taskExecutorHazelcastClientInitializer,
|
ImdgProvider imdg = new HazelcastService(taskExecutorHazelcastClientInitializer,
|
||||||
taskExecutorIdGeneratorAwaiter,
|
taskExecutorIdGeneratorAwaiter,
|
||||||
clientSetting.getHazelcast());
|
clientSetting.getHazelcast());
|
||||||
|
|
@ -52,6 +60,10 @@ public class BackEndApiImdgConfig {
|
||||||
@Qualifier("taskExecutorIdGeneratorAwaiterHist") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter,
|
@Qualifier("taskExecutorIdGeneratorAwaiterHist") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter,
|
||||||
BackendApiSettings clientSetting
|
BackendApiSettings clientSetting
|
||||||
) {
|
) {
|
||||||
|
if (clientSetting.getHazelcastSearch() == null || clientSetting.getHazelcastSearch().getClusterMembers() == null) {
|
||||||
|
log.warn("Property \"backend-api.hazelcast-search.cluster-members\" not set!");
|
||||||
|
// может работать без history, но history будет недоступна
|
||||||
|
}
|
||||||
ImdgProvider imdg = new HazelcastService(taskExecutorHazelcastClientInitializer,
|
ImdgProvider imdg = new HazelcastService(taskExecutorHazelcastClientInitializer,
|
||||||
taskExecutorIdGeneratorAwaiter,
|
taskExecutorIdGeneratorAwaiter,
|
||||||
clientSetting.getHazelcastSearch());
|
clientSetting.getHazelcastSearch());
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,71 @@
|
||||||
|
package ru.spcex.clearing.backendapi.controller.queue.account;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import io.swagger.annotations.ApiParam;
|
||||||
|
import io.swagger.annotations.ApiResponse;
|
||||||
|
import io.swagger.annotations.ApiResponses;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import ru.clearing.classes.statics.data.account.AccountSymbols;
|
||||||
|
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
|
||||||
|
import ru.spcex.clearing.backendapi.controller.request.cud.account.AccountSymbolsNewAction;
|
||||||
|
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
|
||||||
|
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
|
||||||
|
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
|
||||||
|
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
|
||||||
|
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 java.util.Collection;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@RequestMapping("/accounting/depo-accounts-symbols")
|
||||||
|
public class AccountSymbolsController extends AbstractQueueController {
|
||||||
|
private final IStateLoader stateLoader;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public AccountSymbolsController(IOperator operator, IStateLoader stateLoader) {
|
||||||
|
super(operator);
|
||||||
|
this.stateLoader = stateLoader;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "get all accounts-symbols.")
|
||||||
|
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
|
||||||
|
@RequestMapping(method = RequestMethod.GET)
|
||||||
|
@ResponseBody
|
||||||
|
public CommonGetAllResponse getAll() {
|
||||||
|
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
|
||||||
|
CommonGetAllResponse response = new CommonGetAllResponse();
|
||||||
|
response.fromEntity(all);
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ApiOperation(value = "create AccountSymbols.")
|
||||||
|
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
|
||||||
|
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
@ResponseBody
|
||||||
|
public CudResponse add(
|
||||||
|
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
|
||||||
|
@RequestBody AccountSymbolsNewAction accountNewAction) throws ExecutionException, InterruptedException {
|
||||||
|
return processRequest(Consts.DESTINATION_DEPO_ACCOUNT_SYMBOLS_NEW, accountNewAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "delete AccountSymbols.")
|
||||||
|
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
|
||||||
|
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
|
||||||
|
@ResponseBody
|
||||||
|
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
|
||||||
|
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
|
||||||
|
CommonDeleteAction deleteAction = new CommonDeleteAction();
|
||||||
|
deleteAction.setId(id);
|
||||||
|
return processRequest(Consts.DESTINATION_DEPO_ACCOUNT_SYMBOLS_DELETE, deleteAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -46,7 +46,7 @@ public class HistController {
|
||||||
|
|
||||||
@ApiOperation(value = "Get history")
|
@ApiOperation(value = "Get history")
|
||||||
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
|
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
|
||||||
@RequestMapping(path = "/all", method = RequestMethod.GET)
|
@RequestMapping(method = RequestMethod.GET)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public CommonGetAllResponse getHistory(
|
public CommonGetAllResponse getHistory(
|
||||||
@ApiParam(value = "destination сущности по которой запрашивается история", example = "money-balance-registers", required = true)
|
@ApiParam(value = "destination сущности по которой запрашивается история", example = "money-balance-registers", required = true)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
package ru.spcex.clearing.backendapi.controller.request.cud.account;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import ru.spcex.clearing.backendapi.domain.actions.IAction;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.ActionType;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountSymbolsNewRequest;
|
||||||
|
|
||||||
|
public class AccountSymbolsNewAction implements IAction<AccountSymbolsNewRequest> {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "Номер счета", example = "1200")
|
||||||
|
@JsonProperty
|
||||||
|
private Long accountId;
|
||||||
|
@ApiModelProperty(value = "Значение реквизита", example = "ABCD")
|
||||||
|
@JsonProperty
|
||||||
|
private String accountSymbolValue;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AccountSymbolsNewRequest toRequest() {
|
||||||
|
var req = new AccountSymbolsNewRequest();
|
||||||
|
req.setAccountId(this.accountId);
|
||||||
|
req.setAccountSymbolValue(this.accountSymbolValue);
|
||||||
|
return req;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ApiModelProperty(hidden = true)
|
||||||
|
@Override
|
||||||
|
public ActionType getActionType() {
|
||||||
|
return ActionType.NEW;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getAccountId() {
|
||||||
|
return accountId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccountId(Long accountId) {
|
||||||
|
this.accountId = accountId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAccountSymbolValue() {
|
||||||
|
return accountSymbolValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccountSymbolValue(String accountSymbolValue) {
|
||||||
|
this.accountSymbolValue = accountSymbolValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<meta version="3.5.0.14">
|
<meta version="3.9.0.68">
|
||||||
<enums>
|
<enums>
|
||||||
<allowed id="1" code="ALWD" name="Разрешено"/>
|
<allowed id="1" code="ALWD" name="Разрешено"/>
|
||||||
<allowed id="2" code="DEND" name="Запрещено"/>
|
<allowed id="2" code="DEND" name="Запрещено"/>
|
||||||
|
|
@ -156,7 +156,7 @@
|
||||||
<registryUnit id="5" code="U" name="Невыясненные"/>
|
<registryUnit id="5" code="U" name="Невыясненные"/>
|
||||||
<registryUnit id="5" code="I" name="Списания/зачисления"/>
|
<registryUnit id="5" code="I" name="Списания/зачисления"/>
|
||||||
<registryUnit id="7" code="V" name="Выписка"/>
|
<registryUnit id="7" code="V" name="Выписка"/>
|
||||||
<registryCode id="1" code="AMAT" name="Денежные средства - общие"/>
|
<registryCode id="1" code="AMAT" name="Денежные средства Участника клиринга, зарезервированные на торги"/>
|
||||||
<registryCode id="2" code="AMAF" name="Денежные средства - свободные"/>
|
<registryCode id="2" code="AMAF" name="Денежные средства - свободные"/>
|
||||||
<registryCode id="3" code="AMAB" name="Денежные средства - блокированные"/>
|
<registryCode id="3" code="AMAB" name="Денежные средства - блокированные"/>
|
||||||
<registryCode id="4" code="TMAT" name="Требования по деньгам"/>
|
<registryCode id="4" code="TMAT" name="Требования по деньгам"/>
|
||||||
|
|
@ -167,7 +167,7 @@
|
||||||
<registryCode id="9" code="LSAT" name="Рассчитанные обязательства по бумагам"/>
|
<registryCode id="9" code="LSAT" name="Рассчитанные обязательства по бумагам"/>
|
||||||
<registryCode id="10" code="LMAT" name="Рассчитанные обязательства по деньгам"/>
|
<registryCode id="10" code="LMAT" name="Рассчитанные обязательства по деньгам"/>
|
||||||
<registryCode id="11" code="CSAT" name="Рассчитанные требования по бумагам"/>
|
<registryCode id="11" code="CSAT" name="Рассчитанные требования по бумагам"/>
|
||||||
<registryCode id="12" code="AMBT" name="Денежные средства клиента - общие"/>
|
<registryCode id="12" code="AMBT" name="Денежные средства Участника клиринга, зарезервированные на торги – клиенты"/>
|
||||||
<registryCode id="13" code="AMBF" name="Денежные средства клиента - свободные"/>
|
<registryCode id="13" code="AMBF" name="Денежные средства клиента - свободные"/>
|
||||||
<registryCode id="14" code="AMBB" name="Денежные средства клиента - блокированные"/>
|
<registryCode id="14" code="AMBB" name="Денежные средства клиента - блокированные"/>
|
||||||
<registryCode id="15" code="TMBT" name="Требования по деньгам (кл)"/>
|
<registryCode id="15" code="TMBT" name="Требования по деньгам (кл)"/>
|
||||||
|
|
@ -180,14 +180,18 @@
|
||||||
<registryCode id="22" code="CSBT" name="Рассчитанные требования по бумагам (кл)"/>
|
<registryCode id="22" code="CSBT" name="Рассчитанные требования по бумагам (кл)"/>
|
||||||
<registryCode id="23" code="DMAT" name="Возврат депозита"/>
|
<registryCode id="23" code="DMAT" name="Возврат депозита"/>
|
||||||
<registryCode id="24" code="DMBT" name="Возврат депозита (кл)"/>
|
<registryCode id="24" code="DMBT" name="Возврат депозита (кл)"/>
|
||||||
<registryCode id="25" code="ASAT" name="Ценные бумаги - общие"/>
|
<registryCode id="25" code="ASAT" name="Ценные бумаги Участника клиринга – свои"/>
|
||||||
<registryCode id="26" code="ASAF" name="Ценные бумаги - свободные"/>
|
<registryCode id="26" code="ASAF" name="Ценные бумаги - свободные"/>
|
||||||
<registryCode id="27" code="ASAB" name="Ценные бумаги - блокированные"/>
|
<registryCode id="27" code="ASAB" name="Ценные бумаги - блокированные"/>
|
||||||
<registryCode id="28" code="DMAX" name="Возврат инициатору"/>
|
<registryCode id="28" code="DMAX" name="Возврат инициатору"/>
|
||||||
<registryCode id="29" code="DMBX" name="Возврат инициатору (кл)"/>
|
<registryCode id="29" code="DMBX" name="Возврат инициатору (кл)"/>
|
||||||
<registryCode id="30" code="DMAU" name="Денежные средства - невыясненные"/>
|
<registryCode id="30" code="DMAU" name="Денежные средства - невыясненные"/>
|
||||||
<registryCode id="31" code="DMAV" name="Треб. выписки"/>
|
<registryCode id="31" code="DMAV" name="Треб. выписки"/>
|
||||||
<registryCode id="32" code="ASZT" name="Ценные бумаги - общие"/>
|
<registryCode id="32" code="ASZT" name="Ценные бумаги для размещения/выкупа"/>
|
||||||
|
<registryCode id="33" code="ASBT" name="Ценные бумаги Участника клиринга – клиенты"/>
|
||||||
|
<registryCode id="34" code="ASCT" name="Ценные бумаги Участника клиринга – клиенты-нерезиденты"/>
|
||||||
|
<registryCode id="35" code="AMCT" name="Денежные средства Участника клиринга, зарезервированные на торги – клиенты"/>
|
||||||
|
<registryCode id="36" code="ASXT" name="Ценные бумаги Участника клиринга – ДУ"/>
|
||||||
<registryStatus id="1" code="OK" name="Рассчитано"/>
|
<registryStatus id="1" code="OK" name="Рассчитано"/>
|
||||||
<registryStatus id="2" code="UNCV" name="Не исполнено"/>
|
<registryStatus id="2" code="UNCV" name="Не исполнено"/>
|
||||||
<registryStatus id="3" code="FAIL" name="Не исполнено контрагентом"/>
|
<registryStatus id="3" code="FAIL" name="Не исполнено контрагентом"/>
|
||||||
|
|
@ -249,6 +253,7 @@
|
||||||
<task id="26" code="SDEP" name="Время начала возврата депозитов"/>
|
<task id="26" code="SDEP" name="Время начала возврата депозитов"/>
|
||||||
<task id="27" code="EDEP" name="Время завершения возврата депозитов"/>
|
<task id="27" code="EDEP" name="Время завершения возврата депозитов"/>
|
||||||
<task id="28" code="CHDF" name="Проверка наличия пары ДФ-01/ДФ-57 и ДФ-08/ДФ-21"/>
|
<task id="28" code="CHDF" name="Проверка наличия пары ДФ-01/ДФ-57 и ДФ-08/ДФ-21"/>
|
||||||
|
<task id="29" code="CCLR" name="Завершение неудачных клиринговых сессий"/>
|
||||||
<taskStatus id="1" code="ACTV" name="Активна"/>
|
<taskStatus id="1" code="ACTV" name="Активна"/>
|
||||||
<taskStatus id="2" code="BLKD" name="Не активна"/>
|
<taskStatus id="2" code="BLKD" name="Не активна"/>
|
||||||
<taskStatus id="3" code="CNCL" name="Отмена расписания"/>
|
<taskStatus id="3" code="CNCL" name="Отмена расписания"/>
|
||||||
|
|
@ -428,7 +433,8 @@
|
||||||
<errorCode id="5019" code="ACNT" name="Для компании %s отсутствует категория %s."/>
|
<errorCode id="5019" code="ACNT" name="Для компании %s отсутствует категория %s."/>
|
||||||
<errorCode id="5022" code="ACNT" name="Для компании %s отсутствует клиринговый код."/>
|
<errorCode id="5022" code="ACNT" name="Для компании %s отсутствует клиринговый код."/>
|
||||||
<errorCode id="5023" code="ACNT" name="Счет %s уже используется."/>
|
<errorCode id="5023" code="ACNT" name="Счет %s уже используется."/>
|
||||||
<errorCode id="5024" code="ACNT" name="Не указан номер счета."/>
|
<errorCode id="5024" code="ACNT" name="Не указан номер счета."/>
|
||||||
|
<errorCode id="5025" code="ACNT" name="Необходимо указать ДЕПО счет."/>
|
||||||
<!-- error code for balance-service -->
|
<!-- error code for balance-service -->
|
||||||
<errorCode id="5200" code="BLNC" name="Общая ошибка модуля balance-service."/>
|
<errorCode id="5200" code="BLNC" name="Общая ошибка модуля balance-service."/>
|
||||||
<errorCode id="5210" code="BLNC" name="Клиринговая сессия неактивна."/>
|
<errorCode id="5210" code="BLNC" name="Клиринговая сессия неактивна."/>
|
||||||
|
|
@ -526,90 +532,6 @@
|
||||||
|
|
||||||
</enums>
|
</enums>
|
||||||
<objects>
|
<objects>
|
||||||
<company id="1" fullName="АО Санкт-Петербургская Валютная Биржа" shortName="СПВБ" tradingCode="" clearingCode="" workflowStatus="ACTV"/>
|
|
||||||
<company id="2" fullName="ЗАО «Петербургский Расчетный Центр»" shortName="ПРЦ" tradingCode="" clearingCode="" workflowStatus="ACTV"/>
|
|
||||||
<company id="3" fullName="Торговая организация" shortName="ТС" tradingCode="" clearingCode="" workflowStatus="ACTV"/>
|
|
||||||
<company id="4" fullName="ЗАО «Санкт-Петербургский Расчетно-Депозитарный Центр»" shortName="РДЦ" tradingCode="" clearingCode="" workflowStatus="ACTV"/>
|
|
||||||
<!--company id="5" fullName="Центральный Банк Российской Федерации" shortName="ЦБ РФ" tradingCode="" clearingCode="" workflowStatus="ACTV"/-->
|
|
||||||
<companySymbols id="1" companyId="1" companySymbol="BIC" companySymbolValue="044030920"/>
|
|
||||||
<companySymbols id="2" companyId="2" companySymbol="BIC" companySymbolValue="044030505"/>
|
|
||||||
<currency id="643" currency_code="RUB"/>
|
|
||||||
<security id="643" instrumentType="CRNC" shortName="RUB" fullName="Российский рубль" securitySymbol="RUB" workflowStatus="ACTV"/>
|
|
||||||
<account id="1" companyId="1" account="30414810300000006000" accountType="TRAN" status="ACTV" processingSign="ALWD"/>
|
|
||||||
<account id="2" companyId="1" account="30414810600000007000" accountType="ANLT" status="ACTV" processingSign="ALWD"/>
|
|
||||||
<account id="3" companyId="1" account="700100000AT0" accountType="DTRN" status="ACTV" processingSign="ALWD"/>
|
|
||||||
<market id="1" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UESC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Обыкновенные акции"/>
|
|
||||||
<market id="2" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NESC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Обыкновенные акции"/>
|
|
||||||
<market id="3" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DESC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Обыкновенные акции"/>
|
|
||||||
<market id="4" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="AESC" name="Размещение: акции (аукцион по цене)" exchangeId="1" description="Размещение: акции (аукцион по цене): Обыкновенные акции"/>
|
|
||||||
<market id="5" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="WESC" name="Размещение: адресные заявки (подписка)" exchangeId="1" description="Размещение: адресные заявки (подписка): Обыкновенные акции"/>
|
|
||||||
<market id="6" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UEPC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Привилегированные акции"/>
|
|
||||||
<market id="7" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NEPC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Привилегированные акции"/>
|
|
||||||
<market id="8" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DEPC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Привилегированные акции"/>
|
|
||||||
<market id="9" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="AEPC" name="Размещение: акции (аукцион по цене)" exchangeId="1" description="Размещение: акции (аукцион по цене): Привилегированные акции"/>
|
|
||||||
<market id="10" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="WEPC" name="Размещение: адресные заявки (подписка)" exchangeId="1" description="Размещение: адресные заявки (подписка): Привилегированные акции"/>
|
|
||||||
<market id="11" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="ABVC" name="Размещение: Аукцион по цене" exchangeId="1" description="Размещение: Аукцион по цене: Купонные облигации с переменным купоном"/>
|
|
||||||
<market id="12" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="KBVC" name="Размещение: Аукцион по ставке" exchangeId="1" description="Размещение: Аукцион по ставке: Купонные облигации с переменным купоном"/>
|
|
||||||
<market id="13" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UBVC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Купонные облигации с переменным купоном"/>
|
|
||||||
<market id="14" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NBVC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Купонные облигации с переменным купоном"/>
|
|
||||||
<market id="15" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DBVC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Купонные облигации с переменным купоном"/>
|
|
||||||
<market id="16" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="WBVC" name="Размещение: адресные заявки (подписка)" exchangeId="1" description="Размещение: адресные заявки (подписка): Купонные облигации с переменным купоном"/>
|
|
||||||
<market id="17" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="ABFC" name="Размещение: Аукцион по цене" exchangeId="1" description="Размещение: Аукцион по цене: Купонные облигации с постоянным купоном"/>
|
|
||||||
<market id="18" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="KBFC" name="Размещение: Аукцион по ставке" exchangeId="1" description="Размещение: Аукцион по ставке: Купонные облигации с постоянным купоном"/>
|
|
||||||
<market id="19" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UBFC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Купонные облигации с постоянным купоном"/>
|
|
||||||
<market id="20" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NBFC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Купонные облигации с постоянным купоном"/>
|
|
||||||
<market id="21" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DBFC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Купонные облигации с постоянным купоном"/>
|
|
||||||
<market id="22" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="WBFC" name="Размещение: адресные заявки (подписка)" exchangeId="1" description="Размещение: адресные заявки (подписка): Купонные облигации с постоянным купоном"/>
|
|
||||||
<market id="23" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="ABIC" name="Размещение: Аукцион по цене" exchangeId="1" description="Размещение: Аукцион по цене: Облигации с индексированным номиналом"/>
|
|
||||||
<market id="24" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="KBIC" name="Размещение: Аукцион по ставке" exchangeId="1" description="Размещение: Аукцион по ставке: Облигации с индексированным номиналом"/>
|
|
||||||
<market id="25" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UBIC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Облигации с индексированным номиналом"/>
|
|
||||||
<market id="26" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NBIC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Облигации с индексированным номиналом"/>
|
|
||||||
<market id="27" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DBIC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Облигации с индексированным номиналом"/>
|
|
||||||
<market id="28" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="WBIC" name="Размещение: адресные заявки (подписка)" exchangeId="1" description="Размещение: адресные заявки (подписка): Облигации с индексированным номиналом"/>
|
|
||||||
<market id="29" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="ABMC" name="Размещение: Аукцион по цене" exchangeId="1" description="Размещение: Аукцион по цене: Облигации с амортизацией долга"/>
|
|
||||||
<market id="30" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="KBMC" name="Размещение: Аукцион по ставке" exchangeId="1" description="Размещение: Аукцион по ставке: Облигации с амортизацией долга"/>
|
|
||||||
<market id="31" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UBMC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Облигации с амортизацией долга"/>
|
|
||||||
<market id="32" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NBMC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Облигации с амортизацией долга"/>
|
|
||||||
<market id="33" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DBMC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Облигации с амортизацией долга"/>
|
|
||||||
<market id="34" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="WBMC" name="Размещение: адресные заявки (подписка)" exchangeId="1" description="Размещение: адресные заявки (подписка): Облигации с амортизацией долга"/>
|
|
||||||
<market id="35" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="BKVC" name="Размещение: Аукцион БР" exchangeId="1" description="Размещение: Аукцион БР: Облигации Банка России с переменным купоном (КОБР)"/>
|
|
||||||
<market id="36" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="SKVC" name="Доразмещение: Адресные заявки БР" exchangeId="1" description="Доразмещение: Адресные заявки БР: Облигации Банка России с переменным купоном (КОБР)"/>
|
|
||||||
<market id="37" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UKVC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Облигации Банка России с переменным купоном (КОБР)"/>
|
|
||||||
<market id="38" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NKVC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Облигации Банка России с переменным купоном (КОБР)"/>
|
|
||||||
<market id="39" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DKVC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Облигации Банка России с переменным купоном (КОБР)"/>
|
|
||||||
<market id="45" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="ABEC" name="Размещение: Аукцион СПВБ" exchangeId="1" description="Размещение: Аукцион СПВБ: Биржевые облигации"/>
|
|
||||||
<market id="46" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UBEC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Биржевые облигации"/>
|
|
||||||
<market id="47" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NBEC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Биржевые облигации"/>
|
|
||||||
<market id="48" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DBEC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Биржевые облигации"/>
|
|
||||||
<market id="61" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="BMVC" name="ОФЗПК-Размещение: Аукцион БР" exchangeId="1" description="ОФЗПК-Размещение: Аукцион БР: Облигации Минфина"/>
|
|
||||||
<market id="62" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="SMVC" name="ОФЗПК-Доразмещение: Адресные заявки БР" exchangeId="1" description="ОФЗПК-Доразмещение: Адресные заявки БР: Облигации Минфина"/>
|
|
||||||
<market id="63" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UMVC" name="ОФЗПК-Режим непрерывных торгов" exchangeId="1" description="ОФЗПК-Режим непрерывных торгов: Облигации Минфина"/>
|
|
||||||
<market id="64" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DMVC" name="ОФЗПК-Дискретный аукцион" exchangeId="1" description="ОФЗПК-Дискретный аукцион: Облигации Минфина"/>
|
|
||||||
<market id="65" marketType="SCND" section="FOND" settlementCurrency="RUB" code="MMVC" name="ОФЗПК-Торги в режиме выкупа" exchangeId="1" description="ОФЗПК-Торги в режиме выкупа: Облигации Минфина"/>
|
|
||||||
<market id="66" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="BMFC" name="ОФЗПД-Размещение: Аукцион БР" exchangeId="1" description="ОФЗПД-Размещение: Аукцион БР: Облигации Минфина"/>
|
|
||||||
<market id="67" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="SMFC" name="ОФЗПД- Доразмещение: Адресные заявки БР" exchangeId="1" description="ОФЗПД- Доразмещение: Адресные заявки БР: Облигации Минфина"/>
|
|
||||||
<market id="68" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UMFC" name="ОФЗПД-Режим непрерывных торгов" exchangeId="1" description="ОФЗПД-Режим непрерывных торгов: Облигации Минфина"/>
|
|
||||||
<market id="69" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DMFC" name="ОФЗПД-Дискретный аукцион" exchangeId="1" description="ОФЗПД-Дискретный аукцион: Облигации Минфина"/>
|
|
||||||
<market id="70" marketType="SCND" section="FOND" settlementCurrency="RUB" code="MMFC" name="ОФЗПД-Торги в режиме выкупа" exchangeId="1" description="ОФЗПД-Торги в режиме выкупа: Облигации Минфина"/>
|
|
||||||
<market id="71" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="BMMC" name="ОФЗАД-Размещение: Аукцион БР" exchangeId="1" description="ОФЗАД-Размещение: Аукцион БР: Облигации Минфина"/>
|
|
||||||
<market id="72" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="SMMC" name="ОФЗАД-Доразмещение: Адресные заявки БР" exchangeId="1" description="ОФЗАД-Доразмещение: Адресные заявки БР: Облигации Минфина"/>
|
|
||||||
<market id="73" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UMMC" name="ОФЗАД-Режим непрерывных торгов" exchangeId="1" description="ОФЗАД-Режим непрерывных торгов: Облигации Минфина"/>
|
|
||||||
<market id="74" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DMMC" name="ОФЗАД-Дискретный аукцион" exchangeId="1" description="ОФЗАД-Дискретный аукцион: Облигации Минфина"/>
|
|
||||||
<market id="75" marketType="SCND" section="FOND" settlementCurrency="RUB" code="MMMC" name="ОФЗАД-Торги в режиме выкупа" exchangeId="1" description="ОФЗАД-Торги в режиме выкупа: Облигации Минфина"/>
|
|
||||||
<market id="76" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="BMIC" name="ОФЗИН-Размещение: Аукцион БР" exchangeId="1" description="ОФЗИН-Размещение: Аукцион БР: Облигации Минфина"/>
|
|
||||||
<market id="77" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="SMIC" name="ОФЗИН-Доразмещение: Адресные заявки БР" exchangeId="1" description="ОФЗИН-Доразмещение: Адресные заявки БР: Облигации Минфина"/>
|
|
||||||
<market id="78" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UMIC" name="ОФЗИН-Режим непрерывных торгов" exchangeId="1" description="ОФЗИН-Режим непрерывных торгов: Облигации Минфина"/>
|
|
||||||
<market id="79" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DMIC" name="ОФЗИН-Дискретный аукцион" exchangeId="1" description="ОФЗИН-Дискретный аукцион: Облигации Минфина"/>
|
|
||||||
<market id="80" marketType="SCND" section="FOND" settlementCurrency="RUB" code="MMIC" name="ОФЗИН-Торги в режиме выкупа" exchangeId="1" description="ОФЗИН-Торги в режиме выкупа: Облигации Минфина"/>
|
|
||||||
<market id="82" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="BBVC" name="ОФЗ-ПК - Аукцион БР" exchangeId="1" description="ОФЗ-ПК - Аукцион БР"/>
|
|
||||||
<market id="83" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMDTATSS" name="СПб ГУП АТС Смольного" exchangeId="1" description="СПб ГУП АТС Смольного"/>
|
|
||||||
<market id="88" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMTTKFSP" name="Комитет финансов СПб" exchangeId="1" description="Комитет финансов СПб"/>
|
|
||||||
<market id="89" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMDSKFLO" name="Комитет финансов ЛО" exchangeId="1" description="Комитет финансов ЛО"/>
|
|
||||||
<market id="90" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMDTFSKB" name="ФСКМБ" exchangeId="1" description="ФСКМБ"/>
|
|
||||||
<market id="91" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMDSFGGE" name="ФАУ ГГЭ" exchangeId="1" description="ФАУ ГГЭ"/>
|
|
||||||
<market id="92" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMDTVRGO" name="ВВО РГО" exchangeId="1" description="ВВО РГО"/>
|
|
||||||
<market id="93" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMDTTDRM" name="ООО Торговый дом РМ-Рейл" exchangeId="1" description="ООО Торговый дом РМ-Рейл"/>
|
|
||||||
<market id="95" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMDTRKFN" name="АО РК Финанс" exchangeId="1" description="АО РК Финанс"/>
|
|
||||||
</objects>
|
</objects>
|
||||||
</meta>
|
</meta>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,94 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<meta version="3.9.0.68">
|
||||||
|
<enums>
|
||||||
|
|
||||||
|
</enums>
|
||||||
|
<objects>
|
||||||
|
<company id="1" fullName="АО Санкт-Петербургская Валютная Биржа" shortName="СПВБ" tradingCode="" clearingCode="" workflowStatus="ACTV"/>
|
||||||
|
<company id="2" fullName="ЗАО «Петербургский Расчетный Центр»" shortName="ПРЦ" tradingCode="" clearingCode="" workflowStatus="ACTV"/>
|
||||||
|
<company id="3" fullName="Торговая организация" shortName="ТС" tradingCode="" clearingCode="" workflowStatus="ACTV"/>
|
||||||
|
<company id="4" fullName="ЗАО «Санкт-Петербургский Расчетно-Депозитарный Центр»" shortName="РДЦ" tradingCode="" clearingCode="" workflowStatus="ACTV"/>
|
||||||
|
<!--company id="5" fullName="Центральный Банк Российской Федерации" shortName="ЦБ РФ" tradingCode="" clearingCode="" workflowStatus="ACTV"/-->
|
||||||
|
<companySymbols id="1" companyId="1" companySymbol="BIC" companySymbolValue="044030920"/>
|
||||||
|
<companySymbols id="2" companyId="2" companySymbol="BIC" companySymbolValue="044030505"/>
|
||||||
|
<currency id="643" currency_code="RUB"/>
|
||||||
|
<security id="643" instrumentType="CRNC" shortName="RUB" fullName="Российский рубль" securitySymbol="RUB" workflowStatus="ACTV"/>
|
||||||
|
<account id="1" companyId="1" account="30414810300000006000" accountType="TRAN" status="ACTV" processingSign="ALWD"/>
|
||||||
|
<account id="2" companyId="1" account="30414810600000007000" accountType="ANLT" status="ACTV" processingSign="ALWD"/>
|
||||||
|
<account id="3" companyId="1" account="700100000AT0" accountType="DTRN" status="ACTV" processingSign="ALWD"/>
|
||||||
|
<market id="1" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UESC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Обыкновенные акции"/>
|
||||||
|
<market id="2" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NESC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Обыкновенные акции"/>
|
||||||
|
<market id="3" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DESC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Обыкновенные акции"/>
|
||||||
|
<market id="4" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="AESC" name="Размещение: акции (аукцион по цене)" exchangeId="1" description="Размещение: акции (аукцион по цене): Обыкновенные акции"/>
|
||||||
|
<market id="5" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="WESC" name="Размещение: адресные заявки (подписка)" exchangeId="1" description="Размещение: адресные заявки (подписка): Обыкновенные акции"/>
|
||||||
|
<market id="6" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UEPC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Привилегированные акции"/>
|
||||||
|
<market id="7" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NEPC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Привилегированные акции"/>
|
||||||
|
<market id="8" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DEPC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Привилегированные акции"/>
|
||||||
|
<market id="9" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="AEPC" name="Размещение: акции (аукцион по цене)" exchangeId="1" description="Размещение: акции (аукцион по цене): Привилегированные акции"/>
|
||||||
|
<market id="10" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="WEPC" name="Размещение: адресные заявки (подписка)" exchangeId="1" description="Размещение: адресные заявки (подписка): Привилегированные акции"/>
|
||||||
|
<market id="11" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="ABVC" name="Размещение: Аукцион по цене" exchangeId="1" description="Размещение: Аукцион по цене: Купонные облигации с переменным купоном"/>
|
||||||
|
<market id="12" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="KBVC" name="Размещение: Аукцион по ставке" exchangeId="1" description="Размещение: Аукцион по ставке: Купонные облигации с переменным купоном"/>
|
||||||
|
<market id="13" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UBVC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Купонные облигации с переменным купоном"/>
|
||||||
|
<market id="14" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NBVC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Купонные облигации с переменным купоном"/>
|
||||||
|
<market id="15" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DBVC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Купонные облигации с переменным купоном"/>
|
||||||
|
<market id="16" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="WBVC" name="Размещение: адресные заявки (подписка)" exchangeId="1" description="Размещение: адресные заявки (подписка): Купонные облигации с переменным купоном"/>
|
||||||
|
<market id="17" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="ABFC" name="Размещение: Аукцион по цене" exchangeId="1" description="Размещение: Аукцион по цене: Купонные облигации с постоянным купоном"/>
|
||||||
|
<market id="18" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="KBFC" name="Размещение: Аукцион по ставке" exchangeId="1" description="Размещение: Аукцион по ставке: Купонные облигации с постоянным купоном"/>
|
||||||
|
<market id="19" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UBFC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Купонные облигации с постоянным купоном"/>
|
||||||
|
<market id="20" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NBFC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Купонные облигации с постоянным купоном"/>
|
||||||
|
<market id="21" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DBFC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Купонные облигации с постоянным купоном"/>
|
||||||
|
<market id="22" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="WBFC" name="Размещение: адресные заявки (подписка)" exchangeId="1" description="Размещение: адресные заявки (подписка): Купонные облигации с постоянным купоном"/>
|
||||||
|
<market id="23" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="ABIC" name="Размещение: Аукцион по цене" exchangeId="1" description="Размещение: Аукцион по цене: Облигации с индексированным номиналом"/>
|
||||||
|
<market id="24" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="KBIC" name="Размещение: Аукцион по ставке" exchangeId="1" description="Размещение: Аукцион по ставке: Облигации с индексированным номиналом"/>
|
||||||
|
<market id="25" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UBIC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Облигации с индексированным номиналом"/>
|
||||||
|
<market id="26" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NBIC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Облигации с индексированным номиналом"/>
|
||||||
|
<market id="27" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DBIC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Облигации с индексированным номиналом"/>
|
||||||
|
<market id="28" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="WBIC" name="Размещение: адресные заявки (подписка)" exchangeId="1" description="Размещение: адресные заявки (подписка): Облигации с индексированным номиналом"/>
|
||||||
|
<market id="29" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="ABMC" name="Размещение: Аукцион по цене" exchangeId="1" description="Размещение: Аукцион по цене: Облигации с амортизацией долга"/>
|
||||||
|
<market id="30" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="KBMC" name="Размещение: Аукцион по ставке" exchangeId="1" description="Размещение: Аукцион по ставке: Облигации с амортизацией долга"/>
|
||||||
|
<market id="31" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UBMC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Облигации с амортизацией долга"/>
|
||||||
|
<market id="32" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NBMC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Облигации с амортизацией долга"/>
|
||||||
|
<market id="33" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DBMC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Облигации с амортизацией долга"/>
|
||||||
|
<market id="34" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="WBMC" name="Размещение: адресные заявки (подписка)" exchangeId="1" description="Размещение: адресные заявки (подписка): Облигации с амортизацией долга"/>
|
||||||
|
<market id="35" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="BKVC" name="Размещение: Аукцион БР" exchangeId="1" description="Размещение: Аукцион БР: Облигации Банка России с переменным купоном (КОБР)"/>
|
||||||
|
<market id="36" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="SKVC" name="Доразмещение: Адресные заявки БР" exchangeId="1" description="Доразмещение: Адресные заявки БР: Облигации Банка России с переменным купоном (КОБР)"/>
|
||||||
|
<market id="37" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UKVC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Облигации Банка России с переменным купоном (КОБР)"/>
|
||||||
|
<market id="38" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NKVC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Облигации Банка России с переменным купоном (КОБР)"/>
|
||||||
|
<market id="39" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DKVC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Облигации Банка России с переменным купоном (КОБР)"/>
|
||||||
|
<market id="45" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="ABEC" name="Размещение: Аукцион СПВБ" exchangeId="1" description="Размещение: Аукцион СПВБ: Биржевые облигации"/>
|
||||||
|
<market id="46" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UBEC" name="Режим непрерывных торгов" exchangeId="1" description="Режим непрерывных торгов: Биржевые облигации"/>
|
||||||
|
<market id="47" marketType="SCND" section="FOND" settlementCurrency="RUB" code="NBEC" name="Режим переговорных сделок (РПС)" exchangeId="1" description="Режим переговорных сделок (РПС): Биржевые облигации"/>
|
||||||
|
<market id="48" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DBEC" name="Дискретный аукцион" exchangeId="1" description="Дискретный аукцион: Биржевые облигации"/>
|
||||||
|
<market id="61" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="BMVC" name="ОФЗПК-Размещение: Аукцион БР" exchangeId="1" description="ОФЗПК-Размещение: Аукцион БР: Облигации Минфина"/>
|
||||||
|
<market id="62" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="SMVC" name="ОФЗПК-Доразмещение: Адресные заявки БР" exchangeId="1" description="ОФЗПК-Доразмещение: Адресные заявки БР: Облигации Минфина"/>
|
||||||
|
<market id="63" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UMVC" name="ОФЗПК-Режим непрерывных торгов" exchangeId="1" description="ОФЗПК-Режим непрерывных торгов: Облигации Минфина"/>
|
||||||
|
<market id="64" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DMVC" name="ОФЗПК-Дискретный аукцион" exchangeId="1" description="ОФЗПК-Дискретный аукцион: Облигации Минфина"/>
|
||||||
|
<market id="65" marketType="SCND" section="FOND" settlementCurrency="RUB" code="MMVC" name="ОФЗПК-Торги в режиме выкупа" exchangeId="1" description="ОФЗПК-Торги в режиме выкупа: Облигации Минфина"/>
|
||||||
|
<market id="66" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="BMFC" name="ОФЗПД-Размещение: Аукцион БР" exchangeId="1" description="ОФЗПД-Размещение: Аукцион БР: Облигации Минфина"/>
|
||||||
|
<market id="67" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="SMFC" name="ОФЗПД- Доразмещение: Адресные заявки БР" exchangeId="1" description="ОФЗПД- Доразмещение: Адресные заявки БР: Облигации Минфина"/>
|
||||||
|
<market id="68" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UMFC" name="ОФЗПД-Режим непрерывных торгов" exchangeId="1" description="ОФЗПД-Режим непрерывных торгов: Облигации Минфина"/>
|
||||||
|
<market id="69" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DMFC" name="ОФЗПД-Дискретный аукцион" exchangeId="1" description="ОФЗПД-Дискретный аукцион: Облигации Минфина"/>
|
||||||
|
<market id="70" marketType="SCND" section="FOND" settlementCurrency="RUB" code="MMFC" name="ОФЗПД-Торги в режиме выкупа" exchangeId="1" description="ОФЗПД-Торги в режиме выкупа: Облигации Минфина"/>
|
||||||
|
<market id="71" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="BMMC" name="ОФЗАД-Размещение: Аукцион БР" exchangeId="1" description="ОФЗАД-Размещение: Аукцион БР: Облигации Минфина"/>
|
||||||
|
<market id="72" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="SMMC" name="ОФЗАД-Доразмещение: Адресные заявки БР" exchangeId="1" description="ОФЗАД-Доразмещение: Адресные заявки БР: Облигации Минфина"/>
|
||||||
|
<market id="73" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UMMC" name="ОФЗАД-Режим непрерывных торгов" exchangeId="1" description="ОФЗАД-Режим непрерывных торгов: Облигации Минфина"/>
|
||||||
|
<market id="74" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DMMC" name="ОФЗАД-Дискретный аукцион" exchangeId="1" description="ОФЗАД-Дискретный аукцион: Облигации Минфина"/>
|
||||||
|
<market id="75" marketType="SCND" section="FOND" settlementCurrency="RUB" code="MMMC" name="ОФЗАД-Торги в режиме выкупа" exchangeId="1" description="ОФЗАД-Торги в режиме выкупа: Облигации Минфина"/>
|
||||||
|
<market id="76" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="BMIC" name="ОФЗИН-Размещение: Аукцион БР" exchangeId="1" description="ОФЗИН-Размещение: Аукцион БР: Облигации Минфина"/>
|
||||||
|
<market id="77" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="SMIC" name="ОФЗИН-Доразмещение: Адресные заявки БР" exchangeId="1" description="ОФЗИН-Доразмещение: Адресные заявки БР: Облигации Минфина"/>
|
||||||
|
<market id="78" marketType="SCND" section="FOND" settlementCurrency="RUB" code="UMIC" name="ОФЗИН-Режим непрерывных торгов" exchangeId="1" description="ОФЗИН-Режим непрерывных торгов: Облигации Минфина"/>
|
||||||
|
<market id="79" marketType="SCND" section="FOND" settlementCurrency="RUB" code="DMIC" name="ОФЗИН-Дискретный аукцион" exchangeId="1" description="ОФЗИН-Дискретный аукцион: Облигации Минфина"/>
|
||||||
|
<market id="80" marketType="SCND" section="FOND" settlementCurrency="RUB" code="MMIC" name="ОФЗИН-Торги в режиме выкупа" exchangeId="1" description="ОФЗИН-Торги в режиме выкупа: Облигации Минфина"/>
|
||||||
|
<market id="82" marketType="PRMR" section="FOND" settlementCurrency="RUB" code="BBVC" name="ОФЗ-ПК - Аукцион БР" exchangeId="1" description="ОФЗ-ПК - Аукцион БР"/>
|
||||||
|
<market id="83" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMDTATSS" name="СПб ГУП АТС Смольного" exchangeId="1" description="СПб ГУП АТС Смольного"/>
|
||||||
|
<market id="88" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMTTKFSP" name="Комитет финансов СПб" exchangeId="1" description="Комитет финансов СПб"/>
|
||||||
|
<market id="89" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMDSKFLO" name="Комитет финансов ЛО" exchangeId="1" description="Комитет финансов ЛО"/>
|
||||||
|
<market id="90" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMDTFSKB" name="ФСКМБ" exchangeId="1" description="ФСКМБ"/>
|
||||||
|
<market id="91" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMDSFGGE" name="ФАУ ГГЭ" exchangeId="1" description="ФАУ ГГЭ"/>
|
||||||
|
<market id="92" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMDTVRGO" name="ВВО РГО" exchangeId="1" description="ВВО РГО"/>
|
||||||
|
<market id="93" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMDTTDRM" name="ООО Торговый дом РМ-Рейл" exchangeId="1" description="ООО Торговый дом РМ-Рейл"/>
|
||||||
|
<market id="95" marketType="PRMR" section="MKR" settlementCurrency="RUB" code="XMDTRKFN" name="АО РК Финанс" exchangeId="1" description="АО РК Финанс"/>
|
||||||
|
</objects>
|
||||||
|
</meta>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
{
|
{
|
||||||
"version": "3.8.0.58",
|
"version": "3.9.0.71",
|
||||||
|
|
||||||
"enums": {
|
"enums": {
|
||||||
|
|
||||||
|
|
@ -3328,11 +3328,11 @@
|
||||||
"type": 3,"name": "Номер купона","shortname": "Номер","searchable": true,"sortable": true,"visible": true
|
"type": 3,"name": "Номер купона","shortname": "Номер","searchable": true,"sortable": true,"visible": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "periodEndDate",
|
{"code": "periodStartDate",
|
||||||
"type": 6,"name": "Начало периода действия","shortname": "Начало","searchable": true,"sortable": true,"visible": true
|
"type": 6,"name": "Начало периода действия","shortname": "Начало","searchable": true,"sortable": true,"visible": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "periodStartDate",
|
{"code": "periodEndDate",
|
||||||
"type": 6,"name": "Окончание периода действия","shortname": "Окончание","searchable": true,"sortable": true,"visible": true
|
"type": 6,"name": "Окончание периода действия","shortname": "Окончание","searchable": true,"sortable": true,"visible": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
|
|
@ -4132,6 +4132,10 @@
|
||||||
{"code": "balance",
|
{"code": "balance",
|
||||||
"type": 10,"name": "Сумма","shortname": "Сумма","required": true
|
"type": 10,"name": "Сумма","shortname": "Сумма","required": true
|
||||||
}
|
}
|
||||||
|
,
|
||||||
|
{"code": "companyId",
|
||||||
|
"type": 1,"name": "Наименование компании","shortname": "Компания","link": "company","linkCode": "shortName","required": true
|
||||||
|
}
|
||||||
,
|
,
|
||||||
{"code": "tradingClearingRegistryId",
|
{"code": "tradingClearingRegistryId",
|
||||||
"type": 1,"name": "Торгово-клиринговый регистр","shortname": "Торгово-клиринговый регистр","link": "tradingClearingRegistry","linkCode": "code","required": true
|
"type": 1,"name": "Торгово-клиринговый регистр","shortname": "Торгово-клиринговый регистр","link": "tradingClearingRegistry","linkCode": "code","required": true
|
||||||
|
|
@ -4664,6 +4668,66 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
,
|
||||||
|
"accountSymbols": {
|
||||||
|
|
||||||
|
"name": "Депо КС - РДЦ",
|
||||||
|
|
||||||
|
"destination": "accounting/depo-accounts-symbols",
|
||||||
|
|
||||||
|
"class": "ru.clearing.classes.statics.data.account.AccountSymbols",
|
||||||
|
|
||||||
|
"logUpdates": "true",
|
||||||
|
|
||||||
|
"table": "depo_account_symbols",
|
||||||
|
|
||||||
|
"fields": [
|
||||||
|
{"code": "id",
|
||||||
|
"type": 1,"name": "Идентификатор записи","shortname": "ID","searchable": true,"sortable": true
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{"code": "accountId",
|
||||||
|
"type": 1,"dbname": "Идентификатор счета","name": "Счет депо КС","shortname": "Счет депо КС","searchable": true,"sortable": true,"visible": true,"link": "account","linkCode": "account"
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{"code": "accountSymbolValue",
|
||||||
|
"type": 2,"length": 255,"name": "Счет РДЦ","shortname": "Счет РДЦ","searchable": true,"sortable": true,"visible": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
,"actions":[
|
||||||
|
{"method":"post",
|
||||||
|
|
||||||
|
"name": "Добавление депо КС - РДЦ",
|
||||||
|
|
||||||
|
"confirmation": "accountId,accountSymbolValue",
|
||||||
|
|
||||||
|
"class": "ru.spcex.clearing.backendapi.controller.request.cud.account.AccountSymbolsNewAction",
|
||||||
|
|
||||||
|
"fields": [
|
||||||
|
{"code": "accountId",
|
||||||
|
"type": 1,"dbname": "Идентификатор счета","name": "Счет депо КС","shortname": "Счет депо КС","link": "account","linkCode": "account","required": true
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{"code": "accountSymbolValue",
|
||||||
|
"type": 2,"length": 255,"name": "Счет РДЦ","shortname": "Счет РДЦ","required": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{"method":"delete",
|
||||||
|
|
||||||
|
"name": "Удаление депо КС - РДЦ",
|
||||||
|
|
||||||
|
"confirmation": "accountId,accountSymbolValue",
|
||||||
|
|
||||||
|
"fields": [
|
||||||
|
{"code": "id",
|
||||||
|
"type": 1,"name": "Идентификатор записи","shortname": "ID","link": "account","linkCode": "id","required": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
"clearingAccount": {
|
"clearingAccount": {
|
||||||
|
|
@ -5270,11 +5334,15 @@
|
||||||
|
|
||||||
"group": "Обмен с расчетной организацией",
|
"group": "Обмен с расчетной организацией",
|
||||||
|
|
||||||
"name": "Вывод свободных средств инициаторов В (отправка ДФ-54 для получения ответа ДФ-55)",
|
"name": "Вывод свободных средств с клирингового регистра (отправка ДФ-54 для получения ответа ДФ-55)",
|
||||||
|
|
||||||
"fields": [
|
"fields": [
|
||||||
|
{"code": "fullBalance",
|
||||||
|
"type": 10,"name": "Текущий баланс (всего)","shortname": "Текущие средства (всего)","enabled": false
|
||||||
|
}
|
||||||
|
,
|
||||||
{"code": "balance",
|
{"code": "balance",
|
||||||
"type": 10,"name": "Текущий баланс","shortname": "Текущие средства","enabled": false
|
"type": 10,"name": "Текущий баланс (свободно)","shortname": "Текущие средства (свободно)","enabled": false
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "securitySymbol",
|
{"code": "securitySymbol",
|
||||||
|
|
@ -5290,7 +5358,7 @@
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "senderId",
|
{"code": "senderId",
|
||||||
"type": 1,"group": "Отправитель","name": "Участник отправитель","shortname": "Отправитель","link": "company","linkCode": "shortName","required": true,"enabled": false
|
"type": 1,"group": "Отправитель","name": "Участник отправитель","shortname": "Отправитель","link": "company","linkCode": "shortName","required": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "creditLeg_accountId",
|
{"code": "creditLeg_accountId",
|
||||||
|
|
@ -5509,6 +5577,28 @@
|
||||||
|
|
||||||
"name": "Формирование ДФ-05 с кодом 9 (финальный)",
|
"name": "Формирование ДФ-05 с кодом 9 (финальный)",
|
||||||
|
|
||||||
|
"fields": []
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{"method":"post",
|
||||||
|
|
||||||
|
"destination": "CHDF",
|
||||||
|
|
||||||
|
"group": "Общее",
|
||||||
|
|
||||||
|
"name": "Проверка наличия пары ДФ-01/ДФ-57 и ДФ-08/ДФ-21",
|
||||||
|
|
||||||
|
"fields": []
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{"method":"post",
|
||||||
|
|
||||||
|
"destination": "CCLR",
|
||||||
|
|
||||||
|
"group": "Клиринг",
|
||||||
|
|
||||||
|
"name": "Завершение неудачных клиринговых сессий",
|
||||||
|
|
||||||
"fields": []
|
"fields": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
@ -5544,7 +5634,7 @@
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "sessionStatus",
|
{"code": "sessionStatus",
|
||||||
"type": 12,"dbname": "Код статуса клиринговой сессии","name": "Статус клиринговой сессии","shortname": "Статус","searchable": true,"sortable": true,"visible": true,"link": "sessionStatus"
|
"type": 12,"dbname": "Код статуса клиринговой сессии","name": "Статус клиринговой сессии","shortname": "Шаг","searchable": true,"sortable": true,"visible": true,"link": "sessionStatus"
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "companyId",
|
{"code": "companyId",
|
||||||
|
|
@ -5776,10 +5866,12 @@
|
||||||
,
|
,
|
||||||
"executionDeposit": {
|
"executionDeposit": {
|
||||||
|
|
||||||
"name": "Сделки",
|
"name": "Сделки на секции МКР",
|
||||||
|
|
||||||
"destination": "execution-deposits",
|
"destination": "execution-deposits",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.execution.ExecutionDeposit",
|
"class": "ru.clearing.classes.statics.data.execution.ExecutionDeposit",
|
||||||
|
|
||||||
"logUpdates": "true",
|
"logUpdates": "true",
|
||||||
|
|
@ -5932,6 +6024,8 @@
|
||||||
|
|
||||||
"destination": "execution-fonds",
|
"destination": "execution-fonds",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.execution.ExecutionFond",
|
"class": "ru.clearing.classes.statics.data.execution.ExecutionFond",
|
||||||
|
|
||||||
"logUpdates": "true",
|
"logUpdates": "true",
|
||||||
|
|
@ -6080,17 +6174,19 @@
|
||||||
|
|
||||||
"destination": "depo-balance-registers",
|
"destination": "depo-balance-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.DepoBalanceRegister",
|
"class": "ru.clearing.classes.statics.data.register.DepoBalanceRegister",
|
||||||
|
|
||||||
"table": "balance_depo_register",
|
"table": "balance_depo_register",
|
||||||
|
|
||||||
"fields": [
|
"fields": [
|
||||||
{"code": "id",
|
{"code": "id",
|
||||||
"type": 1,"name": "Идентификатор записи","shortname": "ID","searchable": true,"sortable": true
|
"type": 1,"name": "Идентификатор записи","shortname": "ID","searchable": true,"sortable": true,"ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "createdAt",
|
{"code": "createdAt",
|
||||||
"field": "created","type": 4,"webtype": "5","dbname": "Дата-время создания записи","name": "Время создания записи","shortname": "Создано","searchable": true,"sortable": true,"ignore": true
|
"field": "created","type": 4,"webtype": "5","dbname": "Дата-время создания записи","name": "Время создания записи","shortname": "Создано","searchable": true,"sortable": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "updatedAt",
|
{"code": "updatedAt",
|
||||||
|
|
@ -6102,7 +6198,7 @@
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "sessionId",
|
{"code": "sessionId",
|
||||||
"type": 1,"dbname": "Идентификатор клиринговой сессии","name": "Клиринговая сессия","shortname": "Сессия","visible": true,"searchable": true,"sortable": true,"link": "session"
|
"type": 1,"dbname": "Идентификатор клиринговой сессии","name": "Клиринговая сессия","shortname": "Сессия","visible": true,"searchable": true,"sortable": true,"link": "session","ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "depoCode",
|
{"code": "depoCode",
|
||||||
|
|
@ -6126,6 +6222,8 @@
|
||||||
|
|
||||||
"destination": "money-balance-registers",
|
"destination": "money-balance-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.MoneyBalanceRegister",
|
"class": "ru.clearing.classes.statics.data.register.MoneyBalanceRegister",
|
||||||
|
|
||||||
"table": "money_balance_register",
|
"table": "money_balance_register",
|
||||||
|
|
@ -6140,7 +6238,7 @@
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "infoAccount",
|
{"code": "infoAccount",
|
||||||
"type": 2,"length": 50,"name": "Номер счета внутреннего учета СПВБ","shortname": "Номер счета внутреннего учета СПВБ","searchable": true,"sortable": true,"visible": true
|
"type": 2,"length": 50,"name": "Номер счета внутреннего учета СПВБ","shortname": "Номер счета внутреннего учета СПВБ","searchable": true,"sortable": true,"visible": true,"ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "remainderSum",
|
{"code": "remainderSum",
|
||||||
|
|
@ -6148,23 +6246,23 @@
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "blockedSum",
|
{"code": "blockedSum",
|
||||||
"type": 10,"name": "Сумма блокированных денежных средств","shortname": "Блокированные","searchable": true,"sortable": true
|
"type": 10,"name": "Сумма блокированных денежных средств","shortname": "Блокированные","searchable": true,"sortable": true,"ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "unblockedSum",
|
{"code": "unblockedSum",
|
||||||
"type": 10,"name": "Сумма свободных денежных средств","shortname": "Свободные","searchable": true,"sortable": true
|
"type": 10,"name": "Сумма свободных денежных средств","shortname": "Свободные","searchable": true,"sortable": true,"ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "inn",
|
{"code": "inn",
|
||||||
"type": 2,"length": 255,"name": "Идентификационный номер налогоплательщика (ИНН)","shortname": "ИНН","searchable": true,"sortable": true,"visible": true
|
"type": 2,"length": 255,"name": "Идентификационный номер налогоплательщика (ИНН)","shortname": "ИНН","searchable": true,"sortable": true,"visible": true,"ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "sessionId",
|
{"code": "sessionId",
|
||||||
"type": 1,"dbname": "Идентификатор клиринговой сессии","name": "Клиринговая сессия","shortname": "Сессия","visible": true,"searchable": true,"sortable": true,"link": "session"
|
"type": 1,"dbname": "Идентификатор клиринговой сессии","name": "Клиринговая сессия","shortname": "Сессия","visible": true,"searchable": true,"sortable": true,"link": "session","ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "companyFullName",
|
{"code": "companyFullName",
|
||||||
"type": 2,"length": 255,"name": "Полное наименование компании","shortname": "Полное наименование компании","searchable": true,"sortable": true,"visible": true
|
"type": 2,"length": 255,"name": "Полное наименование компании","shortname": "Полное наименование компании","searchable": true,"sortable": true,"visible": true,"ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "companyId",
|
{"code": "companyId",
|
||||||
|
|
@ -6172,7 +6270,7 @@
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "id",
|
{"code": "id",
|
||||||
"type": 1,"name": "Идентификатор записи","shortname": "ID","searchable": true,"sortable": true
|
"type": 1,"name": "Идентификатор записи","shortname": "ID","searchable": true,"sortable": true,"ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "createdAt",
|
{"code": "createdAt",
|
||||||
|
|
@ -6180,7 +6278,7 @@
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "updatedAt",
|
{"code": "updatedAt",
|
||||||
"field": "updated","type": 4,"webtype": "5","dbname": "Дата-время изменения записи","name": "Время изменения записи","shortname": "Изменено","searchable": true,"sortable": true
|
"field": "updated","type": 4,"webtype": "5","dbname": "Дата-время изменения записи","name": "Время изменения записи","shortname": "Изменено","searchable": true,"sortable": true,"ignore": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -6192,6 +6290,8 @@
|
||||||
|
|
||||||
"destination": "admitted-liabilities-registers",
|
"destination": "admitted-liabilities-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.AdmittedLiabilitiesRegister",
|
"class": "ru.clearing.classes.statics.data.register.AdmittedLiabilitiesRegister",
|
||||||
|
|
||||||
"table": "admitted_liabilities_register",
|
"table": "admitted_liabilities_register",
|
||||||
|
|
@ -6254,6 +6354,8 @@
|
||||||
|
|
||||||
"destination": "covered-liabilities-registers",
|
"destination": "covered-liabilities-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.CoveredLiabilitiesRegister",
|
"class": "ru.clearing.classes.statics.data.register.CoveredLiabilitiesRegister",
|
||||||
|
|
||||||
"table": "covered_Liabilities_register",
|
"table": "covered_Liabilities_register",
|
||||||
|
|
@ -6316,6 +6418,8 @@
|
||||||
|
|
||||||
"destination": "money-payment-instruction-registers",
|
"destination": "money-payment-instruction-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.MoneyPaymentInstructionRegister",
|
"class": "ru.clearing.classes.statics.data.register.MoneyPaymentInstructionRegister",
|
||||||
|
|
||||||
"table": "money_payment_instruction_register",
|
"table": "money_payment_instruction_register",
|
||||||
|
|
@ -6370,6 +6474,8 @@
|
||||||
|
|
||||||
"destination": "depo-payment-instruction-registers",
|
"destination": "depo-payment-instruction-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.DepoPaymentInstructionRegister",
|
"class": "ru.clearing.classes.statics.data.register.DepoPaymentInstructionRegister",
|
||||||
|
|
||||||
"table": "depo_payment_instruction_register",
|
"table": "depo_payment_instruction_register",
|
||||||
|
|
@ -6424,6 +6530,8 @@
|
||||||
|
|
||||||
"destination": "exclude-liabilities-registers",
|
"destination": "exclude-liabilities-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister",
|
"class": "ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister",
|
||||||
|
|
||||||
"table": "exclude_liabilities_register",
|
"table": "exclude_liabilities_register",
|
||||||
|
|
@ -6502,6 +6610,8 @@
|
||||||
|
|
||||||
"destination": "liabilities-registers",
|
"destination": "liabilities-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.LiabilitiesRegister",
|
"class": "ru.clearing.classes.statics.data.register.LiabilitiesRegister",
|
||||||
|
|
||||||
"table": "liabilities_register",
|
"table": "liabilities_register",
|
||||||
|
|
@ -6580,6 +6690,8 @@
|
||||||
|
|
||||||
"destination": "execution-registers",
|
"destination": "execution-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.ExecutionRegister",
|
"class": "ru.clearing.classes.statics.data.register.ExecutionRegister",
|
||||||
|
|
||||||
"table": "execution_register",
|
"table": "execution_register",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!--?xml-stylesheet type="text/xsl" href="\..\corp-reports\src\data\meta\meta.server.xslt"?-->
|
<!--?xml-stylesheet type="text/xsl" href="\..\corp-reports\src\data\meta\meta.server.xslt"?-->
|
||||||
<meta version="3.8.0.63">
|
<meta version="3.9.0.71">
|
||||||
<!-- _xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" _xsi:noNamespaceSchemaLocation="file:///E:/d/projects/meta/from/meta.xsd" -->
|
<!-- _xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" _xsi:noNamespaceSchemaLocation="file:///E:/d/projects/meta/from/meta.xsd" -->
|
||||||
<!--Здесь словари-->
|
<!--Здесь словари-->
|
||||||
<enums>
|
<enums>
|
||||||
|
|
@ -772,8 +772,8 @@
|
||||||
<securityId type="1" dbname="Идентификатор инструмента" name="Наименование инструмента" shortname="Инструмент" searchable="true" sortable="true" link="security" linkCode="shortName"/>
|
<securityId type="1" dbname="Идентификатор инструмента" name="Наименование инструмента" shortname="Инструмент" searchable="true" sortable="true" link="security" linkCode="shortName"/>
|
||||||
<couponRate type="11" name="Купонная ставка" shortname="Ставка" searchable="true" sortable="true" visible="true"/>
|
<couponRate type="11" name="Купонная ставка" shortname="Ставка" searchable="true" sortable="true" visible="true"/>
|
||||||
<number type="3" name="Номер купона" shortname="Номер" searchable="true" sortable="true" visible="true"/>
|
<number type="3" name="Номер купона" shortname="Номер" searchable="true" sortable="true" visible="true"/>
|
||||||
<periodEndDate type="6" name="Начало периода действия" shortname="Начало" searchable="true" sortable="true" visible="true"/>
|
<periodStartDate type="6" name="Начало периода действия" shortname="Начало" searchable="true" sortable="true" visible="true"/>
|
||||||
<periodStartDate type="6" name="Окончание периода действия" shortname="Окончание" searchable="true" sortable="true" visible="true"/>
|
<periodEndDate type="6" name="Окончание периода действия" shortname="Окончание" searchable="true" sortable="true" visible="true"/>
|
||||||
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true"/>
|
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true"/>
|
||||||
</couponPeriod>
|
</couponPeriod>
|
||||||
<listing name="Инструменты на режимах" destination="listings" class="ru.clearing.classes.statics.data.misc.Listing" logUpdates="true" table="listing">
|
<listing name="Инструменты на режимах" destination="listings" class="ru.clearing.classes.statics.data.misc.Listing" logUpdates="true" table="listing">
|
||||||
|
|
@ -1084,6 +1084,20 @@
|
||||||
<serviceStatus field="accountId" type="12" dbname="Код статуса" name="Наименование статуса" shortname="Статус" searchable="true" sortable="true" visible="true" linkKeyCode="id" linkCode="status" link="account" extends="account" />
|
<serviceStatus field="accountId" type="12" dbname="Код статуса" name="Наименование статуса" shortname="Статус" searchable="true" sortable="true" visible="true" linkKeyCode="id" linkCode="status" link="account" extends="account" />
|
||||||
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true"/>
|
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true"/>
|
||||||
</depoAccount>
|
</depoAccount>
|
||||||
|
<accountSymbols name="Депо КС - РДЦ" destination="accounting/depo-accounts-symbols" class="ru.clearing.classes.statics.data.account.AccountSymbols" logUpdates="true" table="depo_account_symbols">
|
||||||
|
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true"/>
|
||||||
|
<accountId type="1" dbname="Идентификатор счета" name="Счет депо КС" shortname= "Счет депо КС" searchable="true" sortable="true" visible="true" link="account" linkCode="account"/>
|
||||||
|
<accountSymbolValue type="2" length="255" name="Счет РДЦ" shortname="Счет РДЦ" searchable="true" sortable="true" visible="true"/>
|
||||||
|
<actions>
|
||||||
|
<post name="Добавление депо КС - РДЦ" confirmation="accountId,accountSymbolValue" class="ru.spcex.clearing.backendapi.controller.request.cud.account.AccountSymbolsNewAction">
|
||||||
|
<accountId type="1" dbname="Идентификатор счета" name="Счет депо КС" shortname= "Счет депо КС" link="account" linkCode="account" required="true"/>
|
||||||
|
<accountSymbolValue type="2" length="255" name="Счет РДЦ" shortname="Счет РДЦ" required="true"/>
|
||||||
|
</post>
|
||||||
|
<delete name="Удаление депо КС - РДЦ" confirmation="accountId,accountSymbolValue">
|
||||||
|
<id type="1" name="Идентификатор записи" shortname="ID" link="account" linkCode="id" required="true"/>
|
||||||
|
</delete>
|
||||||
|
</actions>
|
||||||
|
</accountSymbols>
|
||||||
<clearingAccount name="Торгово-Банковские счета" destination="accounting/clearing-accounts" class="ru.clearing.classes.statics.data.account.ClearingAccount" logUpdates="true" table="clearing_account">
|
<clearingAccount name="Торгово-Банковские счета" destination="accounting/clearing-accounts" class="ru.clearing.classes.statics.data.account.ClearingAccount" logUpdates="true" table="clearing_account">
|
||||||
<accountId type="1" dbname="Идентификатор счета" name="Номер счета" shortname="Счет" searchable="true" sortable="true" visible="true" link="account" linkCode="account"/>
|
<accountId type="1" dbname="Идентификатор счета" name="Номер счета" shortname="Счет" searchable="true" sortable="true" visible="true" link="account" linkCode="account"/>
|
||||||
<clearingAccountType type="12" dbname="Код типа счета" name="Наименование типа счета" shortname="Тип" searchable="true" sortable="true" visible="true" link="clearingAccountType" linkCode="name"/>
|
<clearingAccountType type="12" dbname="Код типа счета" name="Наименование типа счета" shortname="Тип" searchable="true" sortable="true" visible="true" link="clearingAccountType" linkCode="name"/>
|
||||||
|
|
@ -1274,6 +1288,8 @@
|
||||||
</post>
|
</post>
|
||||||
<post destination="CHDF" group="Общее" name="Проверка наличия пары ДФ-01/ДФ-57 и ДФ-08/ДФ-21">
|
<post destination="CHDF" group="Общее" name="Проверка наличия пары ДФ-01/ДФ-57 и ДФ-08/ДФ-21">
|
||||||
</post>
|
</post>
|
||||||
|
<post destination="CCLR" group="Клиринг" name="Завершение неудачных клиринговых сессий">
|
||||||
|
</post>
|
||||||
</actions>
|
</actions>
|
||||||
</launcher>
|
</launcher>
|
||||||
|
|
||||||
|
|
@ -1282,7 +1298,7 @@
|
||||||
<createdAt field="created" type="4" webtype="5" dbname="Дата-время создания записи" name="Время создания записи" shortname="Создано" searchable="true" sortable="true" ignore="true"/>
|
<createdAt field="created" type="4" webtype="5" dbname="Дата-время создания записи" name="Время создания записи" shortname="Создано" searchable="true" sortable="true" ignore="true"/>
|
||||||
<updatedAt field="updated" type="4" webtype="5" dbname="Дата-время изменения записи" name="Время изменения записи" shortname="Изменено" searchable="true" sortable="true" ignore="true"/>
|
<updatedAt field="updated" type="4" webtype="5" dbname="Дата-время изменения записи" name="Время изменения записи" shortname="Изменено" searchable="true" sortable="true" ignore="true"/>
|
||||||
<clearingDate type="6" name="Дата" shortname="Дата" searchable="true" sortable="true" visible="true"/>
|
<clearingDate type="6" name="Дата" shortname="Дата" searchable="true" sortable="true" visible="true"/>
|
||||||
<sessionStatus type="12" dbname="Код статуса клиринговой сессии" name="Статус клиринговой сессии" shortname="Статус" searchable="true" sortable="true" visible="true" link="sessionStatus"/>
|
<sessionStatus type="12" dbname="Код статуса клиринговой сессии" name="Статус клиринговой сессии" shortname="Шаг" searchable="true" sortable="true" visible="true" link="sessionStatus"/>
|
||||||
<companyId type="1" dbname="Идентификатор инициатора торгов" name="Наименование инициатора торгов" shortname="Инициатор" visible="false" searchable="true" sortable="true" link="company" linkCode="shortName"/>
|
<companyId type="1" dbname="Идентификатор инициатора торгов" name="Наименование инициатора торгов" shortname="Инициатор" visible="false" searchable="true" sortable="true" link="company" linkCode="shortName"/>
|
||||||
<securityId type="1" dbname="Идентификатор инструмента" name="Наименование инструмента" shortname="Инструмент" searchable="false" sortable="true" visible="true" link="security" linkCode="shortName"/>
|
<securityId type="1" dbname="Идентификатор инструмента" name="Наименование инструмента" shortname="Инструмент" searchable="false" sortable="true" visible="true" link="security" linkCode="shortName"/>
|
||||||
<userId type="1" dbname="Идентификатор пользователя" name="Наименование пользователя" shortname="Пользователь" searchable="true" sortable="true" visible="true" link="userCls" linkCode="identifier"/>
|
<userId type="1" dbname="Идентификатор пользователя" name="Наименование пользователя" shortname="Пользователь" searchable="true" sortable="true" visible="true" link="userCls" linkCode="identifier"/>
|
||||||
|
|
@ -1339,7 +1355,7 @@
|
||||||
<bankAccId type="2" length="12" name="Идентификатор расчетного счета/кода в клиринговой организации" shortname="Код позиции" searchable="true" sortable="true"/>
|
<bankAccId type="2" length="12" name="Идентификатор расчетного счета/кода в клиринговой организации" shortname="Код позиции" searchable="true" sortable="true"/>
|
||||||
<section type="12" dbname="Код наименования секции" name="Наименование секции" shortname="Секция" searchable="true" sortable="true" visible="true" link="section"/>
|
<section type="12" dbname="Код наименования секции" name="Наименование секции" shortname="Секция" searchable="true" sortable="true" visible="true" link="section"/>
|
||||||
</sTrades>
|
</sTrades>
|
||||||
<executionDeposit name="Сделки" destination="execution-deposits" historyDestination="history" class="ru.clearing.classes.statics.data.execution.ExecutionDeposit" logUpdates="true" table="execution_deposit">
|
<executionDeposit name="Сделки на секции МКР" destination="execution-deposits" historyDestination="history" class="ru.clearing.classes.statics.data.execution.ExecutionDeposit" logUpdates="true" table="execution_deposit">
|
||||||
<exchangeExecutionId type="1" name="Идентификационный номер сделки в Торговой системе" shortname="Номер сделки" visible="true" searchable="true" sortable="true"/>
|
<exchangeExecutionId type="1" name="Идентификационный номер сделки в Торговой системе" shortname="Номер сделки" visible="true" searchable="true" sortable="true"/>
|
||||||
<exchangeExecutionTime type="4" name="Время заключения сделки в Торговой системе" shortname="Время заключения сделки" visible="true" searchable="true" sortable="true"/>
|
<exchangeExecutionTime type="4" name="Время заключения сделки в Торговой системе" shortname="Время заключения сделки" visible="true" searchable="true" sortable="true"/>
|
||||||
<tradingDate type="6" name="Дата заключения сделки" shortname="Дата заключения сделки" visible="true" searchable="true" sortable="true"/>
|
<tradingDate type="6" name="Дата заключения сделки" shortname="Дата заключения сделки" visible="true" searchable="true" sortable="true"/>
|
||||||
|
|
@ -1411,11 +1427,11 @@
|
||||||
<sessionId type="1" dbname="Идентификатор клиринговой сессии" name="Клиринговая сессия" shortname="Сессия" visible="true" searchable="true" sortable="true" link="session"/>
|
<sessionId type="1" dbname="Идентификатор клиринговой сессии" name="Клиринговая сессия" shortname="Сессия" visible="true" searchable="true" sortable="true" link="session"/>
|
||||||
</executionFond>
|
</executionFond>
|
||||||
<depoBalanceRegister name="Реестр остатков ценных бумаг" destination="depo-balance-registers" historyDestination="history" class="ru.clearing.classes.statics.data.register.DepoBalanceRegister" table="balance_depo_register">
|
<depoBalanceRegister name="Реестр остатков ценных бумаг" destination="depo-balance-registers" historyDestination="history" class="ru.clearing.classes.statics.data.register.DepoBalanceRegister" table="balance_depo_register">
|
||||||
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true"/>
|
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true" ignore="true"/>
|
||||||
<createdAt field="created" type="4" webtype="5" dbname="Дата-время создания записи" name="Время создания записи" shortname="Создано" searchable="true" sortable="true" ignore="true"/>
|
<createdAt field="created" type="4" webtype="5" dbname="Дата-время создания записи" name="Время создания записи" shortname="Создано" searchable="true" sortable="true"/>
|
||||||
<updatedAt field="updated" type="4" webtype="5" dbname="Дата-время изменения записи" name="Время изменения записи" shortname="Изменено" searchable="true" sortable="true" ignore="true"/>
|
<updatedAt field="updated" type="4" webtype="5" dbname="Дата-время изменения записи" name="Время изменения записи" shortname="Изменено" searchable="true" sortable="true" ignore="true"/>
|
||||||
<companyId type="1" dbname="Идентификатор компании" name="Наименование компании" shortname="Компания" visible="true" searchable="true" sortable="true" link="company" linkCode="shortName"/>
|
<companyId type="1" dbname="Идентификатор компании" name="Наименование компании" shortname="Компания" visible="true" searchable="true" sortable="true" link="company" linkCode="shortName"/>
|
||||||
<sessionId type="1" dbname="Идентификатор клиринговой сессии" name="Клиринговая сессия" shortname="Сессия" visible="true" searchable="true" sortable="true" link="session"/>
|
<sessionId type="1" dbname="Идентификатор клиринговой сессии" name="Клиринговая сессия" shortname="Сессия" visible="true" searchable="true" sortable="true" link="session" ignore="true"/>
|
||||||
<depoCode type="2" length="50" name="Код раздела субсчета/счета депо" shortname="Код счета депо" searchable="true" sortable="true"/>
|
<depoCode type="2" length="50" name="Код раздела субсчета/счета депо" shortname="Код счета депо" searchable="true" sortable="true"/>
|
||||||
<quantity type="11" name="Количество" shortname="Количество" searchable="true" sortable="true"/>
|
<quantity type="11" name="Количество" shortname="Количество" searchable="true" sortable="true"/>
|
||||||
<securitySymbol type="2" length="255" name="Код ценной бумаги" shortname="Ценная бумага" searchable="true" sortable="true"/>
|
<securitySymbol type="2" length="255" name="Код ценной бумаги" shortname="Ценная бумага" searchable="true" sortable="true"/>
|
||||||
|
|
@ -1423,17 +1439,17 @@
|
||||||
<moneyBalanceRegister name="Реестр остатков денежных средств" destination="money-balance-registers" historyDestination="history" class="ru.clearing.classes.statics.data.register.MoneyBalanceRegister" table="money_balance_register">
|
<moneyBalanceRegister name="Реестр остатков денежных средств" destination="money-balance-registers" historyDestination="history" class="ru.clearing.classes.statics.data.register.MoneyBalanceRegister" table="money_balance_register">
|
||||||
<setHouseName type="2" length="255" name="Наименование РО" shortname="Наименование РО" searchable="true" sortable="true" visible="true"/>
|
<setHouseName type="2" length="255" name="Наименование РО" shortname="Наименование РО" searchable="true" sortable="true" visible="true"/>
|
||||||
<account type="2" length="50" name="Номер торгового/клирингового счета" shortname="Номер торгового/клирингового счета" searchable="true" sortable="true" visible="true"/>
|
<account type="2" length="50" name="Номер торгового/клирингового счета" shortname="Номер торгового/клирингового счета" searchable="true" sortable="true" visible="true"/>
|
||||||
<infoAccount type="2" length="50" name="Номер счета внутреннего учета СПВБ" shortname="Номер счета внутреннего учета СПВБ" searchable="true" sortable="true" visible="true"/>
|
<infoAccount type="2" length="50" name="Номер счета внутреннего учета СПВБ" shortname="Номер счета внутреннего учета СПВБ" searchable="true" sortable="true" visible="true" ignore="true"/>
|
||||||
<remainderSum type="10" name="Остаток денежных средств" shortname="Остаток" searchable="true" sortable="true"/>
|
<remainderSum type="10" name="Остаток денежных средств" shortname="Остаток" searchable="true" sortable="true"/>
|
||||||
<blockedSum type="10" name="Сумма блокированных денежных средств" shortname="Блокированные" searchable="true" sortable="true"/>
|
<blockedSum type="10" name="Сумма блокированных денежных средств" shortname="Блокированные" searchable="true" sortable="true" ignore="true"/>
|
||||||
<unblockedSum type="10" name="Сумма свободных денежных средств" shortname="Свободные" searchable="true" sortable="true"/>
|
<unblockedSum type="10" name="Сумма свободных денежных средств" shortname="Свободные" searchable="true" sortable="true" ignore="true"/>
|
||||||
<inn type="2" length="255" name="Идентификационный номер налогоплательщика (ИНН)" shortname="ИНН" searchable="true" sortable="true" visible="true"/>
|
<inn type="2" length="255" name="Идентификационный номер налогоплательщика (ИНН)" shortname="ИНН" searchable="true" sortable="true" visible="true" ignore="true"/>
|
||||||
<sessionId type="1" dbname="Идентификатор клиринговой сессии" name="Клиринговая сессия" shortname="Сессия" visible="true" searchable="true" sortable="true" link="session"/>
|
<sessionId type="1" dbname="Идентификатор клиринговой сессии" name="Клиринговая сессия" shortname="Сессия" visible="true" searchable="true" sortable="true" link="session" ignore="true"/>
|
||||||
<companyFullName type="2" length="255" name="Полное наименование компании" shortname="Полное наименование компании" searchable="true" sortable="true" visible="true"/>
|
<companyFullName type="2" length="255" name="Полное наименование компании" shortname="Полное наименование компании" searchable="true" sortable="true" visible="true" ignore="true"/>
|
||||||
<companyId type="1" dbname="Идентификатор компании" name="Наименование компании" shortname="Компания" searchable="true" sortable="true" visible="true" link="company" linkCode="shortName"/>
|
<companyId type="1" dbname="Идентификатор компании" name="Наименование компании" shortname="Компания" searchable="true" sortable="true" visible="true" link="company" linkCode="shortName"/>
|
||||||
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true"/>
|
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true" ignore="true"/>
|
||||||
<createdAt field="created" type="4" webtype="5" dbname="Дата-время создания записи" name="Время создания записи" shortname="Создано" searchable="true" sortable="true"/>
|
<createdAt field="created" type="4" webtype="5" dbname="Дата-время создания записи" name="Время создания записи" shortname="Создано" searchable="true" sortable="true"/>
|
||||||
<updatedAt field="updated" type="4" webtype="5" dbname="Дата-время изменения записи" name="Время изменения записи" shortname="Изменено" searchable="true" sortable="true"/>
|
<updatedAt field="updated" type="4" webtype="5" dbname="Дата-время изменения записи" name="Время изменения записи" shortname="Изменено" searchable="true" sortable="true" ignore="true"/>
|
||||||
</moneyBalanceRegister>
|
</moneyBalanceRegister>
|
||||||
<admittedLiabilitiesRegister name="Реестр обязательств, допущенных к клирингу" destination="admitted-liabilities-registers" historyDestination="history" class="ru.clearing.classes.statics.data.register.AdmittedLiabilitiesRegister" table="admitted_liabilities_register">
|
<admittedLiabilitiesRegister name="Реестр обязательств, допущенных к клирингу" destination="admitted-liabilities-registers" historyDestination="history" class="ru.clearing.classes.statics.data.register.AdmittedLiabilitiesRegister" table="admitted_liabilities_register">
|
||||||
<companyFullName type="2" length="255" name="Полное наименование компании" shortname="Полное наименование компании" searchable="true" sortable="true" visible="true"/>
|
<companyFullName type="2" length="255" name="Полное наименование компании" shortname="Полное наименование компании" searchable="true" sortable="true" visible="true"/>
|
||||||
|
|
@ -1487,7 +1503,7 @@
|
||||||
<direction type="1" name="Направление" shortname="Направление" searchable="true" sortable="true" link="inOutDirection" ignore="true"/>
|
<direction type="1" name="Направление" shortname="Направление" searchable="true" sortable="true" link="inOutDirection" ignore="true"/>
|
||||||
<sessionId type="1" dbname="Идентификатор клиринговой сессии" name="Клиринговая сессия" shortname="Сессия" visible="true" searchable="true" sortable="true" link="session"/>
|
<sessionId type="1" dbname="Идентификатор клиринговой сессии" name="Клиринговая сессия" shortname="Сессия" visible="true" searchable="true" sortable="true" link="session"/>
|
||||||
</depoPaymentInstructionRegister>
|
</depoPaymentInstructionRegister>
|
||||||
<excludeLiabilitiesRegister name="Реестр обязательств, исключенных из клирингового пула" destination="exclude-liabilities-registers" class="ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister" table="exclude_liabilities_register">
|
<excludeLiabilitiesRegister name="Реестр обязательств, исключенных из клирингового пула" destination="exclude-liabilities-registers" historyDestination="history" class="ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister" table="exclude_liabilities_register">
|
||||||
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true"/>
|
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true"/>
|
||||||
<createdAt field="created" type="4" webtype="5" dbname="Дата-время создания записи" name="Время создания записи" shortname="Создано" searchable="true" sortable="true" ignore="true"/>
|
<createdAt field="created" type="4" webtype="5" dbname="Дата-время создания записи" name="Время создания записи" shortname="Создано" searchable="true" sortable="true" ignore="true"/>
|
||||||
<updatedAt field="updated" type="4" webtype="5" dbname="Дата-время изменения записи" name="Время изменения записи" shortname="Изменено" searchable="true" sortable="true" ignore="true"/>
|
<updatedAt field="updated" type="4" webtype="5" dbname="Дата-время изменения записи" name="Время изменения записи" shortname="Изменено" searchable="true" sortable="true" ignore="true"/>
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ DROP TABLE IF EXISTS <xsl:value-of select="$dbTableName"/>;
|
||||||
CREATE TABLE <xsl:value-of select="$dbTableName"/>(<xsl:apply-templates select="*" mode="field"/>);
|
CREATE TABLE <xsl:value-of select="$dbTableName"/>(<xsl:apply-templates select="*" mode="field"/>);
|
||||||
COMMENT ON TABLE <xsl:value-of select="$dbTableName"/> IS '<xsl:value-of select="$dbNameComment"/>';
|
COMMENT ON TABLE <xsl:value-of select="$dbTableName"/> IS '<xsl:value-of select="$dbNameComment"/>';
|
||||||
<xsl:apply-templates select="*" mode="comment-enums"/>
|
<xsl:apply-templates select="*" mode="comment-enums"/>
|
||||||
|
GRANT ALL PRIVILEGES ON TABLE <xsl:value-of select="$dbTableName"/> TO clearing;
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
|
|
||||||
<xsl:template match="*" mode="objects">
|
<xsl:template match="*" mode="objects">
|
||||||
|
|
@ -53,6 +54,7 @@ DROP TABLE IF EXISTS <xsl:value-of select="$dbTableName"/>;
|
||||||
CREATE TABLE <xsl:value-of select="$dbTableName"/>(<xsl:apply-templates select="*[@name or @dbname or @type]" mode="field"/>);
|
CREATE TABLE <xsl:value-of select="$dbTableName"/>(<xsl:apply-templates select="*[@name or @dbname or @type]" mode="field"/>);
|
||||||
COMMENT ON TABLE <xsl:value-of select="$dbTableName"/> IS '<xsl:value-of select="$dbNameTComment"/>';
|
COMMENT ON TABLE <xsl:value-of select="$dbTableName"/> IS '<xsl:value-of select="$dbNameTComment"/>';
|
||||||
<xsl:apply-templates select="*[@name or @dbname or @type]" mode="comment-objects"/>
|
<xsl:apply-templates select="*[@name or @dbname or @type]" mode="comment-objects"/>
|
||||||
|
GRANT ALL PRIVILEGES ON TABLE <xsl:value-of select="$dbTableName"/> TO clearing;
|
||||||
<xsl:if test="@logUpdates">
|
<xsl:if test="@logUpdates">
|
||||||
|
|
||||||
-- History log of <xsl:value-of select="name()"/> - <xsl:value-of select="$dbNameTComment"/>
|
-- History log of <xsl:value-of select="name()"/> - <xsl:value-of select="$dbNameTComment"/>
|
||||||
|
|
@ -65,6 +67,7 @@ COMMENT ON COLUMN <xsl:value-of select="$dbTableName"/>_HISTORY.EVENT_TIME IS '
|
||||||
COMMENT ON COLUMN <xsl:value-of select="$dbTableName"/>_HISTORY.EVENT_USER_ID IS 'Инициатор изменения';
|
COMMENT ON COLUMN <xsl:value-of select="$dbTableName"/>_HISTORY.EVENT_USER_ID IS 'Инициатор изменения';
|
||||||
COMMENT ON COLUMN <xsl:value-of select="$dbTableName"/>_HISTORY.EVENT_TYPE IS 'Тип изменения';
|
COMMENT ON COLUMN <xsl:value-of select="$dbTableName"/>_HISTORY.EVENT_TYPE IS 'Тип изменения';
|
||||||
<xsl:apply-templates select="*[@name or @dbname or @type]" mode="comment-history-objects"/>
|
<xsl:apply-templates select="*[@name or @dbname or @type]" mode="comment-history-objects"/>
|
||||||
|
GRANT ALL PRIVILEGES ON TABLE <xsl:value-of select="$dbTableName"/>_HISTORY TO clearing;
|
||||||
</xsl:if>
|
</xsl:if>
|
||||||
</xsl:template>
|
</xsl:template>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -88,6 +88,7 @@ import static ru.spcex.clearing.test.json.MatcherFactoryWithJson.usingIgnoringFi
|
||||||
DepoAccountController.class,
|
DepoAccountController.class,
|
||||||
//account misc
|
//account misc
|
||||||
ClientCodeController.class,
|
ClientCodeController.class,
|
||||||
|
AccountSymbolsController.class,
|
||||||
//company
|
//company
|
||||||
CompanyRoleSetController.class,
|
CompanyRoleSetController.class,
|
||||||
CompanyController.class,
|
CompanyController.class,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
package ru.spcex.clearing.backendapi.controller.queue.account;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import ru.clearing.classes.statics.data.account.AccountSymbols;
|
||||||
|
import ru.spcex.clearing.backendapi.controller.queue.AbstractControllerTest;
|
||||||
|
import ru.spcex.clearing.backendapi.controller.request.cud.account.AccountSymbolsNewAction;
|
||||||
|
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
|
||||||
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
||||||
|
|
||||||
|
|
||||||
|
class AccountSymbolsControllerTest extends AbstractControllerTest {
|
||||||
|
private static final String REST_URL = "/accounting/depo-accounts-symbols/";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link AccountSymbolsController#add(AccountSymbolsNewAction)}<br>
|
||||||
|
* Тест проверяет получение сущности {@link AccountSymbolsNewAction} по REST API и отправку в Apache Kafka.<br>
|
||||||
|
* Входной запрос {@link AccountSymbolsNewAction}: {111L, "VALUE-1234"}
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void add() throws Exception {
|
||||||
|
//ARRANGE
|
||||||
|
AccountSymbolsNewAction accountSymbolsNewAction = new AccountSymbolsNewAction();
|
||||||
|
accountSymbolsNewAction.setAccountId(111L);
|
||||||
|
accountSymbolsNewAction.setAccountSymbolValue("VALUE-1234");
|
||||||
|
|
||||||
|
//ACT and ASSERT
|
||||||
|
checkAddingByRestApi(REST_URL, accountSymbolsNewAction);
|
||||||
|
checkSendedMessegeFromKafka(Consts.DESTINATION_DEPO_ACCOUNT_SYMBOLS_NEW, accountSymbolsNewAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link AccountSymbolsController#delete(Long)} <br>
|
||||||
|
* Тест проверяет получение id сущности {@link Long} по REST API и отправку в Apache Kafka.<br>
|
||||||
|
* Входной запрос /accounting/depo-accounts-symbols/{@link Long}: - 0L<br>
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void delete() throws Exception {
|
||||||
|
//ARRANGE
|
||||||
|
long id = currentId.getAndIncrement();
|
||||||
|
CommonDeleteAction deleteAction = new CommonDeleteAction();
|
||||||
|
deleteAction.setId(id);
|
||||||
|
//ACT and ASSERT
|
||||||
|
checkDeletingByRestApi(REST_URL, id);
|
||||||
|
checkSendedMessegeFromKafka(Consts.DESTINATION_DEPO_ACCOUNT_SYMBOLS_DELETE, deleteAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link ClientCodeController#getAll()} <br>
|
||||||
|
* Тест проверяет получение запроса по REST API и отправку всех записей из таблицы hazelcast Map_ClientCode.<br>
|
||||||
|
* Входной запрос /client-codes/ <br>
|
||||||
|
* Ответ CommonGetAllResponse <br>
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void getAll() throws Exception {
|
||||||
|
//ARRANGE
|
||||||
|
AccountSymbols existAccountSymbols = new AccountSymbols();
|
||||||
|
existAccountSymbols.setAccountId(111L);
|
||||||
|
existAccountSymbols.setAccountSymbolValue("AAABBBVVCD");
|
||||||
|
existAccountSymbols.setId(currentId.get());
|
||||||
|
|
||||||
|
//ACT and ASSERT
|
||||||
|
checkGettingAllFromRestApi(IMDGDistributedNames.Map_AccountSymbols, existAccountSymbols, REST_URL);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
{
|
{
|
||||||
"version": "3.8.0.58",
|
"version": "3.9.0.71",
|
||||||
|
|
||||||
"enums": {
|
"enums": {
|
||||||
|
|
||||||
|
|
@ -3328,11 +3328,11 @@
|
||||||
"type": 3,"name": "Номер купона","shortname": "Номер","searchable": true,"sortable": true,"visible": true
|
"type": 3,"name": "Номер купона","shortname": "Номер","searchable": true,"sortable": true,"visible": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "periodEndDate",
|
{"code": "periodStartDate",
|
||||||
"type": 6,"name": "Начало периода действия","shortname": "Начало","searchable": true,"sortable": true,"visible": true
|
"type": 6,"name": "Начало периода действия","shortname": "Начало","searchable": true,"sortable": true,"visible": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "periodStartDate",
|
{"code": "periodEndDate",
|
||||||
"type": 6,"name": "Окончание периода действия","shortname": "Окончание","searchable": true,"sortable": true,"visible": true
|
"type": 6,"name": "Окончание периода действия","shortname": "Окончание","searchable": true,"sortable": true,"visible": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
|
|
@ -4132,6 +4132,10 @@
|
||||||
{"code": "balance",
|
{"code": "balance",
|
||||||
"type": 10,"name": "Сумма","shortname": "Сумма","required": true
|
"type": 10,"name": "Сумма","shortname": "Сумма","required": true
|
||||||
}
|
}
|
||||||
|
,
|
||||||
|
{"code": "companyId",
|
||||||
|
"type": 1,"name": "Наименование компании","shortname": "Компания","link": "company","linkCode": "shortName","required": true
|
||||||
|
}
|
||||||
,
|
,
|
||||||
{"code": "tradingClearingRegistryId",
|
{"code": "tradingClearingRegistryId",
|
||||||
"type": 1,"name": "Торгово-клиринговый регистр","shortname": "Торгово-клиринговый регистр","link": "tradingClearingRegistry","linkCode": "code","required": true
|
"type": 1,"name": "Торгово-клиринговый регистр","shortname": "Торгово-клиринговый регистр","link": "tradingClearingRegistry","linkCode": "code","required": true
|
||||||
|
|
@ -4664,6 +4668,66 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
}
|
||||||
|
,
|
||||||
|
"accountSymbols": {
|
||||||
|
|
||||||
|
"name": "Депо КС - РДЦ",
|
||||||
|
|
||||||
|
"destination": "accounting/depo-accounts-symbols",
|
||||||
|
|
||||||
|
"class": "ru.clearing.classes.statics.data.account.AccountSymbols",
|
||||||
|
|
||||||
|
"logUpdates": "true",
|
||||||
|
|
||||||
|
"table": "depo_account_symbols",
|
||||||
|
|
||||||
|
"fields": [
|
||||||
|
{"code": "id",
|
||||||
|
"type": 1,"name": "Идентификатор записи","shortname": "ID","searchable": true,"sortable": true
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{"code": "accountId",
|
||||||
|
"type": 1,"dbname": "Идентификатор счета","name": "Счет депо КС","shortname": "Счет депо КС","searchable": true,"sortable": true,"visible": true,"link": "account","linkCode": "account"
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{"code": "accountSymbolValue",
|
||||||
|
"type": 2,"length": 255,"name": "Счет РДЦ","shortname": "Счет РДЦ","searchable": true,"sortable": true,"visible": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
,"actions":[
|
||||||
|
{"method":"post",
|
||||||
|
|
||||||
|
"name": "Добавление депо КС - РДЦ",
|
||||||
|
|
||||||
|
"confirmation": "accountId,accountSymbolValue",
|
||||||
|
|
||||||
|
"class": "ru.spcex.clearing.backendapi.controller.request.cud.account.AccountSymbolsNewAction",
|
||||||
|
|
||||||
|
"fields": [
|
||||||
|
{"code": "accountId",
|
||||||
|
"type": 1,"dbname": "Идентификатор счета","name": "Счет депо КС","shortname": "Счет депо КС","link": "account","linkCode": "account","required": true
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{"code": "accountSymbolValue",
|
||||||
|
"type": 2,"length": 255,"name": "Счет РДЦ","shortname": "Счет РДЦ","required": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{"method":"delete",
|
||||||
|
|
||||||
|
"name": "Удаление депо КС - РДЦ",
|
||||||
|
|
||||||
|
"confirmation": "accountId,accountSymbolValue",
|
||||||
|
|
||||||
|
"fields": [
|
||||||
|
{"code": "id",
|
||||||
|
"type": 1,"name": "Идентификатор записи","shortname": "ID","link": "account","linkCode": "id","required": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
"clearingAccount": {
|
"clearingAccount": {
|
||||||
|
|
@ -5270,11 +5334,15 @@
|
||||||
|
|
||||||
"group": "Обмен с расчетной организацией",
|
"group": "Обмен с расчетной организацией",
|
||||||
|
|
||||||
"name": "Вывод свободных средств инициаторов В (отправка ДФ-54 для получения ответа ДФ-55)",
|
"name": "Вывод свободных средств с клирингового регистра (отправка ДФ-54 для получения ответа ДФ-55)",
|
||||||
|
|
||||||
"fields": [
|
"fields": [
|
||||||
|
{"code": "fullBalance",
|
||||||
|
"type": 10,"name": "Текущий баланс (всего)","shortname": "Текущие средства (всего)","enabled": false
|
||||||
|
}
|
||||||
|
,
|
||||||
{"code": "balance",
|
{"code": "balance",
|
||||||
"type": 10,"name": "Текущий баланс","shortname": "Текущие средства","enabled": false
|
"type": 10,"name": "Текущий баланс (свободно)","shortname": "Текущие средства (свободно)","enabled": false
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "securitySymbol",
|
{"code": "securitySymbol",
|
||||||
|
|
@ -5290,7 +5358,7 @@
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "senderId",
|
{"code": "senderId",
|
||||||
"type": 1,"group": "Отправитель","name": "Участник отправитель","shortname": "Отправитель","link": "company","linkCode": "shortName","required": true,"enabled": false
|
"type": 1,"group": "Отправитель","name": "Участник отправитель","shortname": "Отправитель","link": "company","linkCode": "shortName","required": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "creditLeg_accountId",
|
{"code": "creditLeg_accountId",
|
||||||
|
|
@ -5509,6 +5577,28 @@
|
||||||
|
|
||||||
"name": "Формирование ДФ-05 с кодом 9 (финальный)",
|
"name": "Формирование ДФ-05 с кодом 9 (финальный)",
|
||||||
|
|
||||||
|
"fields": []
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{"method":"post",
|
||||||
|
|
||||||
|
"destination": "CHDF",
|
||||||
|
|
||||||
|
"group": "Общее",
|
||||||
|
|
||||||
|
"name": "Проверка наличия пары ДФ-01/ДФ-57 и ДФ-08/ДФ-21",
|
||||||
|
|
||||||
|
"fields": []
|
||||||
|
}
|
||||||
|
,
|
||||||
|
{"method":"post",
|
||||||
|
|
||||||
|
"destination": "CCLR",
|
||||||
|
|
||||||
|
"group": "Клиринг",
|
||||||
|
|
||||||
|
"name": "Завершение неудачных клиринговых сессий",
|
||||||
|
|
||||||
"fields": []
|
"fields": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
@ -5544,7 +5634,7 @@
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "sessionStatus",
|
{"code": "sessionStatus",
|
||||||
"type": 12,"dbname": "Код статуса клиринговой сессии","name": "Статус клиринговой сессии","shortname": "Статус","searchable": true,"sortable": true,"visible": true,"link": "sessionStatus"
|
"type": 12,"dbname": "Код статуса клиринговой сессии","name": "Статус клиринговой сессии","shortname": "Шаг","searchable": true,"sortable": true,"visible": true,"link": "sessionStatus"
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "companyId",
|
{"code": "companyId",
|
||||||
|
|
@ -5776,10 +5866,12 @@
|
||||||
,
|
,
|
||||||
"executionDeposit": {
|
"executionDeposit": {
|
||||||
|
|
||||||
"name": "Сделки",
|
"name": "Сделки на секции МКР",
|
||||||
|
|
||||||
"destination": "execution-deposits",
|
"destination": "execution-deposits",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.execution.ExecutionDeposit",
|
"class": "ru.clearing.classes.statics.data.execution.ExecutionDeposit",
|
||||||
|
|
||||||
"logUpdates": "true",
|
"logUpdates": "true",
|
||||||
|
|
@ -5932,6 +6024,8 @@
|
||||||
|
|
||||||
"destination": "execution-fonds",
|
"destination": "execution-fonds",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.execution.ExecutionFond",
|
"class": "ru.clearing.classes.statics.data.execution.ExecutionFond",
|
||||||
|
|
||||||
"logUpdates": "true",
|
"logUpdates": "true",
|
||||||
|
|
@ -6080,17 +6174,19 @@
|
||||||
|
|
||||||
"destination": "depo-balance-registers",
|
"destination": "depo-balance-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.DepoBalanceRegister",
|
"class": "ru.clearing.classes.statics.data.register.DepoBalanceRegister",
|
||||||
|
|
||||||
"table": "balance_depo_register",
|
"table": "balance_depo_register",
|
||||||
|
|
||||||
"fields": [
|
"fields": [
|
||||||
{"code": "id",
|
{"code": "id",
|
||||||
"type": 1,"name": "Идентификатор записи","shortname": "ID","searchable": true,"sortable": true
|
"type": 1,"name": "Идентификатор записи","shortname": "ID","searchable": true,"sortable": true,"ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "createdAt",
|
{"code": "createdAt",
|
||||||
"field": "created","type": 4,"webtype": "5","dbname": "Дата-время создания записи","name": "Время создания записи","shortname": "Создано","searchable": true,"sortable": true,"ignore": true
|
"field": "created","type": 4,"webtype": "5","dbname": "Дата-время создания записи","name": "Время создания записи","shortname": "Создано","searchable": true,"sortable": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "updatedAt",
|
{"code": "updatedAt",
|
||||||
|
|
@ -6102,7 +6198,7 @@
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "sessionId",
|
{"code": "sessionId",
|
||||||
"type": 1,"dbname": "Идентификатор клиринговой сессии","name": "Клиринговая сессия","shortname": "Сессия","visible": true,"searchable": true,"sortable": true,"link": "session"
|
"type": 1,"dbname": "Идентификатор клиринговой сессии","name": "Клиринговая сессия","shortname": "Сессия","visible": true,"searchable": true,"sortable": true,"link": "session","ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "depoCode",
|
{"code": "depoCode",
|
||||||
|
|
@ -6126,6 +6222,8 @@
|
||||||
|
|
||||||
"destination": "money-balance-registers",
|
"destination": "money-balance-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.MoneyBalanceRegister",
|
"class": "ru.clearing.classes.statics.data.register.MoneyBalanceRegister",
|
||||||
|
|
||||||
"table": "money_balance_register",
|
"table": "money_balance_register",
|
||||||
|
|
@ -6140,7 +6238,7 @@
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "infoAccount",
|
{"code": "infoAccount",
|
||||||
"type": 2,"length": 50,"name": "Номер счета внутреннего учета СПВБ","shortname": "Номер счета внутреннего учета СПВБ","searchable": true,"sortable": true,"visible": true
|
"type": 2,"length": 50,"name": "Номер счета внутреннего учета СПВБ","shortname": "Номер счета внутреннего учета СПВБ","searchable": true,"sortable": true,"visible": true,"ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "remainderSum",
|
{"code": "remainderSum",
|
||||||
|
|
@ -6148,23 +6246,23 @@
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "blockedSum",
|
{"code": "blockedSum",
|
||||||
"type": 10,"name": "Сумма блокированных денежных средств","shortname": "Блокированные","searchable": true,"sortable": true
|
"type": 10,"name": "Сумма блокированных денежных средств","shortname": "Блокированные","searchable": true,"sortable": true,"ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "unblockedSum",
|
{"code": "unblockedSum",
|
||||||
"type": 10,"name": "Сумма свободных денежных средств","shortname": "Свободные","searchable": true,"sortable": true
|
"type": 10,"name": "Сумма свободных денежных средств","shortname": "Свободные","searchable": true,"sortable": true,"ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "inn",
|
{"code": "inn",
|
||||||
"type": 2,"length": 255,"name": "Идентификационный номер налогоплательщика (ИНН)","shortname": "ИНН","searchable": true,"sortable": true,"visible": true
|
"type": 2,"length": 255,"name": "Идентификационный номер налогоплательщика (ИНН)","shortname": "ИНН","searchable": true,"sortable": true,"visible": true,"ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "sessionId",
|
{"code": "sessionId",
|
||||||
"type": 1,"dbname": "Идентификатор клиринговой сессии","name": "Клиринговая сессия","shortname": "Сессия","visible": true,"searchable": true,"sortable": true,"link": "session"
|
"type": 1,"dbname": "Идентификатор клиринговой сессии","name": "Клиринговая сессия","shortname": "Сессия","visible": true,"searchable": true,"sortable": true,"link": "session","ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "companyFullName",
|
{"code": "companyFullName",
|
||||||
"type": 2,"length": 255,"name": "Полное наименование компании","shortname": "Полное наименование компании","searchable": true,"sortable": true,"visible": true
|
"type": 2,"length": 255,"name": "Полное наименование компании","shortname": "Полное наименование компании","searchable": true,"sortable": true,"visible": true,"ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "companyId",
|
{"code": "companyId",
|
||||||
|
|
@ -6172,7 +6270,7 @@
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "id",
|
{"code": "id",
|
||||||
"type": 1,"name": "Идентификатор записи","shortname": "ID","searchable": true,"sortable": true
|
"type": 1,"name": "Идентификатор записи","shortname": "ID","searchable": true,"sortable": true,"ignore": true
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "createdAt",
|
{"code": "createdAt",
|
||||||
|
|
@ -6180,7 +6278,7 @@
|
||||||
}
|
}
|
||||||
,
|
,
|
||||||
{"code": "updatedAt",
|
{"code": "updatedAt",
|
||||||
"field": "updated","type": 4,"webtype": "5","dbname": "Дата-время изменения записи","name": "Время изменения записи","shortname": "Изменено","searchable": true,"sortable": true
|
"field": "updated","type": 4,"webtype": "5","dbname": "Дата-время изменения записи","name": "Время изменения записи","shortname": "Изменено","searchable": true,"sortable": true,"ignore": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -6192,6 +6290,8 @@
|
||||||
|
|
||||||
"destination": "admitted-liabilities-registers",
|
"destination": "admitted-liabilities-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.AdmittedLiabilitiesRegister",
|
"class": "ru.clearing.classes.statics.data.register.AdmittedLiabilitiesRegister",
|
||||||
|
|
||||||
"table": "admitted_liabilities_register",
|
"table": "admitted_liabilities_register",
|
||||||
|
|
@ -6254,6 +6354,8 @@
|
||||||
|
|
||||||
"destination": "covered-liabilities-registers",
|
"destination": "covered-liabilities-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.CoveredLiabilitiesRegister",
|
"class": "ru.clearing.classes.statics.data.register.CoveredLiabilitiesRegister",
|
||||||
|
|
||||||
"table": "covered_Liabilities_register",
|
"table": "covered_Liabilities_register",
|
||||||
|
|
@ -6316,6 +6418,8 @@
|
||||||
|
|
||||||
"destination": "money-payment-instruction-registers",
|
"destination": "money-payment-instruction-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.MoneyPaymentInstructionRegister",
|
"class": "ru.clearing.classes.statics.data.register.MoneyPaymentInstructionRegister",
|
||||||
|
|
||||||
"table": "money_payment_instruction_register",
|
"table": "money_payment_instruction_register",
|
||||||
|
|
@ -6370,6 +6474,8 @@
|
||||||
|
|
||||||
"destination": "depo-payment-instruction-registers",
|
"destination": "depo-payment-instruction-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.DepoPaymentInstructionRegister",
|
"class": "ru.clearing.classes.statics.data.register.DepoPaymentInstructionRegister",
|
||||||
|
|
||||||
"table": "depo_payment_instruction_register",
|
"table": "depo_payment_instruction_register",
|
||||||
|
|
@ -6424,6 +6530,8 @@
|
||||||
|
|
||||||
"destination": "exclude-liabilities-registers",
|
"destination": "exclude-liabilities-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister",
|
"class": "ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister",
|
||||||
|
|
||||||
"table": "exclude_liabilities_register",
|
"table": "exclude_liabilities_register",
|
||||||
|
|
@ -6502,6 +6610,8 @@
|
||||||
|
|
||||||
"destination": "liabilities-registers",
|
"destination": "liabilities-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.LiabilitiesRegister",
|
"class": "ru.clearing.classes.statics.data.register.LiabilitiesRegister",
|
||||||
|
|
||||||
"table": "liabilities_register",
|
"table": "liabilities_register",
|
||||||
|
|
@ -6580,6 +6690,8 @@
|
||||||
|
|
||||||
"destination": "execution-registers",
|
"destination": "execution-registers",
|
||||||
|
|
||||||
|
"historyDestination": "history",
|
||||||
|
|
||||||
"class": "ru.clearing.classes.statics.data.register.ExecutionRegister",
|
"class": "ru.clearing.classes.statics.data.register.ExecutionRegister",
|
||||||
|
|
||||||
"table": "execution_register",
|
"table": "execution_register",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
package ru.clearing.classes.statics.data.account;
|
||||||
|
|
||||||
|
import ru.clearing.classes.ConstSerializable;
|
||||||
|
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Депо КС - РДЦ
|
||||||
|
* <p>
|
||||||
|
* DB table: ACCOUNT_SYMBOLS
|
||||||
|
**/
|
||||||
|
public class AccountSymbols extends SpcexObjectBase {
|
||||||
|
private static final long serialVersionUID = ConstSerializable.serialVersionUID;
|
||||||
|
|
||||||
|
private Long accountId;
|
||||||
|
private String accountSymbolValue;
|
||||||
|
|
||||||
|
public Long getAccountId() {
|
||||||
|
return accountId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccountId(Long value) {
|
||||||
|
this.accountId = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAccountSymbolValue() {
|
||||||
|
return accountSymbolValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccountSymbolValue(String value) {
|
||||||
|
this.accountSymbolValue = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
package ru.clearing.classes.statics.data.account;
|
||||||
|
|
||||||
|
import ru.clearing.classes.ConstSerializable;
|
||||||
|
import ru.clearing.classes.objects.BusinessEvent;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Изменение состояния объекта Депо КС - РДЦ
|
||||||
|
* <p>
|
||||||
|
* DB table: ACCOUNT_SYMBOLS_HISTORY
|
||||||
|
**/
|
||||||
|
public class AccountSymbolsHistory extends BusinessEvent<AccountSymbols> {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = ConstSerializable.serialVersionUID;
|
||||||
|
|
||||||
|
private AccountSymbols object;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AccountSymbols getObject() {
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setObject(AccountSymbols object) {
|
||||||
|
this.object = object;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,6 +2,8 @@ package ru.spcex.clearing.config;
|
||||||
|
|
||||||
import org.apache.kafka.clients.consumer.Consumer;
|
import org.apache.kafka.clients.consumer.Consumer;
|
||||||
import org.apache.kafka.clients.producer.Producer;
|
import org.apache.kafka.clients.producer.Producer;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
|
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
|
|
@ -26,19 +28,31 @@ import java.util.function.Supplier;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
public class KafkaConfig {
|
public class KafkaConfig {
|
||||||
@Autowired
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
|
private final KafkaConsumerSettings kafkaSettings;
|
||||||
@Bean("kafkaConsumer")
|
|
||||||
public Consumer<String, Object> createConsumer(ClearingServiceSettings settings) {
|
public KafkaConfig(ClearingServiceSettings settings) {
|
||||||
return KafkaConsumerFactory.consumer(settings.getKafkaConsumer());
|
this.kafkaSettings = settings.getKafkaConsumer();
|
||||||
|
Integer gtwTimeout = settings.getSessionStage().getInspectionGatewayTimeout();
|
||||||
|
if (gtwTimeout != null) {
|
||||||
|
int maxPollIntervalMs = gtwTimeout * 1000 + 1000;
|
||||||
|
log.debug("setting max.poll.interval.ms {}", maxPollIntervalMs);
|
||||||
|
this.kafkaSettings.setManuallyMaxPollIntervalMs(maxPollIntervalMs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
|
||||||
|
@Bean("kafkaConsumer")
|
||||||
|
public Consumer<String, Object> createConsumer() {
|
||||||
|
return KafkaConsumerFactory.consumer(kafkaSettings);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Autowired
|
|
||||||
@Bean("kafkaConsumerGateway")
|
@Bean("kafkaConsumerGateway")
|
||||||
public Supplier<Consumer<String, Object>> getwaySessionConsumer(ClearingServiceSettings settings) {
|
public Supplier<Consumer<String, Object>> getwaySessionConsumer() {
|
||||||
AtomicInteger groupId = new AtomicInteger(1);
|
AtomicInteger groupId = new AtomicInteger(1);
|
||||||
return () -> {
|
return () -> {
|
||||||
KafkaConsumerSettings consumer = settings.getKafkaConsumer();
|
KafkaConsumerSettings consumer = kafkaSettings;
|
||||||
KafkaConsumerSettings gatewayConsumer = new KafkaConsumerSettings();
|
KafkaConsumerSettings gatewayConsumer = new KafkaConsumerSettings();
|
||||||
gatewayConsumer.setBootstrapServers(consumer.getBootstrapServers());
|
gatewayConsumer.setBootstrapServers(consumer.getBootstrapServers());
|
||||||
gatewayConsumer.setSessionTimeoutMs(consumer.getSessionTimeoutMs());
|
gatewayConsumer.setSessionTimeoutMs(consumer.getSessionTimeoutMs());
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ import ru.spcex.platform.utils.validation.ValidatorImpl;
|
||||||
|
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
public class ValidationConfig {
|
public class ValidationConfig {
|
||||||
|
|
@ -367,6 +368,7 @@ public class ValidationConfig {
|
||||||
new PresentById(IMDGDistributedNames.Map_Registry, ClearingError.RecordNotFound, true),
|
new PresentById(IMDGDistributedNames.Map_Registry, ClearingError.RecordNotFound, true),
|
||||||
StatusExtractValidationRule.RegistryCodeCheck,
|
StatusExtractValidationRule.RegistryCodeCheck,
|
||||||
StatusExtractValidationRule.ContractCheck,
|
StatusExtractValidationRule.ContractCheck,
|
||||||
|
StatusExtractValidationRule.RequestStatusValid,
|
||||||
StatusExtractValidationRule.RegistryStatusValid
|
StatusExtractValidationRule.RegistryStatusValid
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
@ -490,6 +492,19 @@ public class ValidationConfig {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean("terminateSessionValidator")
|
||||||
|
public Supplier<IValidator> terminateSessionValidator() {
|
||||||
|
return () -> {
|
||||||
|
ImdgValidationContext<Session> ctx = new ImdgValidationContext<>();
|
||||||
|
ctx.setLogPrefix(LogPrefixId.INSTANCE);
|
||||||
|
ctx.addImdg(IMDGDistributedNames.Map_Session, imdgSession);
|
||||||
|
return new ValidatorImpl<>(ctx,
|
||||||
|
SessionTerminationValidationRule.SessionPresent,
|
||||||
|
SessionTerminationValidationRule.StatusCheck
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@Bean("userRoleVerification")
|
@Bean("userRoleVerification")
|
||||||
public UserRoleVerification userRoleVerification(ImdgProvider imdgProvider, IMessageResolver msgs) {
|
public UserRoleVerification userRoleVerification(ImdgProvider imdgProvider, IMessageResolver msgs) {
|
||||||
return new UserRoleVerification(imdgProvider, msgs, ClearingError.UserVerifyDenial);
|
return new UserRoleVerification(imdgProvider, msgs, ClearingError.UserVerifyDenial);
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ public class ClearingServiceSettings {
|
||||||
private KafkaConsumerSettings kafkaConsumer;
|
private KafkaConsumerSettings kafkaConsumer;
|
||||||
private KafkaProducerSettings kafkaProducer;
|
private KafkaProducerSettings kafkaProducer;
|
||||||
private SessionStageSettings sessionStage;
|
private SessionStageSettings sessionStage;
|
||||||
|
private TradeSettings trade = new TradeSettings();
|
||||||
|
|
||||||
public HazelcastClientParams getHazelcast() {
|
public HazelcastClientParams getHazelcast() {
|
||||||
return hazelcast;
|
return hazelcast;
|
||||||
|
|
@ -47,4 +48,12 @@ public class ClearingServiceSettings {
|
||||||
public void setSessionStage(SessionStageSettings sessionStage) {
|
public void setSessionStage(SessionStageSettings sessionStage) {
|
||||||
this.sessionStage = sessionStage;
|
this.sessionStage = sessionStage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TradeSettings getTrade() {
|
||||||
|
return trade;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTrade(TradeSettings trade) {
|
||||||
|
this.trade = trade;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
package ru.spcex.clearing.config.element;
|
||||||
|
|
||||||
|
|
||||||
|
public class TradeSettings {
|
||||||
|
private Boolean valuation = false;
|
||||||
|
|
||||||
|
public Boolean getValuation() {
|
||||||
|
return valuation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValuation(Boolean valuation) {
|
||||||
|
this.valuation = valuation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -54,6 +54,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
|
||||||
private final BalanceRevise balanceRevise;
|
private final BalanceRevise balanceRevise;
|
||||||
private final Sdf05Sender sdf05Sender;
|
private final Sdf05Sender sdf05Sender;
|
||||||
private final StatementServiceV2 statementService;
|
private final StatementServiceV2 statementService;
|
||||||
|
private final SessionTerminator sessionTerminator;
|
||||||
private final PaymentInstructionOutboundService pmtOutboundService;
|
private final PaymentInstructionOutboundService pmtOutboundService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
|
|
@ -65,7 +66,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
|
||||||
SecondaryAuctionT0Session secondaryAuctionT0Session,
|
SecondaryAuctionT0Session secondaryAuctionT0Session,
|
||||||
PrimaryAuctionB0Session primaryAuctionB0Session, PrimaryAuctionT0Session primaryAuctionT0Session, IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, ReturnDepositSession returnDepositSession, SessionManager sessionManager,
|
PrimaryAuctionB0Session primaryAuctionB0Session, PrimaryAuctionT0Session primaryAuctionT0Session, IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, ReturnDepositSession returnDepositSession, SessionManager sessionManager,
|
||||||
Sdf06Executor sdf06Executor,
|
Sdf06Executor sdf06Executor,
|
||||||
Sdf10Executor sdf10Executor, BalanceRevise balanceRevise, Sdf05Sender sdf05Sender, StatementServiceV2 statementService, PaymentInstructionOutboundService pmtOutboundService) {
|
Sdf10Executor sdf10Executor, BalanceRevise balanceRevise, Sdf05Sender sdf05Sender, StatementServiceV2 statementService, SessionTerminator sessionTerminator, PaymentInstructionOutboundService pmtOutboundService) {
|
||||||
super(kafkaQueue, kafkaResponseQueue);
|
super(kafkaQueue, kafkaResponseQueue);
|
||||||
this.errorResolver = errorResolver;
|
this.errorResolver = errorResolver;
|
||||||
this.clearingService = clearingService;
|
this.clearingService = clearingService;
|
||||||
|
|
@ -83,6 +84,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
|
||||||
this.balanceRevise = balanceRevise;
|
this.balanceRevise = balanceRevise;
|
||||||
this.sdf05Sender = sdf05Sender;
|
this.sdf05Sender = sdf05Sender;
|
||||||
this.statementService = statementService;
|
this.statementService = statementService;
|
||||||
|
this.sessionTerminator = sessionTerminator;
|
||||||
this.pmtOutboundService = pmtOutboundService;
|
this.pmtOutboundService = pmtOutboundService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -184,6 +186,11 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
|
||||||
callback(LauncherCommandRequest.class)
|
callback(LauncherCommandRequest.class)
|
||||||
.setConsumer(task -> sdf05Sender.sendSdf05("9"))
|
.setConsumer(task -> sdf05Sender.sendSdf05("9"))
|
||||||
.forDestination(Task.sdf05WithCode9Final.topic(), callbacks::put);
|
.forDestination(Task.sdf05WithCode9Final.topic(), callbacks::put);
|
||||||
|
|
||||||
|
callback(Object.class)
|
||||||
|
.setFunction(sessionTerminator::stopCurrentSession)
|
||||||
|
.forDestination(Consts.KILL_SESSION, callbacks::put);
|
||||||
|
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,11 +48,9 @@ import ru.spcex.platform.utils.validation.IValidator;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
|
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
|
||||||
|
|
@ -287,24 +285,12 @@ public class RegistryService {
|
||||||
return reqHelp.error(req.getId(), err.get());
|
return reqHelp.error(req.getId(), err.get());
|
||||||
}
|
}
|
||||||
Registry rgs = validator.getStored(Stored.PresentById);
|
Registry rgs = validator.getStored(Stored.PresentById);
|
||||||
//Supplier<AssetOperationRequest> gtwBuilder = () -> GatewayRequestCreator.from(rgs, InOutDirection.in);
|
if (trdTime.isTradingTime()) {
|
||||||
//Optional<Boolean> gatewayOk;
|
Long gtwReqId = kafkaSender.sendRequestToQueue(Consts.ASSET_OPERATION, gtwReq(rgs));
|
||||||
//if (trdTime.isTradingTime()) {
|
log.debug("send request to {} id={}", Consts.ASSET_OPERATION, gtwReqId);
|
||||||
// gatewayOk = gateway.gatewayRequestAndWait(gtwBuilder);
|
} else {
|
||||||
//} else {
|
log.debug("RegistryChangeStatusExtractRequest rgs.id={} not sending gateway request", rgs.getId());
|
||||||
// log.debug("RegistryChangeStatusExtractRequest rgs.id={} not sending gateway request", rgs.getId());
|
}
|
||||||
// gatewayOk = Optional.of(true);
|
|
||||||
//}
|
|
||||||
//if (gatewayOk.isEmpty() || !gatewayOk.get()) {
|
|
||||||
// String gtwErr = msgResolver.resolve(mapError(gatewayOk));
|
|
||||||
// log.error("{}.id={} {}",
|
|
||||||
// rgs.getRegistryCode(),
|
|
||||||
// rgs.getId(),
|
|
||||||
// gtwErr);
|
|
||||||
// notification.sendNotification(ObjectType.rgst,
|
|
||||||
// "Отметка о получении выписки: %s".formatted(gtwErr),
|
|
||||||
// Priority.HIGH);
|
|
||||||
//}
|
|
||||||
rgs.setRegistryStatus(payload.getRegistryStatus());
|
rgs.setRegistryStatus(payload.getRegistryStatus());
|
||||||
log.debug("changing registry.id={} status to {}", rgs.getId(), payload.getRegistryStatus());
|
log.debug("changing registry.id={} status to {}", rgs.getId(), payload.getRegistryStatus());
|
||||||
registryImdg.update(rgs);
|
registryImdg.update(rgs);
|
||||||
|
|
@ -318,6 +304,13 @@ public class RegistryService {
|
||||||
return reqHelp.success(req.getId());
|
return reqHelp.success(req.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private AssetOperationListRequest gtwReq(Registry rgs) {
|
||||||
|
AssetOperationRequest item = GatewayRequestCreator.from(rgs, InOutDirection.in);
|
||||||
|
AssetOperationListRequest gtwReq = new AssetOperationListRequest();
|
||||||
|
gtwReq.setAssetOperationRequests(Collections.singletonList(item));
|
||||||
|
return gtwReq;
|
||||||
|
}
|
||||||
|
|
||||||
public RequestInfoUpdate identificationFunds(BaseRequest<IdentificationFundsRequest> req) {
|
public RequestInfoUpdate identificationFunds(BaseRequest<IdentificationFundsRequest> req) {
|
||||||
if (!rights.userHasRole(req.getUserId(), UserRole.Admin)) {
|
if (!rights.userHasRole(req.getUserId(), UserRole.Admin)) {
|
||||||
return reqHelp.error(req.getId(), ClearingError.UserVerifyDenial);
|
return reqHelp.error(req.getId(), ClearingError.UserVerifyDenial);
|
||||||
|
|
@ -454,56 +447,70 @@ public class RegistryService {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public record RgsKey (Long companyId, Long accountId, Long securityId) {
|
||||||
|
public static RgsKey fromRgs(Registry rgs) {
|
||||||
|
return new RgsKey(rgs.getCompanyId(), rgs.getAccountId(), rgs.getSecurityId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Optional<Registry> find(List<Registry> group, RegistryTradingParams rgsCode) {
|
||||||
|
List<Registry> byCodeRes = group.stream()
|
||||||
|
.filter(rgs -> RegistryManager.equalsByCode(rgsCode, rgs))
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
if (byCodeRes.size() > 1) {
|
||||||
|
Optional<Registry> any = group.stream().findFirst();
|
||||||
|
if (any.isEmpty()) throw new IllegalStateException(); //never
|
||||||
|
String err = "FATAL: found %d entries by code %s in group %s".formatted(
|
||||||
|
byCodeRes.size(),
|
||||||
|
rgsCode,
|
||||||
|
RgsKey.fromRgs(any.get()).toString()
|
||||||
|
);
|
||||||
|
throw new IllegalStateException(err);
|
||||||
|
}
|
||||||
|
return byCodeRes.stream().findFirst();
|
||||||
|
}
|
||||||
|
|
||||||
public void resetBalances() {
|
public void resetBalances() {
|
||||||
Collection<Registry> registriesA = registryImdg.getCollectionObjectsByFieldValues(Map.of(
|
Collection<Registry> registriesA = registryImdg.getCollectionObjectsByFieldValues(Map.of(
|
||||||
"registryDesignation", RegistryDesignation.A.getKey())
|
"registryDesignation", RegistryDesignation.A.getKey())
|
||||||
);
|
);
|
||||||
|
|
||||||
for (Registry registry : registriesA) {
|
Map<RgsKey, List<Registry>> allAssets = registriesA
|
||||||
if (RegistryUnit.B.equalsByKey(registry.getRegistryUnit())) {
|
.stream()
|
||||||
registry.setBalance(BigDecimal.ZERO);
|
.collect(Collectors.groupingBy(RgsKey::fromRgs));
|
||||||
}
|
|
||||||
if (RegistryUnit.F.equalsByKey(registry.getRegistryUnit())) {
|
|
||||||
Optional<Registry> registryBOptional = registriesA.stream().filter(rgs ->
|
|
||||||
rgs.getAccount() != null && rgs.getSecurityId() != null &&
|
|
||||||
rgs.getTradingClearingRegistryId() != null && rgs.getCompanyId() != null &&
|
|
||||||
RegistryUnit.B.equalsByKey(rgs.getRegistryUnit()) &&
|
|
||||||
rgs.getSecurityId() != null && rgs.getSecurityId().equals(registry.getSecurityId()) &&
|
|
||||||
rgs.getCompanyId() != null && rgs.getCompanyId().equals(registry.getCompanyId()) &&
|
|
||||||
rgs.getAccount() != null && rgs.getAccount().equals(registry.getAccount()) &&
|
|
||||||
rgs.getTradingClearingRegistryId() != null && rgs.getTradingClearingRegistryId().equals(registry.getTradingClearingRegistryId())
|
|
||||||
).findFirst();
|
|
||||||
Optional<Registry> registryTOptional = registriesA.stream().filter(rgs ->
|
|
||||||
rgs.getAccount() != null && rgs.getSecurityId() != null &&
|
|
||||||
rgs.getTradingClearingRegistryId() != null && rgs.getCompanyId() != null &&
|
|
||||||
RegistryUnit.T.equalsByKey(rgs.getRegistryUnit()) &&
|
|
||||||
rgs.getSecurityId() != null && rgs.getSecurityId().equals(registry.getSecurityId()) &&
|
|
||||||
rgs.getCompanyId() != null && rgs.getCompanyId().equals(registry.getCompanyId()) &&
|
|
||||||
rgs.getAccount() != null && rgs.getAccount().equals(registry.getAccount()) &&
|
|
||||||
rgs.getTradingClearingRegistryId() != null && rgs.getTradingClearingRegistryId().equals(registry.getTradingClearingRegistryId())
|
|
||||||
).findFirst();
|
|
||||||
BigDecimal balanceB;
|
|
||||||
if (registryBOptional.isPresent()) {
|
|
||||||
balanceB = registryBOptional.get().getBalance();
|
|
||||||
} else {
|
|
||||||
balanceB = BigDecimal.ZERO;
|
|
||||||
}
|
|
||||||
registryTOptional.ifPresent(rgsT -> registry.setBalance(rgsT.getBalance().subtract(balanceB)));
|
|
||||||
}
|
|
||||||
if (RegistryUnit.T.equalsByKey(registry.getRegistryUnit())) {
|
|
||||||
registry.setOpenBalance(registry.getBalance());
|
|
||||||
}
|
|
||||||
|
|
||||||
registry.setDebit(BigDecimal.ZERO);
|
Instant timestamp = Instant.now();
|
||||||
registry.setSettledDebit(BigDecimal.ZERO);
|
for (Map.Entry<RgsKey, List<Registry>> entry : allAssets.entrySet()) {
|
||||||
registry.setCredit(BigDecimal.ZERO);
|
RgsKey key = entry.getKey();
|
||||||
registry.setSettledCredit(BigDecimal.ZERO);
|
List<Registry> group = entry.getValue();
|
||||||
registry.setPlanBalance(BigDecimal.ZERO);
|
Registry a__f = find(group, RegistryTradingParams.A__F).orElse(null);
|
||||||
registry.setCloseBalance(registry.getBalance());
|
Registry a__t = find(group, RegistryTradingParams.A__T).orElse(null);
|
||||||
|
Registry a__b = find(group, RegistryTradingParams.A__B).orElse(null);
|
||||||
registry.setUpdated(Instant.now());
|
if (a__t == null) {
|
||||||
registryImdg.update(registry);
|
log.warn("registry group {}: no A**T registry found.", key);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
BigDecimal a__tBalance = safeBD(a__t.getBalance());
|
||||||
|
a__t.setOpenBalance(a__tBalance);
|
||||||
|
a__t.setCloseBalance(a__tBalance);
|
||||||
|
a__t.setCredit(BigDecimal.ZERO);
|
||||||
|
a__t.setDebit(BigDecimal.ZERO);
|
||||||
|
a__t.setSettledCredit(BigDecimal.ZERO);
|
||||||
|
a__t.setSettledDebit(BigDecimal.ZERO);
|
||||||
|
a__t.setUpdated(timestamp);
|
||||||
|
registryImdg.update(a__t);
|
||||||
|
if (a__f == null) {
|
||||||
|
a__f = assets.copy(a__t, RegistryUnit.F);
|
||||||
|
registryImdg.insert(a__f);
|
||||||
|
}
|
||||||
|
if (a__b != null) {
|
||||||
|
a__b.setBalance(BigDecimal.ZERO);
|
||||||
|
registryImdg.update(a__b);
|
||||||
|
}
|
||||||
|
assets.process(a__b, a__t, a__f, BigDecimal.ZERO);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
package ru.spcex.clearing.service.builder;
|
|
||||||
|
|
||||||
import ru.clearing.classes.statics.data.payment.PaymentInstruction;
|
|
||||||
import ru.clearing.classes.statics.data.registry.Registry;
|
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
|
|
||||||
public class PaymentInstructionBuilderDepositReturn {
|
|
||||||
|
|
||||||
private ImdgProvider imdgProvider;
|
|
||||||
private Long sessionId;
|
|
||||||
private BigDecimal amount;
|
|
||||||
private Registry lm_tRgs;
|
|
||||||
|
|
||||||
public static PaymentInstructionBuilderDepositReturn builder(ImdgProvider imdgProvider) {
|
|
||||||
return new PaymentInstructionBuilderDepositReturn(imdgProvider);
|
|
||||||
}
|
|
||||||
|
|
||||||
private PaymentInstructionBuilderDepositReturn(ImdgProvider imdgProvider) {
|
|
||||||
this.imdgProvider = imdgProvider;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PaymentInstructionBuilderDepositReturn sessionId(Long sessionId) {
|
|
||||||
this.sessionId = sessionId;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PaymentInstructionBuilderDepositReturn amount(BigDecimal amount) {
|
|
||||||
this.amount = amount;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PaymentInstructionBuilderDepositReturn lm_tRgs(Registry rgs) {
|
|
||||||
this.lm_tRgs = rgs;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PaymentInstruction build() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -4,7 +4,9 @@ import org.apache.commons.lang3.StringUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import ru.clearing.classes.statics.data.account.Account;
|
import ru.clearing.classes.statics.data.account.Account;
|
||||||
|
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
|
||||||
import ru.clearing.classes.statics.data.company.Company;
|
import ru.clearing.classes.statics.data.company.Company;
|
||||||
|
import ru.clearing.classes.statics.data.company.CompanyRoleSet;
|
||||||
import ru.clearing.classes.statics.data.company.CompanySymbols;
|
import ru.clearing.classes.statics.data.company.CompanySymbols;
|
||||||
import ru.clearing.classes.statics.data.payment.PaymentInstruction;
|
import ru.clearing.classes.statics.data.payment.PaymentInstruction;
|
||||||
import ru.clearing.classes.statics.data.registry.Registry;
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
|
|
@ -12,12 +14,17 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.platform.enumeration.*;
|
import ru.spcex.platform.enumeration.*;
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||||
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||||
|
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
||||||
|
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||||
import ru.spcex.platform.utils.time.TimeUtil;
|
import ru.spcex.platform.utils.time.TimeUtil;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
|
||||||
|
|
@ -27,6 +34,9 @@ public class PaymentInstructionBuilderV2 {
|
||||||
private ImdgProvider imdgProvider;
|
private ImdgProvider imdgProvider;
|
||||||
private Imdg<Company> companyImdg;
|
private Imdg<Company> companyImdg;
|
||||||
private Imdg<CompanySymbols> companySymbolsImdg;
|
private Imdg<CompanySymbols> companySymbolsImdg;
|
||||||
|
private Imdg<Registry> rgsImdg;
|
||||||
|
private final Imdg<ClearingMemberCategory> clearingCategoryImdg;
|
||||||
|
private final Imdg<CompanyRoleSet> cmpRoleImdg;
|
||||||
private Long sessionId;
|
private Long sessionId;
|
||||||
private BigDecimal amount;
|
private BigDecimal amount;
|
||||||
private Account creditLegAccount;
|
private Account creditLegAccount;
|
||||||
|
|
@ -37,6 +47,9 @@ public class PaymentInstructionBuilderV2 {
|
||||||
private static final DateTimeFormatter DATE_FORMATTER_ddMMyy = DateTimeFormatter.ofPattern("ddMMyy");
|
private static final DateTimeFormatter DATE_FORMATTER_ddMMyy = DateTimeFormatter.ofPattern("ddMMyy");
|
||||||
private Long senderId;
|
private Long senderId;
|
||||||
private Long addresseeId;
|
private Long addresseeId;
|
||||||
|
private boolean useCS_BLKD = false;
|
||||||
|
|
||||||
|
private Registry am_b;
|
||||||
|
|
||||||
public static PaymentInstructionBuilderV2 builder(ImdgProvider imdgProvider) {
|
public static PaymentInstructionBuilderV2 builder(ImdgProvider imdgProvider) {
|
||||||
return new PaymentInstructionBuilderV2(imdgProvider);
|
return new PaymentInstructionBuilderV2(imdgProvider);
|
||||||
|
|
@ -46,6 +59,18 @@ public class PaymentInstructionBuilderV2 {
|
||||||
this.imdgProvider = imdgProvider;
|
this.imdgProvider = imdgProvider;
|
||||||
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||||
this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
|
this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
|
||||||
|
this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||||
|
this.clearingCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
|
||||||
|
this.cmpRoleImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanyRoleSet, CompanyRoleSet.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PaymentInstructionBuilderV2 checkBLKD(Registry rgs) {
|
||||||
|
if (rgs == null) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
this.useCS_BLKD = true;
|
||||||
|
this.am_b = rgs;
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PaymentInstructionBuilderV2 sessionId(Long sessionId) {
|
public PaymentInstructionBuilderV2 sessionId(Long sessionId) {
|
||||||
|
|
@ -128,7 +153,12 @@ public class PaymentInstructionBuilderV2 {
|
||||||
payment.setPaymentDate(Instant.now());
|
payment.setPaymentDate(Instant.now());
|
||||||
payment.setSettlementDate(LocalDate.now());
|
payment.setSettlementDate(LocalDate.now());
|
||||||
}
|
}
|
||||||
payment.setPaymentPurpose(purpose);
|
|
||||||
|
if (useCS_BLKD && checkAgent()) {
|
||||||
|
payment.setPaymentPurpose(SpecifFlag.CS_BLKD.getKey() + "_" + sessionId + " " + purpose);
|
||||||
|
} else {
|
||||||
|
payment.setPaymentPurpose(purpose);
|
||||||
|
}
|
||||||
payment.setCreditLeg_amount(amount);
|
payment.setCreditLeg_amount(amount);
|
||||||
payment.setDebitLeg_amount(amount);
|
payment.setDebitLeg_amount(amount);
|
||||||
|
|
||||||
|
|
@ -193,4 +223,41 @@ public class PaymentInstructionBuilderV2 {
|
||||||
return cSymbol.getCompanySymbolValue();
|
return cSymbol.getCompanySymbolValue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean checkAgent() {
|
||||||
|
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder();
|
||||||
|
ImdgPredicate prdct = pb.and(
|
||||||
|
pb.equals("sessionId", sessionId),
|
||||||
|
pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.CM__).build()),
|
||||||
|
pb.equals("companyId", addresseeId),
|
||||||
|
pb.equals("accountId", am_b.getAccountId())
|
||||||
|
);
|
||||||
|
Collection<Registry> claims = rgsImdg.getCollectionObjectsByPredicate(prdct);
|
||||||
|
boolean hasCounterPartyInitiator = false;
|
||||||
|
for (Registry claim : claims) {
|
||||||
|
Long counterPartyId = claim.getCounterPartyId();
|
||||||
|
if (categoryIOrVInitiator(counterPartyId) && companyRoleODEPPresent(counterPartyId)) {
|
||||||
|
hasCounterPartyInitiator = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return hasCounterPartyInitiator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean categoryIOrVInitiator(Long companyId) {
|
||||||
|
ClearingMemberCategory category = clearingCategoryImdg.getFirstObjectByFieldValues(
|
||||||
|
Map.of("companyId", companyId));
|
||||||
|
ClearingCategory ctg = IEnumKey.getEnumByKey(ClearingCategory.class, category.getClearingMemberCategory());
|
||||||
|
return ctg != null && (ctg.equals(ClearingCategory.V) || ctg.equals(ClearingCategory.I)) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean companyRoleODEPPresent(Long companyId) {
|
||||||
|
return cmpRoleImdg.getFirstObjectBySQL(
|
||||||
|
"companyId = %d and companyRole = '%s' and workflowStatus = '%s'".formatted(
|
||||||
|
companyId,
|
||||||
|
CompanyRole.ODEP.getKey(),
|
||||||
|
WorkflowStatus.Active.getKey()
|
||||||
|
)
|
||||||
|
) != null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -133,6 +133,7 @@ public class RegistryBuilder {
|
||||||
rgs.setCredit(BigDecimal.ZERO);
|
rgs.setCredit(BigDecimal.ZERO);
|
||||||
rgs.setDiffBalance(BigDecimal.ZERO);
|
rgs.setDiffBalance(BigDecimal.ZERO);
|
||||||
rgs.setCheckBalance(BigDecimal.ZERO);
|
rgs.setCheckBalance(BigDecimal.ZERO);
|
||||||
|
rgs.setOpenBalance(BigDecimal.ZERO);
|
||||||
return rgs;
|
return rgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -133,6 +133,7 @@ public class RegistrySecurityBuilder {
|
||||||
rgs.setCredit(BigDecimal.ZERO);
|
rgs.setCredit(BigDecimal.ZERO);
|
||||||
rgs.setDiffBalance(BigDecimal.ZERO);
|
rgs.setDiffBalance(BigDecimal.ZERO);
|
||||||
rgs.setCheckBalance(BigDecimal.ZERO);
|
rgs.setCheckBalance(BigDecimal.ZERO);
|
||||||
|
rgs.setOpenBalance(BigDecimal.ZERO);
|
||||||
return rgs;
|
return rgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,29 +11,34 @@ import org.springframework.stereotype.Component;
|
||||||
import ru.clearing.classes.statics.data.account.ClientCode;
|
import ru.clearing.classes.statics.data.account.ClientCode;
|
||||||
import ru.clearing.classes.statics.data.company.Company;
|
import ru.clearing.classes.statics.data.company.Company;
|
||||||
import ru.clearing.classes.statics.data.execution.ExecutionFond;
|
import ru.clearing.classes.statics.data.execution.ExecutionFond;
|
||||||
|
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeCashFlow;
|
||||||
|
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
|
||||||
import ru.clearing.classes.statics.data.misc.Listing;
|
import ru.clearing.classes.statics.data.misc.Listing;
|
||||||
import ru.clearing.classes.statics.data.misc.STrades;
|
import ru.clearing.classes.statics.data.misc.STrades;
|
||||||
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
|
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
|
||||||
import ru.clearing.classes.statics.data.security.Security;
|
import ru.clearing.classes.statics.data.security.Security;
|
||||||
|
import ru.spcex.clearing.config.element.ClearingServiceSettings;
|
||||||
import ru.spcex.clearing.error.ClearingError;
|
import ru.spcex.clearing.error.ClearingError;
|
||||||
import ru.spcex.clearing.error.ClearingException;
|
import ru.spcex.clearing.error.ClearingException;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.spcex.clearing.notification.NotificationSender;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.registry.DealRegisterNewRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.registry.DealRegisterNewRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExecutionType;
|
import ru.spcex.clearing.platform.messaging.domain.cud.registry.ExecutionType;
|
||||||
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
|
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
|
||||||
import ru.spcex.clearing.service.validation.ValidationStored;
|
import ru.spcex.clearing.service.validation.ValidationStored;
|
||||||
import ru.spcex.platform.enumeration.CurrencyCode;
|
import ru.spcex.platform.enumeration.*;
|
||||||
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.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
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.ImdgPredicateBuilder;
|
||||||
import ru.spcex.platform.utils.enumeration.*;
|
import ru.spcex.platform.utils.enumeration.*;
|
||||||
import ru.spcex.platform.utils.log.ExceptionUtils;
|
import ru.spcex.platform.utils.log.ExceptionUtils;
|
||||||
import ru.spcex.platform.utils.time.TimeUtil;
|
import ru.spcex.platform.utils.time.TimeUtil;
|
||||||
import ru.spcex.platform.utils.validation.IValidator;
|
import ru.spcex.platform.utils.validation.IValidator;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
@ -41,6 +46,8 @@ import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@EnableScheduling
|
@EnableScheduling
|
||||||
public class ExecutionFondComponent {
|
public class ExecutionFondComponent {
|
||||||
|
|
@ -50,6 +57,7 @@ public class ExecutionFondComponent {
|
||||||
private final Imdg<ExecutionFond> executionFondImdg;
|
private final Imdg<ExecutionFond> executionFondImdg;
|
||||||
private final Imdg<Listing> listingImdg;
|
private final Imdg<Listing> listingImdg;
|
||||||
private final Imdg<ClientCode> clientCodeImdg;
|
private final Imdg<ClientCode> clientCodeImdg;
|
||||||
|
private final Imdg<FixedIncomeCashFlow> fixedIncomeCashFlowImdg;
|
||||||
private final Imdg<ru.clearing.classes.statics.data.misc.Market> marketImdg;
|
private final Imdg<ru.clearing.classes.statics.data.misc.Market> marketImdg;
|
||||||
|
|
||||||
//fixme ждать ТЗ
|
//fixme ждать ТЗ
|
||||||
|
|
@ -58,19 +66,26 @@ public class ExecutionFondComponent {
|
||||||
private final IMessageResolver msgResolver = new SimpleMessageResolver();
|
private final IMessageResolver msgResolver = new SimpleMessageResolver();
|
||||||
private final Function<STrades, IValidator> stradesValidator;
|
private final Function<STrades, IValidator> stradesValidator;
|
||||||
private final KafkaSender kafkaSender;
|
private final KafkaSender kafkaSender;
|
||||||
|
private final NotificationSender notifications;
|
||||||
|
private final boolean valuation;
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public ExecutionFondComponent(ImdgProvider imdgProvider, Producer<String, Object> kafka,
|
public ExecutionFondComponent(ImdgProvider imdgProvider,
|
||||||
|
ClearingServiceSettings settings,
|
||||||
|
Producer<String, Object> kafka,
|
||||||
@Qualifier("sTradesValidatorFond") Function<STrades, IValidator> stradesValidator,
|
@Qualifier("sTradesValidatorFond") Function<STrades, IValidator> stradesValidator,
|
||||||
@Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender) {
|
@Qualifier("kafkaSenderWithoutRequestInfo") KafkaSender kafkaSender, NotificationSender notifications) {
|
||||||
this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class);
|
this.sTradeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_STrades, STrades.class);
|
||||||
this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
|
this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
|
||||||
this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
|
this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
|
||||||
this.clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
|
this.clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
|
||||||
this.marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, ru.clearing.classes.statics.data.misc.Market.class);
|
this.marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, ru.clearing.classes.statics.data.misc.Market.class);
|
||||||
|
this.fixedIncomeCashFlowImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeCashFlow, FixedIncomeCashFlow.class);
|
||||||
|
this.valuation = settings.getTrade().getValuation(); //fixme
|
||||||
this.stradesValidator = stradesValidator;
|
this.stradesValidator = stradesValidator;
|
||||||
this.kafkaSender = kafkaSender;
|
this.kafkaSender = kafkaSender;
|
||||||
|
this.notifications = notifications;
|
||||||
|
|
||||||
resetTradingDay();
|
resetTradingDay();
|
||||||
}
|
}
|
||||||
|
|
@ -119,7 +134,7 @@ public class ExecutionFondComponent {
|
||||||
log.info("{} strades left after already-added filtering", sTrades.size());
|
log.info("{} strades left after already-added filtering", sTrades.size());
|
||||||
|
|
||||||
for (STrades sTrd : sTrades) {
|
for (STrades sTrd : sTrades) {
|
||||||
log.trace("S_TRADE[{}] new", sTrd.getId());
|
log.info("new S_TRADE[{}], valuation {}", sTrd.getId(), valuation);
|
||||||
|
|
||||||
//проверки
|
//проверки
|
||||||
IValidator validator = stradesValidator.apply(sTrd);
|
IValidator validator = stradesValidator.apply(sTrd);
|
||||||
|
|
@ -165,6 +180,7 @@ public class ExecutionFondComponent {
|
||||||
protected ExecutionFond createExecutionFond(STrades sTrades,
|
protected ExecutionFond createExecutionFond(STrades sTrades,
|
||||||
IValidator validator) throws ClearingException {
|
IValidator validator) throws ClearingException {
|
||||||
Security security = validator.getStored(ValidationStored.STradesSecurity);
|
Security security = validator.getStored(ValidationStored.STradesSecurity);
|
||||||
|
// Listing listing = listingImdg.getFirstObjectByFieldValues(Map.of("securityId", security.getId()));
|
||||||
Company company = validator.getStored(ValidationStored.STradesCompany);
|
Company company = validator.getStored(ValidationStored.STradesCompany);
|
||||||
Company counterCompany = validator.getStored(ValidationStored.STradesCounterCompany);
|
Company counterCompany = validator.getStored(ValidationStored.STradesCounterCompany);
|
||||||
TradingClearingRegistry rgstr = validator.getStored(ValidationStored.STradesTradingClearingRegistry);
|
TradingClearingRegistry rgstr = validator.getStored(ValidationStored.STradesTradingClearingRegistry);
|
||||||
|
|
@ -212,7 +228,57 @@ public class ExecutionFondComponent {
|
||||||
eFond.setSecurityId(security.getId());
|
eFond.setSecurityId(security.getId());
|
||||||
eFond.setInterestAmount(sTrades.getAccruedint());
|
eFond.setInterestAmount(sTrades.getAccruedint());
|
||||||
eFond.setExchangeOrderId(sTrades.getOrderNum());
|
eFond.setExchangeOrderId(sTrades.getOrderNum());
|
||||||
eFond.setSettlementAmount(sTrades.getValue());
|
if (valuation) {
|
||||||
|
Listing listing = listingImdg.getFirstObjectBySQL("securityId = %d and market = '%s'".formatted(security.getId(), sTrades.getClassCode()));
|
||||||
|
BigDecimal lotSize = listing != null ? safeBD(listing.getLotSize()) : BigDecimal.ONE;
|
||||||
|
BigDecimal qty = safeBD(eFond.getLots()).multiply(lotSize);
|
||||||
|
eFond.setQuantity(qty);
|
||||||
|
BigDecimal price = safeBD(sTrades.getPrice());// eFond.setPrice
|
||||||
|
BigDecimal settlementAmount = BigDecimal.ZERO;
|
||||||
|
if (InstrumentType.BOND.equalsByKey(security.getInstrumentType())) {
|
||||||
|
FixedIncomeSecurity fixedIncome = (FixedIncomeSecurity) security;
|
||||||
|
BigDecimal nominalValue;
|
||||||
|
ImdgPredicateBuilder pb = fixedIncomeCashFlowImdg.predicateBuilder();
|
||||||
|
ImdgPredicate prdct = pb.and(
|
||||||
|
pb.equals("securityId", fixedIncome.getId()),
|
||||||
|
sTrades.getSettleDate() != null ?
|
||||||
|
pb.equals("valueDate", sTrades.getSettleDate()) : pb.alwaysFalse()
|
||||||
|
);
|
||||||
|
FixedIncomeCashFlow cashFlow = fixedIncomeCashFlowImdg.getFirstObjectByPredicate(prdct);
|
||||||
|
if (cashFlow != null) {
|
||||||
|
nominalValue = safeBD(cashFlow.getNominalValue());
|
||||||
|
} else {
|
||||||
|
nominalValue = safeBD(fixedIncome.getNominalValue());
|
||||||
|
}
|
||||||
|
{
|
||||||
|
settlementAmount = eFond.getQuantity()
|
||||||
|
.multiply(nominalValue)
|
||||||
|
.multiply(price)
|
||||||
|
.divide(new BigDecimal(100), RoundingMode.HALF_UP)
|
||||||
|
.setScale(2, RoundingMode.HALF_UP);
|
||||||
|
}
|
||||||
|
} else if (InstrumentType.EQTY.equalsByKey(security.getInstrumentType())) {
|
||||||
|
BigDecimal lotsEqty = safeBD(eFond.getQuantity());
|
||||||
|
settlementAmount = lotsEqty.multiply(price).setScale(2, RoundingMode.HALF_UP);
|
||||||
|
}
|
||||||
|
eFond.setSettlementAmount(settlementAmount);
|
||||||
|
if (settlementAmount.compareTo(safeBD(sTrades.getValue())) != 0) {
|
||||||
|
log.warn("sTrades.TradeNum={} sTrades.value({}) != eFond({})",
|
||||||
|
sTrades.getTradeNum(),
|
||||||
|
safeBD(sTrades.getValue()),
|
||||||
|
settlementAmount);
|
||||||
|
notifications.sendNotification(
|
||||||
|
ObjectType.vfrs,
|
||||||
|
"Для сделки %s объем сделки в ТС %s не совпадает с расчитанным в КС %s"
|
||||||
|
.formatted(sTrades.getTradeNum(),
|
||||||
|
safeBD(sTrades.getValue()).toString(),
|
||||||
|
settlementAmount.toString()),
|
||||||
|
Priority.HIGH
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
eFond.setSettlementAmount(sTrades.getValue());
|
||||||
|
}
|
||||||
eFond.setCounterPartyId(counterCompany.getId());
|
eFond.setCounterPartyId(counterCompany.getId());
|
||||||
{
|
{
|
||||||
ImdgPredicateBuilder strPb = sTradeImdg.predicateBuilder();
|
ImdgPredicateBuilder strPb = sTradeImdg.predicateBuilder();
|
||||||
|
|
|
||||||
|
|
@ -41,9 +41,7 @@ import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
|
|
@ -112,7 +110,9 @@ public class Sdf01Executor extends AbstractExecutor<SDf01> {
|
||||||
result.setChildGenerationId(generationIdForGroup);
|
result.setChildGenerationId(generationIdForGroup);
|
||||||
result.setFileName(filenameObtainer.getFilename(sdf, sdf01Imdg, statementRequest.getGroupId()));
|
result.setFileName(filenameObtainer.getFilename(sdf, sdf01Imdg, statementRequest.getGroupId()));
|
||||||
log.info("SDF01 execution: sdf01 file={} number={}, groupId={}", result.getFileName(), sdf.size(), sdf.stream().findFirst().map(SDf01::getGenerationId).orElse(null));
|
log.info("SDF01 execution: sdf01 file={} number={}, groupId={}", result.getFileName(), sdf.size(), sdf.stream().findFirst().map(SDf01::getGenerationId).orElse(null));
|
||||||
for (SDf01 sdf01 : sdf) {
|
ArrayList<SDf01> orderedSdf = new ArrayList<>(sdf);
|
||||||
|
orderedSdf.sort(Comparator.comparing(SDf01::getId));// Сортировка по возрастанию id, чтобы сохранить последовательность строк SDF02, как в SDF01
|
||||||
|
for (SDf01 sdf01 : orderedSdf) {
|
||||||
IValidator validator = sDf01Validator.apply(sdf01);
|
IValidator validator = sDf01Validator.apply(sdf01);
|
||||||
Optional<EnumMessage> error = validator.tillFirstError();
|
Optional<EnumMessage> error = validator.tillFirstError();
|
||||||
Company company = validator.getStored(ValidationStored.Sdf01Company);
|
Company company = validator.getStored(ValidationStored.Sdf01Company);
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,9 @@ import ru.spcex.clearing.platform.messaging.domain.cud.clearing.AssetOperationRe
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.AssetOperationApprovalRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.AssetOperationApprovalRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SingleAssetResponse;
|
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SingleAssetResponse;
|
||||||
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
|
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
|
||||||
|
import ru.spcex.clearing.service.AssetTrio;
|
||||||
import ru.spcex.clearing.service.integration.GatewayRequestCreator;
|
import ru.spcex.clearing.service.integration.GatewayRequestCreator;
|
||||||
|
import ru.spcex.clearing.service.registry.AssetTBFProcessing;
|
||||||
import ru.spcex.clearing.service.registry.DmiService;
|
import ru.spcex.clearing.service.registry.DmiService;
|
||||||
import ru.spcex.clearing.service.schedule.TradingTimeService;
|
import ru.spcex.clearing.service.schedule.TradingTimeService;
|
||||||
import ru.spcex.clearing.service.validation.Sdf06NewValidationRule;
|
import ru.spcex.clearing.service.validation.Sdf06NewValidationRule;
|
||||||
|
|
@ -66,6 +68,7 @@ public class Sdf06Executor {
|
||||||
private final KafkaSender kafkaSender;
|
private final KafkaSender kafkaSender;
|
||||||
private final FilenameObtainer filenameObtainer;
|
private final FilenameObtainer filenameObtainer;
|
||||||
private final DmiService dmiService;
|
private final DmiService dmiService;
|
||||||
|
private final AssetTBFProcessing assets;
|
||||||
|
|
||||||
private final static BigDecimal successResult = BigDecimal.ZERO;
|
private final static BigDecimal successResult = BigDecimal.ZERO;
|
||||||
//идет сессия (не возвращаем такую ошибку)
|
//идет сессия (не возвращаем такую ошибку)
|
||||||
|
|
@ -87,7 +90,7 @@ public class Sdf06Executor {
|
||||||
public Sdf06Executor(ImdgProvider imdgProvider,
|
public Sdf06Executor(ImdgProvider imdgProvider,
|
||||||
IMessageResolver messageResolver,
|
IMessageResolver messageResolver,
|
||||||
@Qualifier("sdf06ValidatorNew") Function<SDf06, IValidator> sDf06Validator,
|
@Qualifier("sdf06ValidatorNew") Function<SDf06, IValidator> sDf06Validator,
|
||||||
TradingTimeService tradingTimeService, KafkaSender kafkaSender, FilenameObtainer filenameObtainer, DmiService dmiService) {
|
TradingTimeService tradingTimeService, KafkaSender kafkaSender, FilenameObtainer filenameObtainer, DmiService dmiService, AssetTBFProcessing assets) {
|
||||||
this.imdgProvider = imdgProvider;
|
this.imdgProvider = imdgProvider;
|
||||||
this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
|
this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
|
||||||
this.tradingTimeService = tradingTimeService;
|
this.tradingTimeService = tradingTimeService;
|
||||||
|
|
@ -102,6 +105,7 @@ public class Sdf06Executor {
|
||||||
this.sdf07Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf07, SDf07.class);
|
this.sdf07Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf07, SDf07.class);
|
||||||
this.filenameObtainer = filenameObtainer;
|
this.filenameObtainer = filenameObtainer;
|
||||||
this.dmiService = dmiService;
|
this.dmiService = dmiService;
|
||||||
|
this.assets = assets;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void execute(BaseRequest<StatementRequest> systemRequest) {
|
public void execute(BaseRequest<StatementRequest> systemRequest) {
|
||||||
|
|
@ -160,6 +164,8 @@ public class Sdf06Executor {
|
||||||
CurrencyCode.RUB.getKey(),
|
CurrencyCode.RUB.getKey(),
|
||||||
safeBD(sDf06.getSum()),
|
safeBD(sDf06.getSum()),
|
||||||
sDf06.getNumber().toString());
|
sDf06.getNumber().toString());
|
||||||
|
Optional<AssetTrio> asts = assets.searchMoneyByAccAndCompany(company.getId(), tcr.getMoneyAccountId());
|
||||||
|
asts.ifPresent(ast -> assets.process(ast.a__b(), ast.a__t(), ast.a__f(), BigDecimal.ZERO));
|
||||||
}
|
}
|
||||||
sdf07WasCreated = true;
|
sdf07WasCreated = true;
|
||||||
}
|
}
|
||||||
|
|
@ -266,11 +272,16 @@ public class Sdf06Executor {
|
||||||
Instant updatedTime = Instant.now();
|
Instant updatedTime = Instant.now();
|
||||||
if (gatewayMsg.isApproved()) {
|
if (gatewayMsg.isApproved()) {
|
||||||
processedApproved(stmt, sdf06, updatedTime);
|
processedApproved(stmt, sdf06, updatedTime);
|
||||||
dmiService.setProcContract(searchTcrOnGatewayResponse(sdf06).map(SpcexObjectBase::getId).orElse(null),
|
Optional<TradingClearingRegistry> tcr = searchTcrOnGatewayResponse(sdf06);
|
||||||
|
dmiService.setProcContract(tcr.map(SpcexObjectBase::getId).orElse(null),
|
||||||
CurrencyCode.RUB.getKey(),
|
CurrencyCode.RUB.getKey(),
|
||||||
safeBD(sdf06.getSum()),
|
safeBD(sdf06.getSum()),
|
||||||
sdf06.getNumber().toString()
|
sdf06.getNumber().toString()
|
||||||
);
|
);
|
||||||
|
if (tcr.isPresent()) {
|
||||||
|
Optional<AssetTrio> asts = assets.searchMoneyByAccAndCompany(tcr.get().getCompanyId(), tcr.get().getMoneyAccountId());
|
||||||
|
asts.ifPresent(a -> assets.process(a.a__b(), a.a__t(), a.a__f(), BigDecimal.ZERO));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
log.trace("statement.id={}, sdf07.id={}, sdf06.id={} rejected (by gateway answer)",
|
log.trace("statement.id={}, sdf07.id={}, sdf06.id={} rejected (by gateway answer)",
|
||||||
statementId,
|
statementId,
|
||||||
|
|
|
||||||
|
|
@ -346,6 +346,7 @@ public class Sdf08Executor extends AbstractExecutor<SDf08> {
|
||||||
rgs.setCredit(BigDecimal.ZERO);
|
rgs.setCredit(BigDecimal.ZERO);
|
||||||
rgs.setDiffBalance(BigDecimal.ZERO);
|
rgs.setDiffBalance(BigDecimal.ZERO);
|
||||||
rgs.setCheckBalance(BigDecimal.ZERO);
|
rgs.setCheckBalance(BigDecimal.ZERO);
|
||||||
|
rgs.setOpenBalance(BigDecimal.ZERO);
|
||||||
rgs.setBalanceDimension(BalanceDimension.MONY.getKey());
|
rgs.setBalanceDimension(BalanceDimension.MONY.getKey());
|
||||||
rgs.setTradingDate(statement.getSettlementDate());
|
rgs.setTradingDate(statement.getSettlementDate());
|
||||||
rgs.setClearingDate(LocalDate.now());
|
rgs.setClearingDate(LocalDate.now());
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.gateway.AssetOperationApp
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SingleAssetResponse;
|
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SingleAssetResponse;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.importexport.SwtExporterRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.importexport.SwtExporterRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
|
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
|
||||||
|
import ru.spcex.clearing.service.registry.AssetTBFProcessing;
|
||||||
import ru.spcex.clearing.service.registry.RegistryManager;
|
import ru.spcex.clearing.service.registry.RegistryManager;
|
||||||
import ru.spcex.clearing.service.schedule.TradingTimeService;
|
import ru.spcex.clearing.service.schedule.TradingTimeService;
|
||||||
import ru.spcex.clearing.service.validation.ValidationStored;
|
import ru.spcex.clearing.service.validation.ValidationStored;
|
||||||
|
|
@ -68,6 +69,7 @@ public class Sdf10Executor {
|
||||||
private final TradingTimeService tradingTimeService;
|
private final TradingTimeService tradingTimeService;
|
||||||
private final KafkaSender kafkaSender;
|
private final KafkaSender kafkaSender;
|
||||||
private final SecuritySelector<Security> scrtSlct;
|
private final SecuritySelector<Security> scrtSlct;
|
||||||
|
private final AssetTBFProcessing assets;
|
||||||
|
|
||||||
private final static String OK = "OK";
|
private final static String OK = "OK";
|
||||||
private final static String SYNTAX_ERROR = "Синтаксическая ошибка (файл сформирован неверно)";
|
private final static String SYNTAX_ERROR = "Синтаксическая ошибка (файл сформирован неверно)";
|
||||||
|
|
@ -88,7 +90,7 @@ public class Sdf10Executor {
|
||||||
public Sdf10Executor(ImdgProvider imdgProvider,
|
public Sdf10Executor(ImdgProvider imdgProvider,
|
||||||
RegistryManager rgsMng, IMessageResolver messageResolver,
|
RegistryManager rgsMng, IMessageResolver messageResolver,
|
||||||
@Qualifier("sdf10Validator") Function<SDf10, IValidator> sDf10Validator,
|
@Qualifier("sdf10Validator") Function<SDf10, IValidator> sDf10Validator,
|
||||||
TradingTimeService tradingTimeService, KafkaSender kafkaSender) {
|
TradingTimeService tradingTimeService, KafkaSender kafkaSender, AssetTBFProcessing assets) {
|
||||||
this.imdgProvider = imdgProvider;
|
this.imdgProvider = imdgProvider;
|
||||||
this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
|
this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
|
||||||
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||||
|
|
@ -102,6 +104,7 @@ public class Sdf10Executor {
|
||||||
this.sdf11Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf11, SDf11.class);
|
this.sdf11Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf11, SDf11.class);
|
||||||
this.plannerAllTodayImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PlannerAllToday, PlannerAllToday.class);
|
this.plannerAllTodayImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_PlannerAllToday, PlannerAllToday.class);
|
||||||
this.scrtSlct = new SecuritySelector<>(imdgProvider, Security.class);
|
this.scrtSlct = new SecuritySelector<>(imdgProvider, Security.class);
|
||||||
|
this.assets = assets;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void execute(BaseRequest<StatementRequest> systemRequest) {
|
public void execute(BaseRequest<StatementRequest> systemRequest) {
|
||||||
|
|
@ -166,7 +169,11 @@ public class Sdf10Executor {
|
||||||
SDf11 sDf11 = processedApproved(stmt, sDf10, now, sdf11GroupId);
|
SDf11 sDf11 = processedApproved(stmt, sDf10, now, sdf11GroupId);
|
||||||
BigDecimal amount = InOutDirection.in.equalsByKey(stmt.getInOutDirection()) ?
|
BigDecimal amount = InOutDirection.in.equalsByKey(stmt.getInOutDirection()) ?
|
||||||
stmt.getAmount() : safeBD(stmt.getAmount()).negate();
|
stmt.getAmount() : safeBD(stmt.getAmount()).negate();
|
||||||
createDs_iWithoutGateway(tcr.getId(), company.getId(), security.getSecuritySymbol(), amount, sDf10.getOutDocument());
|
createDs_iWithoutGateway(tcr.getId(),
|
||||||
|
company.getId(),
|
||||||
|
security.getSecuritySymbol(),
|
||||||
|
amount,
|
||||||
|
sDf10.getOutDocument());
|
||||||
sdf11WasCreated = true;
|
sdf11WasCreated = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -190,6 +197,7 @@ public class Sdf10Executor {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
createDs_i(as_t.get(), summ, outDocument);
|
createDs_i(as_t.get(), summ, outDocument);
|
||||||
|
assets.processByA__t(as_t.get(), BigDecimal.ZERO);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createDs_iWithoutGateway(Long tcrId, Long companyId, String securitySymobl, BigDecimal summ, String outDocument) {
|
private void createDs_iWithoutGateway(Long tcrId, Long companyId, String securitySymobl, BigDecimal summ, String outDocument) {
|
||||||
|
|
@ -203,19 +211,19 @@ public class Sdf10Executor {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
createDs_i(as_t.get(), summ, outDocument);
|
createDs_i(as_t.get(), summ, outDocument);
|
||||||
|
assets.processByA__t(as_t.get(), BigDecimal.ZERO);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createDs_i(Registry as_t, BigDecimal summ, String outDocument) {
|
private void createDs_i(Registry as_t, BigDecimal summ, String outDocument) {
|
||||||
Registry rgsD = as_t.clone();
|
Registry rgsD = as_t.clone();
|
||||||
|
RegistryManager.zeroState(rgsD);
|
||||||
rgsD.setRegistryDesignation(RegistryDesignation.D.getKey());
|
rgsD.setRegistryDesignation(RegistryDesignation.D.getKey());
|
||||||
rgsD.setRegistryUnit(RegistryUnit.I.getKey());
|
rgsD.setRegistryUnit(RegistryUnit.I.getKey());
|
||||||
rgsD.setRegistryCode(RegistryUtil.clearingCode(rgsD));
|
rgsD.setRegistryCode(RegistryUtil.clearingCode(rgsD));
|
||||||
rgsD.setBalance(summ);
|
rgsD.setBalance(summ);
|
||||||
rgsD.setDebit(BigDecimal.ZERO);
|
|
||||||
rgsD.setCredit(BigDecimal.ZERO);
|
|
||||||
rgsD.setDiffBalance(BigDecimal.ZERO);
|
|
||||||
rgsD.setCheckBalance(BigDecimal.ZERO);
|
|
||||||
rgsD.setRegistryStatus(RegistryStatus.PROC.getKey());
|
rgsD.setRegistryStatus(RegistryStatus.PROC.getKey());
|
||||||
|
rgsD.setOpenBalance(BigDecimal.ZERO);
|
||||||
|
rgsD.setCloseBalance(BigDecimal.ZERO);
|
||||||
rgsD.setContract(outDocument);
|
rgsD.setContract(outDocument);
|
||||||
registryImdg.insert(rgsD);
|
registryImdg.insert(rgsD);
|
||||||
log.debug("created DS*I.id={}", rgsD.getId());
|
log.debug("created DS*I.id={}", rgsD.getId());
|
||||||
|
|
|
||||||
|
|
@ -195,7 +195,7 @@ public class Sdf20Executor {
|
||||||
Long securityId) {
|
Long securityId) {
|
||||||
Statement stmt = new Statement();
|
Statement stmt = new Statement();
|
||||||
stmt.setAddresseeId(companyId);
|
stmt.setAddresseeId(companyId);
|
||||||
stmt.setSenderId(Sender.Prc.getId());
|
stmt.setSenderId(Sender.Rdc.getId());
|
||||||
stmt.setStatementType(StatementType.incr.getKey());
|
stmt.setStatementType(StatementType.incr.getKey());
|
||||||
//fixme stmt.setComment(sdf10.());
|
//fixme stmt.setComment(sdf10.());
|
||||||
stmt.setAccountId(account.getId());
|
stmt.setAccountId(account.getId());
|
||||||
|
|
|
||||||
|
|
@ -137,11 +137,11 @@ public class Sdf21Executor extends AbstractExecutor<SDf21> {
|
||||||
result.setChildGenerationId(generationIdForGroup);
|
result.setChildGenerationId(generationIdForGroup);
|
||||||
log.info("SDF21 execution: sdf21 number={}, groupId={}", sdf.size(), sdf.stream().findFirst().map(SDf21::getGenerationId).orElse(null));
|
log.info("SDF21 execution: sdf21 number={}, groupId={}", sdf.size(), sdf.stream().findFirst().map(SDf21::getGenerationId).orElse(null));
|
||||||
for (SDf21 sdf21 : sdf) {
|
for (SDf21 sdf21 : sdf) {
|
||||||
LocalDate opDt = operationDateParse(sdf21.getOperationDate());
|
//LocalDate opDt = operationDateParse(sdf21.getOperationDate());
|
||||||
if (opDt == null || !opDt.equals(LocalDate.now())) {
|
//if (opDt == null || !opDt.equals(LocalDate.now())) {
|
||||||
log.debug("skip sdf21.id={}, operation date {}", sdf21.getId(), sdf21.getOperationDate());
|
// log.debug("skip sdf21.id={}, operation date {}", sdf21.getId(), sdf21.getOperationDate());
|
||||||
continue;
|
// continue;
|
||||||
}
|
//}
|
||||||
IValidator validator = sDf21Validator.apply(sdf21);
|
IValidator validator = sDf21Validator.apply(sdf21);
|
||||||
Optional<EnumMessage> error = validator.tillFirstError();
|
Optional<EnumMessage> error = validator.tillFirstError();
|
||||||
if (error.isPresent()) {
|
if (error.isPresent()) {
|
||||||
|
|
@ -260,7 +260,7 @@ public class Sdf21Executor extends AbstractExecutor<SDf21> {
|
||||||
private Statement create(SDf21 sdf21, Company cmp, Account acc) {
|
private Statement create(SDf21 sdf21, Company cmp, Account acc) {
|
||||||
Statement statement = new Statement();
|
Statement statement = new Statement();
|
||||||
statement.setAddresseeId(cmp.getId());
|
statement.setAddresseeId(cmp.getId());
|
||||||
statement.setSenderId(Sender.Prc.getId());
|
statement.setSenderId(Sender.Rdc.getId());
|
||||||
statement.setStatementType(StatementType.incr.getKey());
|
statement.setStatementType(StatementType.incr.getKey());
|
||||||
//fixme statement.setComment(sdf21.());
|
//fixme statement.setComment(sdf21.());
|
||||||
statement.setAccountId(acc.getId());
|
statement.setAccountId(acc.getId());
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@ import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||||
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
||||||
|
import ru.spcex.platform.utils.log.ExceptionUtils;
|
||||||
import ru.spcex.platform.utils.text.TextUtil;
|
import ru.spcex.platform.utils.text.TextUtil;
|
||||||
import ru.spcex.platform.utils.validation.IValidator;
|
import ru.spcex.platform.utils.validation.IValidator;
|
||||||
|
|
||||||
|
|
@ -62,6 +63,7 @@ import java.util.Optional;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import static ru.spcex.platform.enumeration.RegistryTradingParams.D__V;
|
import static ru.spcex.platform.enumeration.RegistryTradingParams.D__V;
|
||||||
|
|
@ -167,6 +169,9 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
|
||||||
result.setChildGenerationId(generationIdForGroup);
|
result.setChildGenerationId(generationIdForGroup);
|
||||||
log.info("SDF57 execution: sdf57 number={}, groupId={}", sdf.size(), sdf.stream().findFirst().map(SDf57::getGenerationId).orElse(null));
|
log.info("SDF57 execution: sdf57 number={}, groupId={}", sdf.size(), sdf.stream().findFirst().map(SDf57::getGenerationId).orElse(null));
|
||||||
AtomicReference<Boolean> sessionIsNeededFlag = new AtomicReference<>(false);
|
AtomicReference<Boolean> sessionIsNeededFlag = new AtomicReference<>(false);
|
||||||
|
boolean sessionIsPresent = sessionImdg.getFirstObjectByFieldValues(Map.of(
|
||||||
|
"workflowStatus", SessionStatus.ACTV.getKey()
|
||||||
|
)) != null;
|
||||||
for (SDf57 sdf57 : sdf) {
|
for (SDf57 sdf57 : sdf) {
|
||||||
IValidator validator = sDf57Validator.apply(sdf57);
|
IValidator validator = sDf57Validator.apply(sdf57);
|
||||||
Optional<EnumMessage> error = validator.tillFirstError();
|
Optional<EnumMessage> error = validator.tillFirstError();
|
||||||
|
|
@ -363,10 +368,11 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
|
||||||
stmt.getId(), asts.a__t().getRegistryCode(), asts.a__t().getId());
|
stmt.getId(), asts.a__t().getRegistryCode(), asts.a__t().getId());
|
||||||
} else {
|
} else {
|
||||||
log.trace("sending gateway request for stmt.id={}", stmt.getId());
|
log.trace("sending gateway request for stmt.id={}", stmt.getId());
|
||||||
kafka.sendRequestToQueue(Consts.ASSET_OPERATION,
|
Optional<AssetOperationListRequest> gtwReq = gatewayRequest(stmt,
|
||||||
gatewayRequest(stmt,
|
company,
|
||||||
company.getTradingCode(),
|
account,
|
||||||
asts.a__t().getTradingClearingRegistry()));
|
asts.a__t().getTradingClearingRegistry());
|
||||||
|
gtwReq.ifPresent(r -> kafka.sendRequestToQueue(Consts.ASSET_OPERATION, r));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Optional.of(asts);
|
return Optional.of(asts);
|
||||||
|
|
@ -393,10 +399,17 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
|
||||||
searchResult.getCompany().getId());
|
searchResult.getCompany().getId());
|
||||||
asts = createRegistryIfNeeded.apply(new StmtCmpAcc(stmt, searchResult.getCompany(), searchResult.getAccount()));
|
asts = createRegistryIfNeeded.apply(new StmtCmpAcc(stmt, searchResult.getCompany(), searchResult.getAccount()));
|
||||||
if (OperationStatus.Executed.equalsByKey(stmt.getOperationStatus())) {
|
if (OperationStatus.Executed.equalsByKey(stmt.getOperationStatus())) {
|
||||||
dmiService.setOk(searchResult.getTcr().getId(),
|
Optional<BigDecimal> dmiBalance = dmiService.setOk(searchResult.getTcr().getId(),
|
||||||
CurrencyCode.RUB.getKey(),
|
CurrencyCode.RUB.getKey(),
|
||||||
sdf57.getDbfId().toString());
|
sdf57.getDbfId().toString());
|
||||||
asts.ifPresent(trio -> assets.process(trio.a__b(), trio.a__t(), trio.a__f(), BigDecimal.ZERO));
|
asts.ifPresent(trio -> {
|
||||||
|
if (dmiBalance.isPresent() && sessionIsPresent) {
|
||||||
|
BigDecimal planBalance = safeBD(trio.a__t().getPlanBalance());
|
||||||
|
trio.a__t().setPlanBalance(planBalance.add(dmiBalance.get()));
|
||||||
|
registryImdg.update(trio.a__t());
|
||||||
|
}
|
||||||
|
assets.process(trio.a__b(), trio.a__t(), trio.a__f(), BigDecimal.ZERO);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
} else if (InOutDirection.in.equals(IEnumKey.getEnumByKey(InOutDirection.class, stmt.getInOutDirection()))) {
|
} else if (InOutDirection.in.equals(IEnumKey.getEnumByKey(InOutDirection.class, stmt.getInOutDirection()))) {
|
||||||
log.debug("stmt.id={} comment='{}' error: {}. Operating through DMAU registry",
|
log.debug("stmt.id={} comment='{}' error: {}. Operating through DMAU registry",
|
||||||
|
|
@ -430,10 +443,17 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
|
||||||
}
|
}
|
||||||
} else if (OperationStatus.Executed.equalsByKey(stmt.getOperationStatus())) {
|
} else if (OperationStatus.Executed.equalsByKey(stmt.getOperationStatus())) {
|
||||||
if (asts.isPresent()) {
|
if (asts.isPresent()) {
|
||||||
dmiService.setOk(asts.get().a__t().getTradingClearingRegistryId(),
|
Optional<BigDecimal> dmiBalance = dmiService.setOk(asts.get().a__t().getTradingClearingRegistryId(),
|
||||||
CurrencyCode.RUB.getKey(),
|
CurrencyCode.RUB.getKey(),
|
||||||
sdf57.getDbfId().toString());
|
sdf57.getDbfId().toString());
|
||||||
asts.ifPresent(trio -> assets.process(trio.a__b(), trio.a__t(), trio.a__f(), BigDecimal.ZERO));
|
asts.ifPresent(trio -> {
|
||||||
|
if (dmiBalance.isPresent() && sessionIsPresent) {
|
||||||
|
BigDecimal planBalance = safeBD(trio.a__t().getPlanBalance());
|
||||||
|
trio.a__t().setPlanBalance(planBalance.add(dmiBalance.get()));
|
||||||
|
registryImdg.update(trio.a__t());
|
||||||
|
}
|
||||||
|
assets.process(trio.a__b(), trio.a__t(), trio.a__f(), BigDecimal.ZERO);
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
log.error("stmt.id={} operationStatus={} but couldn't extract TCR.id for DM*I update",
|
log.error("stmt.id={} operationStatus={} but couldn't extract TCR.id for DM*I update",
|
||||||
stmt.getId(),
|
stmt.getId(),
|
||||||
|
|
@ -734,25 +754,56 @@ public class Sdf57Executor extends AbstractExecutor<SDf57> {
|
||||||
R apply(T1 arg1, T2 arg2, T3 arg3);
|
R apply(T1 arg1, T2 arg2, T3 arg3);
|
||||||
}
|
}
|
||||||
|
|
||||||
private AssetOperationListRequest gatewayRequest(Statement stmt, String tradingCode, String tcrCode) {
|
private static final Pattern csBlkd = Pattern.compile(SpecifFlag.CS_BLKD.getKey() + "_(\\d+).*");
|
||||||
|
|
||||||
|
private Optional<AssetOperationListRequest> gatewayRequest(Statement stmt, Company company, Account account, String tcrCode) {
|
||||||
|
if (AccountType.Anlt.equalsByKey(account.getAccountType())) {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
String tradingCode = company.getTradingCode();
|
||||||
AssetOperationListRequest gatewayRequest = new AssetOperationListRequest();
|
AssetOperationListRequest gatewayRequest = new AssetOperationListRequest();
|
||||||
AssetOperationRequest req = GatewayRequestCreator.from(stmt, tradingCode, tcrCode);
|
AssetOperationRequest req = GatewayRequestCreator.from(stmt, tradingCode, tcrCode);
|
||||||
Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of(
|
String specif = stmt.getComment();
|
||||||
"workflowStatus", SessionStatus.ACTV.getKey()
|
|
||||||
));
|
Matcher m;
|
||||||
if (existActiveSession != null) {
|
if (!TextUtil.isEmpty(specif) && (m = csBlkd.matcher(specif)).find()) {
|
||||||
log.debug("active session.id={} type {}", existActiveSession.getId(), existActiveSession.getSessionType());
|
try {
|
||||||
List<Registry> d__vs = assets.searchByParams(stmt.getAccount(), CurrencyCode.RUB.getKey(), stmt.getSenderId(), D__V)
|
Long sessionId = Long.valueOf(m.group(1));
|
||||||
.stream()
|
List<Registry> d__vs = assets.searchByParams(account.getAccount(), CurrencyCode.RUB.getKey(), company.getId(), D__V)
|
||||||
.filter(rgs -> existActiveSession.getId().equals(rgs.getSessionId()))
|
.stream()
|
||||||
.toList();
|
.filter(rgs -> sessionId.equals(rgs.getSessionId()))
|
||||||
BigDecimal d__vSum = d__vs.stream()
|
.toList();
|
||||||
.map(rgs -> safeBD(rgs.getBalance()))
|
BigDecimal d__vSum = d__vs.stream()
|
||||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
.map(rgs -> safeBD(rgs.getBalance()))
|
||||||
BigDecimal amount = req.getAmount();
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
req.setAmount(safeBD(amount).subtract(d__vSum));
|
BigDecimal amount = req.getAmount();
|
||||||
|
req.setAmount(safeBD(amount).subtract(d__vSum));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
log.error("stmt.id={} failed to parse specif {} {}",
|
||||||
|
stmt.getId(),
|
||||||
|
specif,
|
||||||
|
ExceptionUtils.getStackTrace(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of(
|
||||||
|
// "workflowStatus", SessionStatus.ACTV.getKey()
|
||||||
|
//));
|
||||||
|
//if (existActiveSession != null) {
|
||||||
|
// log.debug("active session.id={} type {}", existActiveSession.getId(), existActiveSession.getSessionType());
|
||||||
|
// List<Registry> d__vs = assets.searchByParams(stmt.getAccount(), CurrencyCode.RUB.getKey(), stmt.getSenderId(), D__V)
|
||||||
|
// .stream()
|
||||||
|
// .filter(rgs -> existActiveSession.getId().equals(rgs.getSessionId()))
|
||||||
|
// .toList();
|
||||||
|
// BigDecimal d__vSum = d__vs.stream()
|
||||||
|
// .map(rgs -> safeBD(rgs.getBalance()))
|
||||||
|
// .reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
// BigDecimal amount = req.getAmount();
|
||||||
|
// req.setAmount(safeBD(amount).subtract(d__vSum));
|
||||||
|
//}
|
||||||
|
if (req.getAmount().compareTo(BigDecimal.ZERO) == 0) {
|
||||||
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
gatewayRequest.setAssetOperationRequests(List.of(req));
|
gatewayRequest.setAssetOperationRequests(List.of(req));
|
||||||
return gatewayRequest;
|
return Optional.of(gatewayRequest);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -125,12 +125,13 @@ public class PaymentInstructionOutboundService {
|
||||||
log.debug("all checks passed, accCred.id={}, accDeb.id={}, addressee.id={}, sender.id={}, amount: {}",
|
log.debug("all checks passed, accCred.id={}, accDeb.id={}, addressee.id={}, sender.id={}, amount: {}",
|
||||||
accCred.getId(), accDeb.getId(), addressee.getId(), sender.getId(), amount);
|
accCred.getId(), accDeb.getId(), addressee.getId(), sender.getId(), amount);
|
||||||
|
|
||||||
String purpose = tcr != null ? "Вывод средств по ТКР " + tcr.getCode() + " ." : "Вывод средств.";
|
String purpose = tcr != null ? "Возврат денежных средств, свободных от обязательств с ТКР " + tcr.getCode() + " ." : "Вывод средств.";
|
||||||
if (payload.getPaymentPurpose() != null) {
|
if (payload.getPaymentPurpose() != null) {
|
||||||
purpose += " " + payload.getPaymentPurpose();
|
String reqPmtPrpse = payload.getPaymentPurpose();
|
||||||
if (!(purpose.endsWith(".") || purpose.endsWith("!") || purpose.endsWith("?") || purpose.endsWith(";"))) {
|
if (!(reqPmtPrpse.endsWith(".") || reqPmtPrpse.endsWith("!") || reqPmtPrpse.endsWith("?") || reqPmtPrpse.endsWith(";"))) {
|
||||||
purpose += ".";
|
reqPmtPrpse += ".";
|
||||||
}
|
}
|
||||||
|
purpose = reqPmtPrpse + " " + purpose;
|
||||||
}
|
}
|
||||||
PaymentInstruction pmt = PaymentInstructionBuilderV2.builder(imdgProvider)
|
PaymentInstruction pmt = PaymentInstructionBuilderV2.builder(imdgProvider)
|
||||||
.registry(new Registry())
|
.registry(new Registry())
|
||||||
|
|
|
||||||
|
|
@ -45,34 +45,62 @@ public class AssetTBFProcessing {
|
||||||
this.rgsMng = new RegistryManager(rgsImdg);
|
this.rgsMng = new RegistryManager(rgsImdg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//если нет B ссчитаем что он 0
|
||||||
|
//если нет F надо его создать...
|
||||||
|
//если нет T журнал WARN и ничего не делаем
|
||||||
|
public Registry copy(Registry a__t, RegistryUnit rgsUnit) {
|
||||||
|
Registry a___ = a__t.clone();
|
||||||
|
a___.setRegistryUnit(rgsUnit.getKey());
|
||||||
|
a___.setRegistryCode(RegistryUtil.clearingCode(a___));
|
||||||
|
RegistryManager.zeroState(a___);
|
||||||
|
return a___;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* пересчитывает A**F = A**T - A**B + D**I - D**V
|
||||||
|
* учитываются только D**I с отрицательным balance.
|
||||||
|
* @param am_b регистр блокированных средств
|
||||||
|
* @param am_t регистр средств под торги
|
||||||
|
* @param am_f регистр свободных средств
|
||||||
|
* @param sum отнимается от блокировки.
|
||||||
|
*/
|
||||||
public void process(Registry am_b, Registry am_t, Registry am_f, BigDecimal sum) {
|
public void process(Registry am_b, Registry am_t, Registry am_f, BigDecimal sum) {
|
||||||
|
boolean am_bExists = am_b != null;
|
||||||
|
if (!am_bExists) {
|
||||||
|
am_b = new Registry();
|
||||||
|
}
|
||||||
safeWrapField(am_t::getBalance, am_t::setBalance);
|
safeWrapField(am_t::getBalance, am_t::setBalance);
|
||||||
safeWrapField(am_b::getBalance, am_b::setBalance);
|
safeWrapField(am_b::getBalance, am_b::setBalance);
|
||||||
safeWrapField(am_f::getBalance, am_f::setBalance);
|
safeWrapField(am_f::getBalance, am_f::setBalance);
|
||||||
Collection<Registry> d__is = searchByParams(am_b.getAccount(),
|
Collection<Registry> d__is = searchByParams(am_t.getAccount(),
|
||||||
am_b.getSecuritySymbol(),
|
am_t.getSecuritySymbol(),
|
||||||
am_b.getCompanyId(),
|
am_t.getCompanyId(),
|
||||||
D__I.type(am_b.getRegistryInstrumentType()));
|
D__I.type(am_t.getRegistryInstrumentType()));
|
||||||
BigDecimal d__iSum = d__is.stream()
|
BigDecimal d__iSum = d__is.stream()
|
||||||
.filter(d__i -> safeBD(d__i.getBalance()).compareTo(BigDecimal.ZERO) < 0)
|
.filter(d__i -> safeBD(d__i.getBalance()).compareTo(BigDecimal.ZERO) < 0)
|
||||||
.map(rgs -> safeBD(rgs.getBalance()))
|
.map(rgs -> safeBD(rgs.getBalance()))
|
||||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
Collection<Registry> d__vs = searchByParams(am_b.getAccount(),
|
Collection<Registry> d__vs = searchByParams(am_t.getAccount(),
|
||||||
am_b.getSecuritySymbol(),
|
am_t.getSecuritySymbol(),
|
||||||
am_b.getCompanyId(),
|
am_t.getCompanyId(),
|
||||||
D__V.type(am_b.getRegistryInstrumentType()));
|
D__V.type(am_t.getRegistryInstrumentType()));
|
||||||
BigDecimal d__vSum = d__vs.stream()
|
BigDecimal d__vSum = d__vs.stream()
|
||||||
.map(rgs -> safeBD(rgs.getBalance()))
|
.map(rgs -> safeBD(rgs.getBalance()))
|
||||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
Instant now = Instant.now();
|
Instant now = Instant.now();
|
||||||
BigDecimal am_fBalanceForLoging = am_f.getBalance();
|
BigDecimal am_fBalanceForLoging = am_f.getBalance();
|
||||||
BigDecimal am_bBalanceForLoging = am_b.getBalance();
|
BigDecimal am_bBalanceForLoging = am_b.getBalance();
|
||||||
|
if (!am_bExists && sum != null && sum.compareTo(BigDecimal.ZERO) != 0) {
|
||||||
|
log.error("FATAL: A**F.id={}; A**T.id={} A**B is null, yet #sum={}", am_f.getId(), am_t.getId(), sum);
|
||||||
|
}
|
||||||
am_b.setBalance(am_b.getBalance().subtract(sum));
|
am_b.setBalance(am_b.getBalance().subtract(sum));
|
||||||
am_f.setBalance(am_t.getBalance().subtract(am_b.getBalance()).add(d__iSum).subtract(d__vSum));
|
am_f.setBalance(am_t.getBalance().subtract(am_b.getBalance()).add(d__iSum).subtract(d__vSum));
|
||||||
am_b.setUpdated(now);
|
if (am_bExists) {
|
||||||
|
am_b.setUpdated(now);
|
||||||
|
rgsImdg.update(am_b);
|
||||||
|
}
|
||||||
am_f.setUpdated(now);
|
am_f.setUpdated(now);
|
||||||
|
|
||||||
rgsImdg.update(am_b);
|
|
||||||
rgsImdg.update(am_f);
|
rgsImdg.update(am_f);
|
||||||
log.debug("assets processing [{}#id={}#balance={} | {}#id={}#balance={} | {}#id={}#balance={}] " +
|
log.debug("assets processing [{}#id={}#balance={} | {}#id={}#balance={} | {}#id={}#balance={}] " +
|
||||||
"D**I.size={} D**V.size={}. {}.balance -> {}, {}.balance -> {}",
|
"D**I.size={} D**V.size={}. {}.balance -> {}, {}.balance -> {}",
|
||||||
|
|
@ -134,6 +162,25 @@ public class AssetTBFProcessing {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Optional<AssetTrio> processByA__t(Registry a__t, BigDecimal sum) {
|
||||||
|
Optional<Registry> a__b = rgsMng.findRegByUnit(a__t.getCompanyId(),
|
||||||
|
a__t.getAccountId(),
|
||||||
|
a__t.getContract(),
|
||||||
|
a__t,
|
||||||
|
RegistryUnit.B);
|
||||||
|
Optional<Registry> a__f = rgsMng.findRegByUnit(a__t.getCompanyId(),
|
||||||
|
a__t.getAccountId(),
|
||||||
|
a__t.getContract(),
|
||||||
|
a__t,
|
||||||
|
RegistryUnit.F);
|
||||||
|
if (a__b.isPresent() && a__f.isPresent()) {
|
||||||
|
process(a__b.get(), a__t, a__f.get(), sum);
|
||||||
|
return Optional.of(new AssetTrio(a__t, a__b.get(), a__f.get()));
|
||||||
|
} else {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public AssetTrio createSAssets(Account acc,
|
public AssetTrio createSAssets(Account acc,
|
||||||
String securitySymbol,
|
String securitySymbol,
|
||||||
Long securityId,
|
Long securityId,
|
||||||
|
|
@ -162,15 +209,10 @@ public class AssetTBFProcessing {
|
||||||
ast.setTradingClearingRegistry(tcr);
|
ast.setTradingClearingRegistry(tcr);
|
||||||
ast.setRegistryStatus(RegistryStatus.OK.getKey());
|
ast.setRegistryStatus(RegistryStatus.OK.getKey());
|
||||||
ast.setBalanceDimension(BalanceDimension.PICS.getKey());
|
ast.setBalanceDimension(BalanceDimension.PICS.getKey());
|
||||||
|
ast.setOpenBalance(BigDecimal.ZERO);
|
||||||
RegistryManager.zeroState(ast);
|
RegistryManager.zeroState(ast);
|
||||||
Registry asf = ast.clone();
|
Registry asf = copy(ast, RegistryUnit.F);
|
||||||
asf.setRegistryUnit(RegistryUnit.F.getKey());
|
Registry asb = copy(ast, RegistryUnit.B);
|
||||||
asf.setRegistryCode(RegistryUtil.clearingCode(asf));
|
|
||||||
RegistryManager.zeroState(asf);
|
|
||||||
Registry asb = ast.clone();
|
|
||||||
asb.setRegistryUnit(RegistryUnit.B.getKey());
|
|
||||||
asb.setRegistryCode(RegistryUtil.clearingCode(asb));
|
|
||||||
RegistryManager.zeroState(asb);
|
|
||||||
return new AssetTrio(asf, asb, ast);
|
return new AssetTrio(asf, asb, ast);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -202,6 +244,7 @@ public class AssetTBFProcessing {
|
||||||
ast.setTradingClearingRegistry(tcr);
|
ast.setTradingClearingRegistry(tcr);
|
||||||
ast.setRegistryStatus(RegistryStatus.OK.getKey());
|
ast.setRegistryStatus(RegistryStatus.OK.getKey());
|
||||||
ast.setBalanceDimension(BalanceDimension.MONY.getKey());
|
ast.setBalanceDimension(BalanceDimension.MONY.getKey());
|
||||||
|
ast.setOpenBalance(BigDecimal.ZERO);
|
||||||
RegistryManager.zeroState(ast);
|
RegistryManager.zeroState(ast);
|
||||||
Registry asf = ast.clone();
|
Registry asf = ast.clone();
|
||||||
asf.setRegistryUnit(RegistryUnit.F.getKey());
|
asf.setRegistryUnit(RegistryUnit.F.getKey());
|
||||||
|
|
@ -244,6 +287,23 @@ public class AssetTBFProcessing {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Optional<AssetTrio> searchSecurityByAccAndCompany(Long companyId, Long accountId, String securitySymbol) {
|
||||||
|
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder();
|
||||||
|
Function<RegistryTradingParams, ImdgPredicate> prdct = rgsCode -> pb.and(
|
||||||
|
pb.sql(RegistryCodeSqlBuilder.getInstance(rgsCode).build()),
|
||||||
|
pb.equals("companyId", companyId),
|
||||||
|
pb.equals("accountId", accountId),
|
||||||
|
pb.equals("securitySymbol", securitySymbol)
|
||||||
|
);
|
||||||
|
Registry amf = rgsImdg.getFirstObjectByPredicate(prdct.apply(AS_F));
|
||||||
|
Registry amb = rgsImdg.getFirstObjectByPredicate(prdct.apply(AS_B));
|
||||||
|
Registry amt = rgsImdg.getFirstObjectByPredicate(prdct.apply(AS_T));
|
||||||
|
if (amf != null && amb != null && amt != null) {
|
||||||
|
return Optional.of(new AssetTrio(amf, amb, amt));
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
public boolean insufficientBalance(Registry registry, BigDecimal amount) {
|
public boolean insufficientBalance(Registry registry, BigDecimal amount) {
|
||||||
return safeBD(registry.getBalance()).compareTo(safeBD(amount)) < 0;
|
return safeBD(registry.getBalance()).compareTo(safeBD(amount)) < 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,17 +4,18 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import ru.clearing.classes.statics.data.registry.Registry;
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
|
import ru.clearing.classes.statics.data.sdf.SDf57;
|
||||||
|
import ru.clearing.classes.statics.data.statement.Statement;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.session.stage.util.RegistryUtil;
|
import ru.spcex.clearing.session.stage.util.RegistryUtil;
|
||||||
import ru.spcex.platform.enumeration.RegistryDesignation;
|
import ru.spcex.platform.enumeration.*;
|
||||||
import ru.spcex.platform.enumeration.RegistryStatus;
|
|
||||||
import ru.spcex.platform.enumeration.RegistryTradingParams;
|
|
||||||
import ru.spcex.platform.enumeration.RegistryUnit;
|
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||||
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
||||||
|
import ru.spcex.platform.utils.log.ExceptionUtils;
|
||||||
|
import ru.spcex.platform.utils.number.BigDecimalUtil;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
|
@ -24,10 +25,14 @@ import java.util.Optional;
|
||||||
public class DmiService {
|
public class DmiService {
|
||||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
private final Imdg<Registry> rgsImdg;
|
private final Imdg<Registry> rgsImdg;
|
||||||
|
private final Imdg<SDf57> sDf57Imdg;
|
||||||
|
private final Imdg<Statement> statementImdg;
|
||||||
private final RegistryManager rgsMng;
|
private final RegistryManager rgsMng;
|
||||||
|
|
||||||
public DmiService(ImdgProvider imdgProvider, RegistryManager rgsMng) {
|
public DmiService(ImdgProvider imdgProvider, RegistryManager rgsMng) {
|
||||||
this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||||
|
this.sDf57Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf57, SDf57.class);
|
||||||
|
this.statementImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Statement, Statement.class);
|
||||||
this.rgsMng = rgsMng;
|
this.rgsMng = rgsMng;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -86,6 +91,33 @@ public class DmiService {
|
||||||
findDmiByComment(tcrId, securitySymbol, comment).ifPresentOrElse(d__i -> {
|
findDmiByComment(tcrId, securitySymbol, comment).ifPresentOrElse(d__i -> {
|
||||||
d__i.setContract(contract);
|
d__i.setContract(contract);
|
||||||
d__i.setUpdated(Instant.now());
|
d__i.setUpdated(Instant.now());
|
||||||
|
try {
|
||||||
|
Long dbfId = Long.valueOf(contract);
|
||||||
|
SDf57 sdf57 = sDf57Imdg.getFirstObjectBySQL("dbfId=%d".formatted(dbfId));
|
||||||
|
if (sdf57 != null) {
|
||||||
|
ImdgPredicateBuilder pb = statementImdg.predicateBuilder();
|
||||||
|
ImdgPredicate stmtPrdct = pb.and(
|
||||||
|
pb.equals("inSDfId", sdf57.getId()),
|
||||||
|
pb.equals("inOutSDfType", InOutSDfType.type57.getKey())
|
||||||
|
);
|
||||||
|
Statement stmt = statementImdg.getFirstObjectByPredicate(stmtPrdct);
|
||||||
|
if (stmt != null && OperationStatus.Executed.equalsByKey(stmt.getOperationStatus())) {
|
||||||
|
d__i.setRegistryStatus(RegistryStatus.OK.getKey());
|
||||||
|
} else {
|
||||||
|
log.warn("tcrId={} securitySymbol={} comment={} sdf57 dbfId={} found, stmt.id={} status {}. d**i status will not be updated",
|
||||||
|
tcrId,
|
||||||
|
securitySymbol,
|
||||||
|
comment,
|
||||||
|
dbfId,
|
||||||
|
stmt != null ? stmt.getId() : null,
|
||||||
|
stmt != null ? stmt.getOperationStatus() : null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Throwable e) {
|
||||||
|
log.error("sdf57 search by {}: error {}",
|
||||||
|
contract,
|
||||||
|
ExceptionUtils.getStackTrace(e));
|
||||||
|
}
|
||||||
rgsImdg.update(d__i);
|
rgsImdg.update(d__i);
|
||||||
log.trace("set {}.id={} contract {}", d__i.getRegistryCode(), d__i.getId(), contract);
|
log.trace("set {}.id={} contract {}", d__i.getRegistryCode(), d__i.getId(), contract);
|
||||||
}, () -> log.trace("didn't find DM*I by tcr.id={} securitySymbol={} comment={}",
|
}, () -> log.trace("didn't find DM*I by tcr.id={} securitySymbol={} comment={}",
|
||||||
|
|
@ -97,18 +129,21 @@ public class DmiService {
|
||||||
* ищем D**I по tcrId/security/contract
|
* ищем D**I по tcrId/security/contract
|
||||||
* задаем статус ОК
|
* задаем статус ОК
|
||||||
*/
|
*/
|
||||||
public void setOk(Long tcrId,
|
public Optional<BigDecimal> setOk(Long tcrId,
|
||||||
String securitySymbol,
|
String securitySymbol,
|
||||||
String contract) {
|
String contract) {
|
||||||
|
BigDecimal[] dmiBalance = {null};
|
||||||
findDmiByContract(tcrId, securitySymbol, contract).ifPresentOrElse(d__i -> {
|
findDmiByContract(tcrId, securitySymbol, contract).ifPresentOrElse(d__i -> {
|
||||||
d__i.setRegistryStatus(RegistryStatus.OK.getKey());
|
d__i.setRegistryStatus(RegistryStatus.OK.getKey());
|
||||||
d__i.setUpdated(Instant.now());
|
d__i.setUpdated(Instant.now());
|
||||||
log.trace("updating {} status to {}", d__i.getRegistryCode(), d__i.getRegistryStatus());
|
log.trace("updating {} status to {}", d__i.getRegistryCode(), d__i.getRegistryStatus());
|
||||||
rgsImdg.update(d__i);
|
rgsImdg.update(d__i);
|
||||||
|
dmiBalance[0] = BigDecimalUtil.safeBD(d__i.getBalance());
|
||||||
}, () -> {
|
}, () -> {
|
||||||
log.trace("didn't find DM*I by tcr.id={} securitySymbol={} contract={}",
|
log.trace("didn't find DM*I by tcr.id={} securitySymbol={} contract={}",
|
||||||
tcrId, securitySymbol, contract);
|
tcrId, securitySymbol, contract);
|
||||||
});
|
});
|
||||||
|
return Optional.ofNullable(dmiBalance[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Optional<Registry> findDmiByContract(Long tcrId, String securitySymbol, String contract) {
|
private Optional<Registry> findDmiByContract(Long tcrId, String securitySymbol, String contract) {
|
||||||
|
|
@ -156,15 +191,14 @@ public class DmiService {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
Registry rgsD = am_t.clone();
|
Registry rgsD = am_t.clone();
|
||||||
|
RegistryManager.zeroState(rgsD);
|
||||||
|
rgsD.setOpenBalance(BigDecimal.ZERO);
|
||||||
|
rgsD.setCloseBalance(BigDecimal.ZERO);
|
||||||
rgsD.setRegistryDesignation(RegistryDesignation.D.getKey());
|
rgsD.setRegistryDesignation(RegistryDesignation.D.getKey());
|
||||||
rgsD.setRegistryUnit(RegistryUnit.I.getKey());
|
rgsD.setRegistryUnit(RegistryUnit.I.getKey());
|
||||||
rgsD.setRegistryCode(RegistryUtil.clearingCode(rgsD));
|
rgsD.setRegistryCode(RegistryUtil.clearingCode(rgsD));
|
||||||
rgsD.setBalance(summ);
|
rgsD.setBalance(summ);
|
||||||
|
|
||||||
rgsD.setDebit(BigDecimal.ZERO);
|
|
||||||
rgsD.setCredit(BigDecimal.ZERO);
|
|
||||||
rgsD.setDiffBalance(BigDecimal.ZERO);
|
|
||||||
rgsD.setCheckBalance(BigDecimal.ZERO);
|
|
||||||
rgsD.setRegistryStatus(RegistryStatus.PROC.getKey());
|
rgsD.setRegistryStatus(RegistryStatus.PROC.getKey());
|
||||||
return Optional.of(rgsD);
|
return Optional.of(rgsD);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ public class PaymentStateMarkService {
|
||||||
.stream()
|
.stream()
|
||||||
.filter(rgs -> rgs.getValueDate() != null)
|
.filter(rgs -> rgs.getValueDate() != null)
|
||||||
.filter(rgs -> rgs.getSettlementDate() != null)
|
.filter(rgs -> rgs.getSettlementDate() != null)
|
||||||
.filter(rgs -> rgs.getSettlementDate().isAfter(rgs.getValueDate()))
|
.filter(rgs -> rgs.getSettlementDate().equals(rgs.getValueDate()))
|
||||||
.collect(Collectors.groupingBy(Registry::getGroupId));
|
.collect(Collectors.groupingBy(Registry::getGroupId));
|
||||||
log.debug("found {} ({} groups) CM*T/LM*T by {}", claimsAndLiabilities.size(), groups.size(), prdct.toString());
|
log.debug("found {} ({} groups) CM*T/LM*T by {}", claimsAndLiabilities.size(), groups.size(), prdct.toString());
|
||||||
for (Map.Entry<Long, List<Registry>> group : groups.entrySet()) {
|
for (Map.Entry<Long, List<Registry>> group : groups.entrySet()) {
|
||||||
|
|
|
||||||
|
|
@ -38,11 +38,17 @@ public class RegistryManager {
|
||||||
|
|
||||||
public Optional<Registry> searchDmxByCounterParty(Registry rgs) {
|
public Optional<Registry> searchDmxByCounterParty(Registry rgs) {
|
||||||
if (TextUtil.isEmpty(rgs.getContract())) return Optional.empty();
|
if (TextUtil.isEmpty(rgs.getContract())) return Optional.empty();
|
||||||
String sqlCondition = String.format("(%s) and companyId = %d and contract = '%s'",
|
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder();
|
||||||
RegistryCodeSqlBuilder.getInstance(DM_X).build(),
|
ImdgPredicate prdct = pb.and(
|
||||||
rgs.getCounterPartyId(),
|
pb.sql(RegistryCodeSqlBuilder.getInstance(DM_X).build()),
|
||||||
rgs.getContract());
|
pb.equals("companyId", rgs.getCounterPartyId()),
|
||||||
Registry dmx = rgsImdg.getFirstObjectBySQL(sqlCondition);
|
pb.equals("contract", rgs.getContract()),
|
||||||
|
pb.or(
|
||||||
|
pb.equals("registryStatus", RegistryStatus.PROC.getKey()),
|
||||||
|
pb.equals("registryStatus", RegistryStatus.MNG.getKey())
|
||||||
|
)
|
||||||
|
);
|
||||||
|
Registry dmx = rgsImdg.getFirstObjectByPredicate(prdct);
|
||||||
return Optional.ofNullable(dmx);
|
return Optional.ofNullable(dmx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,7 @@ public enum Sdf06NewValidationRule implements IValidationRule<ImdgValidationCont
|
||||||
prdctBldr.and(
|
prdctBldr.and(
|
||||||
prdctByRegistryCode.apply(RegistryTradingParams.DM_T),
|
prdctByRegistryCode.apply(RegistryTradingParams.DM_T),
|
||||||
prdctBldr.or(
|
prdctBldr.or(
|
||||||
prdctBldr.equals("registryStatus", RegistryStatus.OK.getKey()),
|
prdctBldr.equals("registryStatus", RegistryStatus.PROC.getKey()),
|
||||||
prdctBldr.equals("registryStatus", RegistryStatus.MNG.getKey())
|
prdctBldr.equals("registryStatus", RegistryStatus.MNG.getKey())
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,7 @@ import ru.spcex.clearing.error.ClearingError;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.service.AssetTrio;
|
import ru.spcex.clearing.service.AssetTrio;
|
||||||
import ru.spcex.clearing.service.registry.RegistryManager;
|
import ru.spcex.clearing.service.registry.RegistryManager;
|
||||||
import ru.spcex.platform.enumeration.AccountType;
|
import ru.spcex.platform.enumeration.*;
|
||||||
import ru.spcex.platform.enumeration.NoRef;
|
|
||||||
import ru.spcex.platform.enumeration.OperationCode;
|
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||||
|
|
@ -67,6 +65,12 @@ public enum Sdf20ValidationRule implements IValidationRule<ImdgValidationContext
|
||||||
if (acc == null) {
|
if (acc == null) {
|
||||||
return of(ClearingError.AccountNotFoundB, depoCodeCl);
|
return of(ClearingError.AccountNotFoundB, depoCodeCl);
|
||||||
}
|
}
|
||||||
|
ServiceStatus status = IEnumKey.getEnumByKey(ServiceStatus.class, acc.getStatus());
|
||||||
|
if (!ServiceStatus.Active.equals(status)
|
||||||
|
&& !ServiceStatus.Reopened.equals(status)
|
||||||
|
&& !ServiceStatus.Appl.equals(status)) {
|
||||||
|
return of(ClearingError.AccountNotActive, acc.getId());
|
||||||
|
}
|
||||||
context.storeObject(ValidationStored.Sdf20Account, acc);
|
context.storeObject(ValidationStored.Sdf20Account, acc);
|
||||||
return empty();
|
return empty();
|
||||||
}
|
}
|
||||||
|
|
@ -86,6 +90,9 @@ public enum Sdf20ValidationRule implements IValidationRule<ImdgValidationContext
|
||||||
if (company == null) {
|
if (company == null) {
|
||||||
return of(ClearingError.CompanyNotFoundB, acc.getCompanyId());
|
return of(ClearingError.CompanyNotFoundB, acc.getCompanyId());
|
||||||
}
|
}
|
||||||
|
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) {
|
||||||
|
return of(ClearingError.CompanyNotActive, company.getId());
|
||||||
|
}
|
||||||
context.storeObject(ValidationStored.Sdf20Company, company);
|
context.storeObject(ValidationStored.Sdf20Company, company);
|
||||||
return empty();
|
return empty();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
package ru.spcex.clearing.service.validation;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import ru.clearing.classes.statics.data.misc.Session;
|
||||||
|
import ru.spcex.clearing.error.ClearingError;
|
||||||
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.spcex.clearing.session.stage.TaskType;
|
||||||
|
import ru.spcex.platform.enumeration.SessionStatus;
|
||||||
|
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.enumeration.IEnumKey;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidationRule;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public enum SessionTerminationValidationRule implements IValidationRule<ImdgValidationContext<Session>> {
|
||||||
|
SessionPresent() {
|
||||||
|
@Override
|
||||||
|
public Optional<EnumMessage> validate(ImdgValidationContext<Session> context) {
|
||||||
|
Imdg<Session> sessionImdg = context.obtainMap(IMDGDistributedNames.Map_Session, Session.class);
|
||||||
|
Session session = sessionImdg.getFirstObjectByFieldValues(Map.of(
|
||||||
|
"workflowStatus", SessionStatus.ACTV.getKey()
|
||||||
|
));
|
||||||
|
if (session == null) {
|
||||||
|
log.warn("Cannot stop session, failed to find workflowStatus 'ACTV'");
|
||||||
|
return of(ClearingError.RecordNotFound, "с активной клиринговой сессией для обнуления");
|
||||||
|
}
|
||||||
|
context.storeObject(ValidationStored.SessionTerminate, session);
|
||||||
|
context.setValidatedObject(session);
|
||||||
|
return empty();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
StatusCheck() {
|
||||||
|
@Override
|
||||||
|
public Optional<EnumMessage> validate(ImdgValidationContext<Session> context) {
|
||||||
|
Session session = context.getStoredObject(ValidationStored.SessionTerminate);
|
||||||
|
TaskType status = IEnumKey.getEnumByKey(TaskType.class, session.getSessionStatus());
|
||||||
|
if (status == null || status.ordinal() >= TaskType.FormingPaymentInstruction.ordinal()) {
|
||||||
|
log.warn("Cannot stop session.id={}, unknown sessionStatus '{}'",
|
||||||
|
session.getId(), session.getSessionStatus());
|
||||||
|
return of(ClearingError.IncorrectValue, "статуса для обнуления клиринговой сессии");
|
||||||
|
}
|
||||||
|
return empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
;
|
||||||
|
private final static Logger log = LoggerFactory.getLogger(SessionTerminationValidationRule.class);
|
||||||
|
@Override
|
||||||
|
public String ruleName() {
|
||||||
|
return "SessionTerminationValidationRule." + name();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -63,7 +63,7 @@ public enum StatusExtractValidationRule implements IValidationRule<ImdgValidatio
|
||||||
return empty();
|
return empty();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
RegistryStatusValid() {
|
RequestStatusValid() {
|
||||||
@Override
|
@Override
|
||||||
public Optional<EnumMessage> validate(ImdgValidationContext<RegistryChangeStatusExtractRequest> context) {
|
public Optional<EnumMessage> validate(ImdgValidationContext<RegistryChangeStatusExtractRequest> context) {
|
||||||
RegistryChangeStatusExtractRequest validatedObject = context.getValidatedObject();
|
RegistryChangeStatusExtractRequest validatedObject = context.getValidatedObject();
|
||||||
|
|
@ -76,6 +76,17 @@ public enum StatusExtractValidationRule implements IValidationRule<ImdgValidatio
|
||||||
}
|
}
|
||||||
return empty();
|
return empty();
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
RegistryStatusValid() {
|
||||||
|
@Override
|
||||||
|
public Optional<EnumMessage> validate(ImdgValidationContext<RegistryChangeStatusExtractRequest> context) {
|
||||||
|
Registry rgs = context.getStoredObject(Stored.PresentById);
|
||||||
|
RegistryStatus status = IEnumKey.getEnumByKey(RegistryStatus.class, rgs.getRegistryStatus());
|
||||||
|
if (RegistryStatus.OK.equals(status)) {
|
||||||
|
return of(ClearingError.ObligationsAlreadyCalculated);
|
||||||
|
}
|
||||||
|
return empty();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
private final static Logger log = LoggerFactory.getLogger(StatusExtractValidationRule.class);
|
private final static Logger log = LoggerFactory.getLogger(StatusExtractValidationRule.class);
|
||||||
|
|
|
||||||
|
|
@ -32,5 +32,7 @@ public enum ValidationStored {
|
||||||
|
|
||||||
SecurityBySecurityCode,
|
SecurityBySecurityCode,
|
||||||
|
|
||||||
|
SessionTerminate,
|
||||||
|
|
||||||
RegistrysByContract, SplitDepositMaxNumber
|
RegistrysByContract, SplitDepositMaxNumber
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -105,6 +105,11 @@ public abstract class AbstractSession {
|
||||||
|
|
||||||
protected void continueRunning(TaskType t) {
|
protected void continueRunning(TaskType t) {
|
||||||
synchronized (this.currStage) {
|
synchronized (this.currStage) {
|
||||||
|
//if (WorkflowStatus.Blocked.equalsByKey(this.currSession.getWorkflowStatus())) {
|
||||||
|
// log.error("cannot run task {}.{}. session.id={} workflowStatus is {}",
|
||||||
|
// t, t.getKey(), this.currSession.getId(), this.currSession.getWorkflowStatus());
|
||||||
|
// throw new StageException();
|
||||||
|
//}
|
||||||
this.currStage.set(t);
|
this.currStage.set(t);
|
||||||
this.currSession.setSessionStatus(t.getKey());
|
this.currSession.setSessionStatus(t.getKey());
|
||||||
this.currSession.setUpdated(Instant.now());
|
this.currSession.setUpdated(Instant.now());
|
||||||
|
|
|
||||||
|
|
@ -112,6 +112,7 @@ public class FinalMkrSession extends AbstractSession implements InitializingBean
|
||||||
inspectionObligations.setSection(section());
|
inspectionObligations.setSection(section());
|
||||||
formingPaymentInstructionDeals.setSection(section());
|
formingPaymentInstructionDeals.setSection(section());
|
||||||
formingPaymentInstructionDeals.setSessionType(sessionType());
|
formingPaymentInstructionDeals.setSessionType(sessionType());
|
||||||
|
finishingSession.setSessionType(sessionType());
|
||||||
imdgProvider.waitAvailable();
|
imdgProvider.waitAvailable();
|
||||||
initSessionIfPresent();
|
initSessionIfPresent();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -106,6 +106,7 @@ public class IntermediateMkrSession extends AbstractSession implements Initializ
|
||||||
inspectionObligations.setSection(section());
|
inspectionObligations.setSection(section());
|
||||||
formingPaymentInstructionDeals.setSection(section());
|
formingPaymentInstructionDeals.setSection(section());
|
||||||
formingPaymentInstructionDeals.setSessionType(sessionType());
|
formingPaymentInstructionDeals.setSessionType(sessionType());
|
||||||
|
finishingSession.setSessionType(sessionType());
|
||||||
imdgProvider.waitAvailable();
|
imdgProvider.waitAvailable();
|
||||||
initSessionIfPresent();
|
initSessionIfPresent();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -98,6 +98,7 @@ public class PrimaryAuctionB0Session extends AbstractSession implements Initiali
|
||||||
inclusionObligations.setSessionType(sessionType());
|
inclusionObligations.setSessionType(sessionType());
|
||||||
inspectionObligations.setSection(section());
|
inspectionObligations.setSection(section());
|
||||||
finishingSession.setSection(section());
|
finishingSession.setSection(section());
|
||||||
|
finishingSession.setSessionType(sessionType());
|
||||||
imdgProvider.waitAvailable();
|
imdgProvider.waitAvailable();
|
||||||
initSessionIfPresent();
|
initSessionIfPresent();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -99,6 +99,7 @@ public class PrimaryAuctionBnSession extends AbstractSession implements Initiali
|
||||||
inclusionObligations.setSessionType(sessionType());
|
inclusionObligations.setSessionType(sessionType());
|
||||||
inspectionObligations.setSection(section());
|
inspectionObligations.setSection(section());
|
||||||
finishingSession.setSection(section());
|
finishingSession.setSection(section());
|
||||||
|
finishingSession.setSessionType(sessionType());
|
||||||
imdgProvider.waitAvailable();
|
imdgProvider.waitAvailable();
|
||||||
initSessionIfPresent();
|
initSessionIfPresent();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -99,6 +99,7 @@ public class PrimaryAuctionT0Session extends AbstractSession implements Initiali
|
||||||
inclusionObligations.setSessionType(sessionType());
|
inclusionObligations.setSessionType(sessionType());
|
||||||
inspectionObligations.setSection(section());
|
inspectionObligations.setSection(section());
|
||||||
finishingSession.setSection(section());
|
finishingSession.setSection(section());
|
||||||
|
finishingSession.setSessionType(sessionType());
|
||||||
imdgProvider.waitAvailable();
|
imdgProvider.waitAvailable();
|
||||||
initSessionIfPresent();
|
initSessionIfPresent();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,7 @@ public class ReturnDepositSession extends AbstractSession implements Initializin
|
||||||
rgsPrctBuilder.less("valueDate", LocalDate.now())
|
rgsPrctBuilder.less("valueDate", LocalDate.now())
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
finishingSession.setSessionType(sessionType());
|
||||||
imdgProvider.waitAvailable();
|
imdgProvider.waitAvailable();
|
||||||
initSessionIfPresent();
|
initSessionIfPresent();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,7 @@ public class SecondaryAuctionT0Session extends AbstractSession implements Initia
|
||||||
inclusionObligations.setSessionType(sessionType());
|
inclusionObligations.setSessionType(sessionType());
|
||||||
inspectionObligations.setSection(section());
|
inspectionObligations.setSection(section());
|
||||||
finishingSession.setSection(section());
|
finishingSession.setSection(section());
|
||||||
|
finishingSession.setSessionType(sessionType());
|
||||||
imdgProvider.waitAvailable();
|
imdgProvider.waitAvailable();
|
||||||
initSessionIfPresent();
|
initSessionIfPresent();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -66,17 +66,7 @@ public class SessionManager {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
BaseRequest<?> baseRequest = new BaseRequest<>();
|
BaseRequest<?> baseRequest = new BaseRequest<>();
|
||||||
AbstractSession session = null;
|
AbstractSession session = sessionByType(sessionType);
|
||||||
switch (sessionType){
|
|
||||||
case IPOB -> session = primaryAuctionBnSession;
|
|
||||||
case IPOT -> session = primaryAuctionT0Session;
|
|
||||||
case IPO0 -> session = primaryAuctionB0Session;
|
|
||||||
case TRDT -> session = secondaryAuctionT0Session;
|
|
||||||
case MEDM -> session = intermediateMkrSession;
|
|
||||||
case FINL -> session = finalMkrSession;
|
|
||||||
case XDEP -> session = returnDepositSession;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (session != null) {
|
if (session != null) {
|
||||||
//checkActive
|
//checkActive
|
||||||
checkAllowSessionStart();
|
checkAllowSessionStart();
|
||||||
|
|
@ -99,4 +89,30 @@ public class SessionManager {
|
||||||
throw new ValidationException(err);
|
throw new ValidationException(err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void endSession(Session session) {
|
||||||
|
SessionType sessionType = IEnumKey.getEnumByKey(SessionType.class, session.getSessionType());
|
||||||
|
String err = "failed to stop session.id=%d: unknown sessionType: %s"
|
||||||
|
.formatted(session.getId(), session.getSessionType());
|
||||||
|
if (sessionType == null) {
|
||||||
|
throw new IllegalStateException(err);
|
||||||
|
}
|
||||||
|
AbstractSession sessionFlow = sessionByType(sessionType);
|
||||||
|
if (sessionFlow == null) throw new IllegalStateException(err);
|
||||||
|
sessionFlow.endSession();
|
||||||
|
}
|
||||||
|
|
||||||
|
private AbstractSession sessionByType(SessionType sessionType) {
|
||||||
|
AbstractSession session = null;
|
||||||
|
switch (sessionType){
|
||||||
|
case IPOB -> session = primaryAuctionBnSession;
|
||||||
|
case IPOT -> session = primaryAuctionT0Session;
|
||||||
|
case IPO0 -> session = primaryAuctionB0Session;
|
||||||
|
case TRDT -> session = secondaryAuctionT0Session;
|
||||||
|
case MEDM -> session = intermediateMkrSession;
|
||||||
|
case FINL -> session = finalMkrSession;
|
||||||
|
case XDEP -> session = returnDepositSession;
|
||||||
|
}
|
||||||
|
return session;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,151 @@
|
||||||
|
package ru.spcex.clearing.session.stage;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
|
||||||
|
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
|
||||||
|
import ru.clearing.classes.statics.data.execution.ExecutionFond;
|
||||||
|
import ru.clearing.classes.statics.data.misc.Session;
|
||||||
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.spcex.clearing.notification.NotificationSender;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
||||||
|
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
|
||||||
|
import ru.spcex.clearing.service.registry.AssetTBFProcessing;
|
||||||
|
import ru.spcex.clearing.service.validation.ValidationStored;
|
||||||
|
import ru.spcex.clearing.util.services.RequestHelper;
|
||||||
|
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
||||||
|
import ru.spcex.platform.enumeration.ObjectType;
|
||||||
|
import ru.spcex.platform.enumeration.Priority;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryTradingParams;
|
||||||
|
import ru.spcex.platform.enumeration.Section;
|
||||||
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||||
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||||
|
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
||||||
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
|
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidator;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class SessionTerminator {
|
||||||
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
private final Imdg<ExecutionDeposit> execDpstImdg;
|
||||||
|
private final Imdg<ExecutionFond> execFondImdg;
|
||||||
|
private final Imdg<Registry> rgsImdg;
|
||||||
|
|
||||||
|
private final NotificationSender notification;
|
||||||
|
private final AssetTBFProcessing assets;
|
||||||
|
private final IMessageResolver msgs;
|
||||||
|
private final RequestHelper reqInfo;
|
||||||
|
private final Supplier<IValidator> validation;
|
||||||
|
private final SessionManager sessionMng;
|
||||||
|
|
||||||
|
|
||||||
|
public SessionTerminator(ImdgProvider imdgProvider,
|
||||||
|
NotificationSender notification,
|
||||||
|
AssetTBFProcessing assets, IMessageResolver msgs,
|
||||||
|
RequestHelper reqInfo,
|
||||||
|
@Qualifier("terminateSessionValidator") Supplier<IValidator> validation, SessionManager sessionMng) {
|
||||||
|
this.notification = notification;
|
||||||
|
this.assets = assets;
|
||||||
|
this.msgs = msgs;
|
||||||
|
this.execDpstImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
|
||||||
|
this.execFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
|
||||||
|
this.rgsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
||||||
|
this.reqInfo = reqInfo;
|
||||||
|
this.validation = validation;
|
||||||
|
this.sessionMng = sessionMng;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RequestInfoUpdate stopCurrentSession(BaseRequest<?> req) {
|
||||||
|
IValidator validator = validation.get();
|
||||||
|
Optional<EnumMessage> err = validator.tillFirstError();
|
||||||
|
if (err.isPresent()) {
|
||||||
|
notification.sendNotification(ObjectType.session, msgs.resolve(err.get()), Priority.HIGH);
|
||||||
|
return reqInfo.error(req.getId(), err.get());
|
||||||
|
}
|
||||||
|
Session session = validator.getStored(ValidationStored.SessionTerminate);
|
||||||
|
rollbackExecutions(session);
|
||||||
|
rollbackAssetBalances(session.getId());
|
||||||
|
deleteLiabilitiesAndClaims(session.getId());
|
||||||
|
sessionMng.endSession(session);
|
||||||
|
return reqInfo.success(session.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void rollbackExecutions(Session session) {
|
||||||
|
Instant now = Instant.now();
|
||||||
|
|
||||||
|
Consumer<Imdg<ExecutionCommon>> nullifier = imdg -> {
|
||||||
|
Collection<ExecutionCommon> execs = imdg.getCollectionObjectsBySQL(
|
||||||
|
"sessionId = " + session.getId()
|
||||||
|
);
|
||||||
|
for (ExecutionCommon exec : execs) {
|
||||||
|
exec.setSessionId(null);
|
||||||
|
exec.setCoverageStatus(null);
|
||||||
|
exec.setUpdated(now);
|
||||||
|
imdg.update(exec);
|
||||||
|
}
|
||||||
|
log.info("updated {} executions with sessionId={}", execs.size(), session.getId());
|
||||||
|
};
|
||||||
|
log.debug("session.id={} section {}", session.getId(), session.getSection());
|
||||||
|
|
||||||
|
if (Section.FOND.equalsByKey(session.getSection())) {
|
||||||
|
nullifier.accept(upcastImdg(execFondImdg));
|
||||||
|
} else if (Section.MKR.equalsByKey(session.getSection())) {
|
||||||
|
nullifier.accept(upcastImdg(execDpstImdg));
|
||||||
|
} else throw new IllegalStateException("unknown section.");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void rollbackAssetBalances(Long sessionId) {
|
||||||
|
Instant now = Instant.now();
|
||||||
|
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder();
|
||||||
|
ImdgPredicate prdct = pb.and(
|
||||||
|
pb.equals("sessionId", sessionId),
|
||||||
|
pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.A__B).build()),
|
||||||
|
pb.not(pb.equals("balance", BigDecimal.ZERO))
|
||||||
|
);
|
||||||
|
|
||||||
|
Collection<Registry> a__bs = rgsImdg.getCollectionObjectsByPredicate(prdct);
|
||||||
|
a__bs.forEach(rgs -> {
|
||||||
|
rgs.setBalance(BigDecimal.ZERO);
|
||||||
|
rgs.setUpdated(now);
|
||||||
|
rgsImdg.update(rgs);
|
||||||
|
assets.processByAm_b(rgs, BigDecimal.ZERO);
|
||||||
|
});
|
||||||
|
log.debug("set ZERO balance for {} A**B by predicate: {}", a__bs.size(), prdct);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void deleteLiabilitiesAndClaims(Long sessionId) {
|
||||||
|
ImdgPredicateBuilder pb = rgsImdg.predicateBuilder();
|
||||||
|
ImdgPredicate prdct = pb.and(
|
||||||
|
pb.equals("sessionId", sessionId),
|
||||||
|
pb.or(
|
||||||
|
pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.C__T).build()),
|
||||||
|
pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.L__T).build()),
|
||||||
|
pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.O__T).build()),
|
||||||
|
pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.T__T).build())
|
||||||
|
)
|
||||||
|
);
|
||||||
|
Collection<Registry> liabilitiesAndClaims = rgsImdg.getCollectionObjectsByPredicate(prdct);
|
||||||
|
liabilitiesAndClaims.forEach(rgsImdg::delete);
|
||||||
|
log.debug("deleted {} liabilities and claims by predicate: {}", liabilitiesAndClaims.size(), prdct);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static <T extends SpcexObjectBase, U extends T> Imdg<T> upcastImdg(Imdg<U> imdg) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Imdg<T> result = (Imdg<T>) imdg;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -28,17 +28,22 @@ import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||||
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
||||||
|
import ru.spcex.platform.utils.collection.Pair;
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||||
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.*;
|
import java.util.Collection;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError;
|
import static ru.spcex.clearing.error.ClearingErrorInternal.SessionGeneralError;
|
||||||
|
import static ru.spcex.platform.utils.enumeration.IEnumKey.getEnumByKey;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
|
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
|
||||||
|
|
@ -55,6 +60,7 @@ public class FinishingSession implements ISessionStage {
|
||||||
private final IMessageResolver msgResolver;
|
private final IMessageResolver msgResolver;
|
||||||
private final Sdf05Sender sdf05Sender;
|
private final Sdf05Sender sdf05Sender;
|
||||||
private final Sdf14Sender sdf14Sender;
|
private final Sdf14Sender sdf14Sender;
|
||||||
|
private SessionType sessionType;
|
||||||
private Section section;
|
private Section section;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
|
|
@ -74,6 +80,9 @@ public class FinishingSession implements ISessionStage {
|
||||||
public void setSection(Section section) {
|
public void setSection(Section section) {
|
||||||
this.section = section;
|
this.section = section;
|
||||||
}
|
}
|
||||||
|
public void setSessionType(SessionType sessionType) {
|
||||||
|
this.sessionType = sessionType;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public StageResult<?> submit(Task<?> task) {
|
public StageResult<?> submit(Task<?> task) {
|
||||||
|
|
@ -106,48 +115,79 @@ public class FinishingSession implements ISessionStage {
|
||||||
log.error("Session id={} not found. Can not update Execution's.", sessionId);
|
log.error("Session id={} not found. Can not update Execution's.", sessionId);
|
||||||
} else {
|
} else {
|
||||||
Collection<Registry> oRegs = findORegistryBySessionId(sessionId);
|
Collection<Registry> oRegs = findORegistryBySessionId(sessionId);
|
||||||
Set<Long> exchangeExecutionIdAllowed = oRegs.stream()
|
Map<Long, RegistryStatus> obligationStatusByGroupId;
|
||||||
.filter(rgs -> RegistryStatus.CLRD.equalsByKey(rgs.getRegistryStatus()))
|
obligationStatusByGroupId = oRegs.stream()
|
||||||
.map(Registry::getGroupId) // Registry::getGroupId == Execution.ExchangeExecutionId, см. RegistryFondBuilder/RegistryDepoBuilder
|
.map(rgs -> new Pair<>(rgs.getGroupId(), getEnumByKey(RegistryStatus.class, rgs.getRegistryStatus())))
|
||||||
.collect(Collectors.toSet());
|
.filter(pair -> pair.getSecond() != null)
|
||||||
|
.collect(Collectors.toMap(Pair::getFirst, Pair::getSecond, (o1, o2) -> o1));
|
||||||
|
Function<Long, CoverageStatus> statusByExchangeId = id-> {
|
||||||
|
RegistryStatus obligationStatus = obligationStatusByGroupId.get(id);
|
||||||
|
if (obligationStatus == null) return null;
|
||||||
|
return switch (obligationStatus) {
|
||||||
|
case CLRD -> CoverageStatus.ALWD;
|
||||||
|
case FAIL, UNCV, NACK, NACC -> CoverageStatus.DEND;
|
||||||
|
default -> null;
|
||||||
|
};
|
||||||
|
};
|
||||||
Set<Long> exchangeExecutionIdsPreviousDay = oRegs.stream()
|
Set<Long> exchangeExecutionIdsPreviousDay = oRegs.stream()
|
||||||
.filter(rgs -> Objects.nonNull(rgs.getSettlementDate()))
|
.filter(rgs -> Objects.nonNull(rgs.getSettlementDate()))
|
||||||
.filter(rgs -> Objects.nonNull(rgs.getTradingDate()))
|
.filter(rgs -> Objects.nonNull(rgs.getTradingDate()))
|
||||||
.filter(rgs -> rgs.getSettlementDate().compareTo(rgs.getTradingDate()) > 0)
|
.filter(rgs -> rgs.getSettlementDate().compareTo(rgs.getTradingDate()) > 0)
|
||||||
.map(Registry::getGroupId)
|
.map(Registry::getGroupId)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
|
log.trace("obligations number with second leg in the past: {}", exchangeExecutionIdsPreviousDay.size());
|
||||||
|
int allowed = 0;
|
||||||
|
int notAllowed = 0;
|
||||||
if (IEnumKey.contains(session.getSessionType(), SessionType.FINL, SessionType.MEDM)) {
|
if (IEnumKey.contains(session.getSessionType(), SessionType.FINL, SessionType.MEDM)) {
|
||||||
Collection<ExecutionDeposit> executions = findExecutionDepositBySessionId(sessionId);
|
Collection<ExecutionDeposit> executions = findExecutionDepositBySessionId(sessionId);
|
||||||
int notAllowed = 0;
|
log.trace("loaded {} ExecutionDeposits for sessionId {}", executions.size(), sessionId);
|
||||||
for (ExecutionDeposit execution : executions) {
|
for (ExecutionDeposit execution : executions) {
|
||||||
CoverageStatus toStatus = exchangeExecutionIdAllowed.contains(execution.getExchangeExecutionId()) ?
|
CoverageStatus toStatus = statusByExchangeId.apply(execution.getExchangeExecutionId());
|
||||||
CoverageStatus.ALWD : CoverageStatus.DEND;
|
if (toStatus == null) {
|
||||||
if (toStatus == CoverageStatus.DEND)
|
log.trace("CoverageStatus not defined for execution.id={}", execution.getId());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (toStatus == CoverageStatus.DEND) {
|
||||||
notAllowed++;
|
notAllowed++;
|
||||||
|
}
|
||||||
|
if (toStatus == CoverageStatus.ALWD) {
|
||||||
|
allowed++;
|
||||||
|
}
|
||||||
execution.setCoverageStatus(toStatus.getKey());
|
execution.setCoverageStatus(toStatus.getKey());
|
||||||
execution.setUpdated(Instant.now());
|
execution.setUpdated(Instant.now());
|
||||||
executionDepositImdg.update(execution);
|
executionDepositImdg.update(execution);
|
||||||
}
|
}
|
||||||
log.trace("By sessionId={} update {} ExecutionDeposit: {} allowed, {} denied", sessionId,
|
log.trace("By sessionId={} processed {} ExecutionDeposit: {} allowed, {} denied, skipped {}",
|
||||||
executions.size(), exchangeExecutionIdAllowed.size(), notAllowed);
|
sessionId,
|
||||||
|
executions.size(),
|
||||||
|
allowed,
|
||||||
|
notAllowed,
|
||||||
|
executions.size() - (allowed + notAllowed));
|
||||||
} else if (IEnumKey.contains(session.getSessionType(), SessionType.TRDT, SessionType.IPOB, SessionType.IPO0, SessionType.IPOT)) {
|
} else if (IEnumKey.contains(session.getSessionType(), SessionType.TRDT, SessionType.IPOB, SessionType.IPO0, SessionType.IPOT)) {
|
||||||
List<ExecutionFond> executions = Stream.concat(
|
Collection<ExecutionFond> executions = findExecutionFondBySessionId(sessionId);
|
||||||
findExecutionFondBySessionId(sessionId).stream(),
|
log.trace("loaded {} ExecutionFonds for sessionId {}", executions.size(), sessionId);
|
||||||
findExecutionFondBySessionId(exchangeExecutionIdsPreviousDay).stream())
|
|
||||||
.toList();
|
|
||||||
int notAllowed = 0;
|
|
||||||
for (ExecutionFond execution : executions) {
|
for (ExecutionFond execution : executions) {
|
||||||
CoverageStatus toStatus = exchangeExecutionIdAllowed.contains(execution.getExchangeExecutionId()) ?
|
CoverageStatus toStatus = statusByExchangeId.apply(execution.getExchangeExecutionId());
|
||||||
CoverageStatus.ALWD : CoverageStatus.DEND;
|
if (toStatus == null) {
|
||||||
if (toStatus == CoverageStatus.DEND)
|
log.trace("CoverageStatus not defined for execution.id={}", execution.getId());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (toStatus == CoverageStatus.DEND) {
|
||||||
notAllowed++;
|
notAllowed++;
|
||||||
|
}
|
||||||
|
if (toStatus == CoverageStatus.ALWD) {
|
||||||
|
allowed++;
|
||||||
|
}
|
||||||
execution.setCoverageStatus(toStatus.getKey());
|
execution.setCoverageStatus(toStatus.getKey());
|
||||||
execution.setUpdated(Instant.now());
|
execution.setUpdated(Instant.now());
|
||||||
executionFondImdg.update(execution);
|
executionFondImdg.update(execution);
|
||||||
}
|
}
|
||||||
log.trace("By sessionId={} update {} ExecutionFond: {} allowed, {} denied", sessionId,
|
log.trace("By sessionId={} processed {} ExecutionFond: allowed {}, denied {}, skipped {}",
|
||||||
executions.size(), exchangeExecutionIdAllowed.size(), notAllowed);
|
sessionId,
|
||||||
|
executions.size(),
|
||||||
|
allowed,
|
||||||
|
notAllowed,
|
||||||
|
executions.size() - (allowed + notAllowed));
|
||||||
} else {
|
} else {
|
||||||
log.warn("Unsupported session[{}].SessionType={} for update Executions", sessionId, session.getSessionType());
|
log.warn("Unsupported session[{}].SessionType={} for update Executions", sessionId, session.getSessionType());
|
||||||
}
|
}
|
||||||
|
|
@ -163,7 +203,7 @@ public class FinishingSession implements ISessionStage {
|
||||||
return sResult;
|
return sResult;
|
||||||
}
|
}
|
||||||
for (Registry registryA : forRegistries) {
|
for (Registry registryA : forRegistries) {
|
||||||
if (!RegistryDesignation.A.equalsByKey(registryA.getRegistryUnit())) {
|
if (!RegistryDesignation.A.equalsByKey(registryA.getRegistryUnit())) { //fixme Unit -> Designation
|
||||||
log.warn("For registry {}.RegistryDesignation is not A.", registryA.getId());
|
log.warn("For registry {}.RegistryDesignation is not A.", registryA.getId());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -247,37 +287,43 @@ public class FinishingSession implements ISessionStage {
|
||||||
// registryStatus - любой статус
|
// registryStatus - любой статус
|
||||||
pb.equals("registryDesignation", RegistryDesignation.O.getKey()));
|
pb.equals("registryDesignation", RegistryDesignation.O.getKey()));
|
||||||
Collection<Registry> result = registryImdg.getCollectionObjectsByPredicate(prdct);
|
Collection<Registry> result = registryImdg.getCollectionObjectsByPredicate(prdct);
|
||||||
log.trace("found {} liabilities by query {} ", result.size(), prdct);
|
int size = result.size();
|
||||||
result = result.stream()
|
result = result.stream()
|
||||||
.filter(registry -> Objects.equals(registry.getSettlementDate(), LocalDate.now()))
|
.filter(registry -> Objects.equals(registry.getSettlementDate(), LocalDate.now()))
|
||||||
.filter(registry -> Objects.equals(registry.getValueDate(), registry.getSettlementDate()))
|
.filter(registry -> Objects.equals(registry.getValueDate(), registry.getSettlementDate()))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
log.debug("found {} liabilities 'O' by query {} and ValueDate==SettlementDate", result.size(), prdct);
|
log.debug("found {} liabilities by query {} and {} liabilities after filtering ValueDate==SettlementDate",
|
||||||
|
size, result.size(), prdct);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Collection<ExecutionFond> findExecutionFondBySessionId(Long sessionId) {
|
protected Collection<ExecutionFond> findExecutionFondBySessionId(Long sessionId) {
|
||||||
ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();
|
ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();
|
||||||
ImdgPredicate prdct = pb.and(
|
ImdgPredicate prdct = pb.or(
|
||||||
pb.equals("sessionId", sessionId),
|
pb.equals("sessionId", sessionId),
|
||||||
pb.equals("settlementDate", LocalDate.now())
|
pb.equals("settlementDate", LocalDate.now())
|
||||||
);
|
);
|
||||||
Collection<ExecutionFond> result = executionFondImdg.getCollectionObjectsByPredicate(prdct);
|
Collection<ExecutionFond> result = executionFondImdg.getCollectionObjectsByPredicate(prdct)
|
||||||
|
.stream()
|
||||||
|
.filter(eFond -> Objects.nonNull(eFond.getSessionId()))
|
||||||
|
.filter(eFond -> {
|
||||||
|
if (sessionId.equals(eFond.getSessionId())) return true;
|
||||||
|
Session session = sessionImdg.getSingleObjectByID(eFond.getSessionId());
|
||||||
|
return sessionType.equalsByKey(session.getSessionType());
|
||||||
|
})
|
||||||
|
.toList();
|
||||||
log.trace("found {} ExecutionFond by sessionId={}", result.size(), sessionId);
|
log.trace("found {} ExecutionFond by sessionId={}", result.size(), sessionId);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Collection<ExecutionFond> findExecutionFondBySessionId(Set<Long> exchangeIds) {
|
|
||||||
ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();
|
|
||||||
ImdgPredicate prdct = pb.in("exchangeExecutionId", exchangeIds.toArray(new Long[0]));
|
|
||||||
Collection<ExecutionFond> result = executionFondImdg.getCollectionObjectsByPredicate(prdct);
|
|
||||||
log.trace("found {} ExecutionFond from first day", result.size());
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Collection<ExecutionDeposit> findExecutionDepositBySessionId(Long sessionId) {
|
protected Collection<ExecutionDeposit> findExecutionDepositBySessionId(Long sessionId) {
|
||||||
Collection<ExecutionDeposit> result = executionDepositImdg.getCollectionObjectsByFieldValues(Map.of("sessionId", sessionId));
|
ImdgPredicateBuilder pb = executionDepositImdg.predicateBuilder();
|
||||||
log.trace("found {} ExecutionDeposit by sessionId={}", result.size(), sessionId);
|
ImdgPredicate prdct = pb.or(
|
||||||
|
pb.equals("sessionId", sessionId),
|
||||||
|
pb.equals("firstLegSettlementDate", LocalDate.now())
|
||||||
|
);
|
||||||
|
Collection<ExecutionDeposit> result = executionDepositImdg.getCollectionObjectsByPredicate(prdct);
|
||||||
|
log.trace("found {} ExecutionDeposit by {}", result.size(), prdct);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -215,6 +215,8 @@ public class FormingPaymentInstructionAssets implements ISessionStage {
|
||||||
.creditLegAccount(creditLegAccount)
|
.creditLegAccount(creditLegAccount)
|
||||||
.amount(amount)
|
.amount(amount)
|
||||||
.sessionId(sessionId)
|
.sessionId(sessionId)
|
||||||
|
.checkBLKD((SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType))
|
||||||
|
&& !isPositiveBalance ? registry : null)
|
||||||
.purpose(String.format("Перевод по итогу клиринга по ТКР %s", registry.getTradingClearingRegistry()));
|
.purpose(String.format("Перевод по итогу клиринга по ТКР %s", registry.getTradingClearingRegistry()));
|
||||||
PaymentInstruction paymentInstruction = paymentInstructionBuilder.build();
|
PaymentInstruction paymentInstruction = paymentInstructionBuilder.build();
|
||||||
log.debug("Created paymentInstruction by registry.id: {}", registry.getId());
|
log.debug("Created paymentInstruction by registry.id: {}", registry.getId());
|
||||||
|
|
|
||||||
|
|
@ -154,7 +154,7 @@ public class FormingPaymentInstructionSecurities implements ISessionStage {
|
||||||
.stream()
|
.stream()
|
||||||
.collect(Collectors.groupingBy(Registry::getGroupId));
|
.collect(Collectors.groupingBy(Registry::getGroupId));
|
||||||
log.debug("groups.size = {}", groups.size());
|
log.debug("groups.size = {}", groups.size());
|
||||||
Map<Long, PaymentGroup> lstGroups = RegistryLiabilitiesGroup.group(registries);
|
Map<Long, PaymentGroup> lstGroups = RegistryLiabilitiesGroup.group(groups);
|
||||||
for (Map.Entry<Long, List<Registry>> group : groups.entrySet()) {
|
for (Map.Entry<Long, List<Registry>> group : groups.entrySet()) {
|
||||||
Long groupId = group.getKey();
|
Long groupId = group.getKey();
|
||||||
Function<RegistryTradingParams, Registry> findByCode = rgsCode -> group.getValue()
|
Function<RegistryTradingParams, Registry> findByCode = rgsCode -> group.getValue()
|
||||||
|
|
|
||||||
|
|
@ -4,44 +4,56 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import ru.clearing.classes.statics.data.registry.Registry;
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
import ru.spcex.clearing.service.registry.RegistryManager;
|
import ru.spcex.clearing.service.registry.RegistryManager;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryTradingParams;
|
||||||
|
import ru.spcex.platform.utils.collection.Pair;
|
||||||
|
import ru.spcex.platform.utils.text.TextUtil;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static ru.spcex.platform.enumeration.RegistryTradingParams.CS_T;
|
||||||
import static ru.spcex.platform.enumeration.RegistryTradingParams.LS_T;
|
import static ru.spcex.platform.enumeration.RegistryTradingParams.LS_T;
|
||||||
|
|
||||||
public class RegistryLiabilitiesGroup {
|
public class RegistryLiabilitiesGroup {
|
||||||
private Logger log = LoggerFactory.getLogger(getClass());
|
private static final Logger log = LoggerFactory.getLogger(RegistryLiabilitiesGroup.class);
|
||||||
|
|
||||||
public static RegistryLiabilitiesGroup builder() {
|
public static Map<Long, PaymentGroup> group(Map<Long, List<Registry>> registriesCollection) {
|
||||||
return new RegistryLiabilitiesGroup();
|
|
||||||
}
|
|
||||||
|
|
||||||
private RegistryLiabilitiesGroup() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Map<Long, PaymentGroup> group(Collection<Registry> registriesCollection) {
|
|
||||||
Map<Long, PaymentGroup> result = new HashMap<>();
|
Map<Long, PaymentGroup> result = new HashMap<>();
|
||||||
List<Registry> registries = registriesCollection
|
List<Pair<Registry, Registry>> lstCstGroup = registriesCollection.entrySet()
|
||||||
.stream()
|
.stream()
|
||||||
.filter(rgs -> RegistryManager.equalsByCode(LS_T, rgs))
|
.map(entry -> {
|
||||||
|
Long groupId = entry.getKey();
|
||||||
|
List<Registry> value = entry.getValue();
|
||||||
|
Registry ls_t = obtain(value, LS_T);
|
||||||
|
Registry cs_t = obtain(value, CS_T);
|
||||||
|
if (ls_t == null || cs_t == null) {
|
||||||
|
log.error("groupId {} registries {} failed to find LS_T/CS_T", groupId, value.stream()
|
||||||
|
.map(Registry::getId)
|
||||||
|
.map(Object::toString)
|
||||||
|
.collect(TextUtil.join));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new Pair<>(ls_t, cs_t);
|
||||||
|
})
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
for (int i = 0; i < registries.size(); i++) {
|
for (int i = 0; i < lstCstGroup.size(); i++) {
|
||||||
Registry ls_t = registries.get(i);
|
var pair = lstCstGroup.get(i);
|
||||||
if (ls_t == null) {
|
if (pair == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
Registry ls_t = pair.getFirst();
|
||||||
LinkedList<Registry> relatedLiabilities = new LinkedList<>();
|
LinkedList<Registry> relatedLiabilities = new LinkedList<>();
|
||||||
relatedLiabilities.add(ls_t);
|
relatedLiabilities.add(ls_t);
|
||||||
for (int j = i + 1; j < registries.size(); j++) {
|
for (int j = i + 1; j < lstCstGroup.size(); j++) {
|
||||||
Registry related = registries.get(j);
|
var anotherGroup = lstCstGroup.get(j);
|
||||||
if (related == null) {
|
if (anotherGroup == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (rgsOfTheSameAgents(ls_t, related)) {
|
Registry related = anotherGroup.getFirst();
|
||||||
|
if (rgsOfTheSameAgents(pair.getFirst(), pair.getSecond(), anotherGroup.getFirst(), anotherGroup.getSecond())) {
|
||||||
relatedLiabilities.add(related);
|
relatedLiabilities.add(related);
|
||||||
registries.set(j, null);
|
lstCstGroup.set(j, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PaymentGroup paymentGroup = new PaymentGroup();
|
PaymentGroup paymentGroup = new PaymentGroup();
|
||||||
|
|
@ -57,10 +69,25 @@ public class RegistryLiabilitiesGroup {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean rgsOfTheSameAgents(Registry ls_t1, Registry ls_t2) {
|
private static boolean rgsOfTheSameAgents(Registry ls_t1, Registry cs_t1, Registry ls_t2, Registry cs_t2) {
|
||||||
return Objects.equals(ls_t1.getSecurityId(), ls_t2.getSecurityId())
|
return Objects.equals(ls_t1.getSecurityId(), ls_t2.getSecurityId())
|
||||||
&& Objects.equals(ls_t1.getTradingClearingRegistryId(), ls_t2.getTradingClearingRegistryId())
|
&& Objects.equals(ls_t1.getTradingClearingRegistryId(), ls_t2.getTradingClearingRegistryId())
|
||||||
|
&& Objects.equals(cs_t1.getTradingClearingRegistryId(), cs_t2.getTradingClearingRegistryId())
|
||||||
&& Objects.equals(ls_t1.getCompanyId(), ls_t2.getCompanyId())
|
&& Objects.equals(ls_t1.getCompanyId(), ls_t2.getCompanyId())
|
||||||
&& Objects.equals(ls_t1.getCounterPartyId(), ls_t2.getCounterPartyId());
|
&& Objects.equals(ls_t1.getCounterPartyId(), ls_t2.getCounterPartyId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Registry obtain(Collection<Registry> group, RegistryTradingParams cde) {
|
||||||
|
List<Registry> allRegistries = group
|
||||||
|
.stream()
|
||||||
|
.filter(rgs -> RegistryManager.equalsByCode(cde, rgs))
|
||||||
|
.toList();
|
||||||
|
if (allRegistries.size() > 1) {
|
||||||
|
throw new IllegalStateException("more than one " + cde + " entry in group " + group.iterator().next().getGroupId());
|
||||||
|
}
|
||||||
|
if (allRegistries.size() == 1) {
|
||||||
|
return allRegistries.iterator().next();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
<encoder>
|
<encoder>
|
||||||
<charset>UTF-8</charset>
|
<charset>UTF-8</charset>
|
||||||
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
<pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
</encoder>
|
</encoder>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
<file>./logs/clearing-service.log</file>
|
<file>./logs/clearing-service.log</file>
|
||||||
<encoder>
|
<encoder>
|
||||||
<charset>UTF-8</charset>
|
<charset>UTF-8</charset>
|
||||||
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
<pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
</encoder>
|
</encoder>
|
||||||
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
|
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
|
||||||
<fileNamePattern>
|
<fileNamePattern>
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
<appender-ref ref="CONSOLE"/>
|
<appender-ref ref="CONSOLE"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<logger name="ru.spcex.clearing.service.execution" level="warn" additivity="false">
|
<logger name="ru.spcex.clearing.service.execution" level="info" additivity="false">
|
||||||
<appender-ref ref="FILE"/>
|
<appender-ref ref="FILE"/>
|
||||||
<appender-ref ref="CONSOLE"/>
|
<appender-ref ref="CONSOLE"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ public class ISchedulerChecker {
|
||||||
/**
|
/**
|
||||||
* @param isWeekend тек.день=СБ-ВС<br>
|
* @param isWeekend тек.день=СБ-ВС<br>
|
||||||
*/
|
*/
|
||||||
public static boolean isValidWorkday(ClearingCalendar clearingCalendar, boolean isWeekend) {
|
public static boolean isWorkDayByTradingCalendar(ClearingCalendar clearingCalendar, boolean isWeekend) {
|
||||||
if (clearingCalendar.getDayStatus() != null && clearingCalendar.getDayStatus().equalsIgnoreCase(DayStatus.Workday.getKey())) {
|
if (clearingCalendar.getDayStatus() != null && clearingCalendar.getDayStatus().equalsIgnoreCase(DayStatus.Workday.getKey())) {
|
||||||
if (isWeekend) {
|
if (isWeekend) {
|
||||||
return clearingCalendar.getCompanyId() != null && clearingCalendar.getCompanyId() != 0;
|
return clearingCalendar.getCompanyId() != null && clearingCalendar.getCompanyId() != 0;
|
||||||
|
|
@ -31,4 +31,9 @@ public class ISchedulerChecker {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isWorkDayByTradingCalendar(ClearingCalendar clearingCalendar) {
|
||||||
|
return clearingCalendar.getDayStatus() != null &&
|
||||||
|
clearingCalendar.getDayStatus().equalsIgnoreCase(DayStatus.Workday.getKey());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
-- DB version: 3.8.0.62
|
-- DB version: 3.9.0.68
|
||||||
-- DATA version: 3.5.0.14
|
-- DATA version: 3.9.0.68
|
||||||
|
|
||||||
|
|
||||||
/* Dictionaries */
|
/* Dictionaries */
|
||||||
|
|
@ -312,7 +312,7 @@ 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_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 (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 (2, 'AMAF', 'Денежные средства - свободные') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
||||||
|
|
@ -334,7 +334,7 @@ INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (10, 'LMAT', 'Рас
|
||||||
|
|
||||||
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 (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 (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 (13, 'AMBF', 'Денежные средства клиента - свободные') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
||||||
|
|
@ -360,7 +360,7 @@ INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (23, 'DMAT', 'Воз
|
||||||
|
|
||||||
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 (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 (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 (26, 'ASAF', 'Ценные бумаги - свободные') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
||||||
|
|
@ -374,7 +374,15 @@ INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (30, 'DMAU', 'Ден
|
||||||
|
|
||||||
INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (31, 'DMAV', 'Треб. выписки') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (31, 'DMAV', 'Треб. выписки') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
||||||
INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (32, 'ASZT', 'Ценные бумаги - общие') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (32, 'ASZT', 'Ценные бумаги для размещения/выкупа') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
||||||
|
INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (33, 'ASBT', 'Ценные бумаги Участника клиринга – клиенты') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
||||||
|
INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (34, 'ASCT', 'Ценные бумаги Участника клиринга – клиенты-нерезиденты') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
||||||
|
INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (35, 'AMCT', 'Денежные средства Участника клиринга, зарезервированные на торги – клиенты') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
||||||
|
INSERT INTO REGISTRY_CODE_DICTIONARY(ID, CODE, NAME) values (36, 'ASXT', 'Ценные бумаги Участника клиринга – ДУ') 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 (1, 'OK', 'Рассчитано') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
||||||
|
|
@ -498,6 +506,8 @@ INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (27, 'EDEP', 'Время за
|
||||||
|
|
||||||
INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (28, 'CHDF', 'Проверка наличия пары ДФ-01/ДФ-57 и ДФ-08/ДФ-21') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (28, 'CHDF', 'Проверка наличия пары ДФ-01/ДФ-57 и ДФ-08/ДФ-21') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
||||||
|
INSERT INTO TASK_DICTIONARY(ID, CODE, NAME) values (29, 'CCLR', 'Завершение неудачных клиринговых сессий') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
||||||
INSERT INTO TASK_STATUS_DICTIONARY(ID, CODE, NAME) values (1, 'ACTV', 'Активна') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
INSERT INTO TASK_STATUS_DICTIONARY(ID, CODE, NAME) values (1, 'ACTV', 'Активна') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
||||||
INSERT INTO TASK_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'BLKD', 'Не активна') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
INSERT INTO TASK_STATUS_DICTIONARY(ID, CODE, NAME) values (2, 'BLKD', 'Не активна') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
@ -832,6 +842,8 @@ INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5023, 'ACNT', 'Сче
|
||||||
|
|
||||||
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5024, 'ACNT', 'Не указан номер счета.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5024, 'ACNT', 'Не указан номер счета.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
||||||
|
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5025, '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 (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;
|
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5210, 'BLNC', 'Клиринговая сессия неактивна.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
@ -993,169 +1005,3 @@ INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (10000, 'TRDI', 'Общ
|
||||||
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (10001, 'TRDI', 'Сделка с номером в ТС = %s некорректна.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (10001, 'TRDI', 'Сделка с номером в ТС = %s некорректна.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
|
||||||
|
|
||||||
/* Business objects */
|
/* Business objects */
|
||||||
|
|
||||||
INSERT INTO COMPANY(ID, FULL_NAME, SHORT_NAME, TRADING_CODE, CLEARING_CODE, WORKFLOW_STATUS) values (1, 'АО Санкт-Петербургская Валютная Биржа', 'СПВБ', '', '', 'ACTV') ON CONFLICT (ID) DO UPDATE SET FULL_NAME = EXCLUDED.FULL_NAME, SHORT_NAME = EXCLUDED.SHORT_NAME, TRADING_CODE = EXCLUDED.TRADING_CODE, CLEARING_CODE = EXCLUDED.CLEARING_CODE, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS;
|
|
||||||
|
|
||||||
INSERT INTO COMPANY(ID, FULL_NAME, SHORT_NAME, TRADING_CODE, CLEARING_CODE, WORKFLOW_STATUS) values (2, 'ЗАО «Петербургский Расчетный Центр»', 'ПРЦ', '', '', 'ACTV') ON CONFLICT (ID) DO UPDATE SET FULL_NAME = EXCLUDED.FULL_NAME, SHORT_NAME = EXCLUDED.SHORT_NAME, TRADING_CODE = EXCLUDED.TRADING_CODE, CLEARING_CODE = EXCLUDED.CLEARING_CODE, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS;
|
|
||||||
|
|
||||||
INSERT INTO COMPANY(ID, FULL_NAME, SHORT_NAME, TRADING_CODE, CLEARING_CODE, WORKFLOW_STATUS) values (3, 'Торговая организация', 'ТС', '', '', 'ACTV') ON CONFLICT (ID) DO UPDATE SET FULL_NAME = EXCLUDED.FULL_NAME, SHORT_NAME = EXCLUDED.SHORT_NAME, TRADING_CODE = EXCLUDED.TRADING_CODE, CLEARING_CODE = EXCLUDED.CLEARING_CODE, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS;
|
|
||||||
|
|
||||||
INSERT INTO COMPANY(ID, FULL_NAME, SHORT_NAME, TRADING_CODE, CLEARING_CODE, WORKFLOW_STATUS) values (4, 'ЗАО «Санкт-Петербургский Расчетно-Депозитарный Центр»', 'РДЦ', '', '', 'ACTV') ON CONFLICT (ID) DO UPDATE SET FULL_NAME = EXCLUDED.FULL_NAME, SHORT_NAME = EXCLUDED.SHORT_NAME, TRADING_CODE = EXCLUDED.TRADING_CODE, CLEARING_CODE = EXCLUDED.CLEARING_CODE, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS;
|
|
||||||
|
|
||||||
INSERT INTO COMPANY_SYMBOLS(ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE) values (1, 1, 'BIC', '044030920') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, COMPANY_SYMBOL = EXCLUDED.COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE = EXCLUDED.COMPANY_SYMBOL_VALUE;
|
|
||||||
|
|
||||||
INSERT INTO COMPANY_SYMBOLS(ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE) values (2, 2, 'BIC', '044030505') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, COMPANY_SYMBOL = EXCLUDED.COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE = EXCLUDED.COMPANY_SYMBOL_VALUE;
|
|
||||||
|
|
||||||
INSERT INTO CURRENCY(ID, CURRENCY_CODE) values (643, 'RUB') ON CONFLICT (ID) DO UPDATE SET CURRENCY_CODE = EXCLUDED.CURRENCY_CODE;
|
|
||||||
|
|
||||||
INSERT INTO SECURITY(INSTRUMENT_TYPE, SHORT_NAME, FULL_NAME, SECURITY_SYMBOL, WORKFLOW_STATUS, ID) values ('CRNC', 'RUB', 'Российский рубль', 'RUB', 'ACTV', 643) ON CONFLICT (ID) DO UPDATE SET INSTRUMENT_TYPE = EXCLUDED.INSTRUMENT_TYPE, SHORT_NAME = EXCLUDED.SHORT_NAME, FULL_NAME = EXCLUDED.FULL_NAME, SECURITY_SYMBOL = EXCLUDED.SECURITY_SYMBOL, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS;
|
|
||||||
|
|
||||||
INSERT INTO ACCOUNT(ID, COMPANY_ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN) values (1, 1, '30414810300000006000', 'TRAN', 'ACTV', 'ALWD') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN;
|
|
||||||
|
|
||||||
INSERT INTO ACCOUNT(ID, COMPANY_ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN) values (2, 1, '30414810600000007000', 'ANLT', 'ACTV', 'ALWD') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN;
|
|
||||||
|
|
||||||
INSERT INTO ACCOUNT(ID, COMPANY_ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN) values (3, 1, '700100000AT0', 'DTRN', 'ACTV', 'ALWD') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1, 'SCND', 'FOND', 'RUB', 'UESC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Обыкновенные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (2, 'SCND', 'FOND', 'RUB', 'NESC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Обыкновенные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (3, 'SCND', 'FOND', 'RUB', 'DESC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Обыкновенные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (4, 'PRMR', 'FOND', 'RUB', 'AESC', 'Размещение: акции (аукцион по цене)', 1, 'Размещение: акции (аукцион по цене): Обыкновенные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (5, 'PRMR', 'FOND', 'RUB', 'WESC', 'Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка): Обыкновенные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (6, 'SCND', 'FOND', 'RUB', 'UEPC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Привилегированные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (7, 'SCND', 'FOND', 'RUB', 'NEPC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Привилегированные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (8, 'SCND', 'FOND', 'RUB', 'DEPC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Привилегированные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (9, 'PRMR', 'FOND', 'RUB', 'AEPC', 'Размещение: акции (аукцион по цене)', 1, 'Размещение: акции (аукцион по цене): Привилегированные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (10, 'PRMR', 'FOND', 'RUB', 'WEPC', 'Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка): Привилегированные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (11, 'PRMR', 'FOND', 'RUB', 'ABVC', 'Размещение: Аукцион по цене', 1, 'Размещение: Аукцион по цене: Купонные облигации с переменным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (12, 'PRMR', 'FOND', 'RUB', 'KBVC', 'Размещение: Аукцион по ставке', 1, 'Размещение: Аукцион по ставке: Купонные облигации с переменным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (13, 'SCND', 'FOND', 'RUB', 'UBVC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Купонные облигации с переменным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (14, 'SCND', 'FOND', 'RUB', 'NBVC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Купонные облигации с переменным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (15, 'SCND', 'FOND', 'RUB', 'DBVC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Купонные облигации с переменным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (16, 'PRMR', 'FOND', 'RUB', 'WBVC', 'Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка): Купонные облигации с переменным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (17, 'PRMR', 'FOND', 'RUB', 'ABFC', 'Размещение: Аукцион по цене', 1, 'Размещение: Аукцион по цене: Купонные облигации с постоянным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (18, 'PRMR', 'FOND', 'RUB', 'KBFC', 'Размещение: Аукцион по ставке', 1, 'Размещение: Аукцион по ставке: Купонные облигации с постоянным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (19, 'SCND', 'FOND', 'RUB', 'UBFC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Купонные облигации с постоянным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (20, 'SCND', 'FOND', 'RUB', 'NBFC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Купонные облигации с постоянным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (21, 'SCND', 'FOND', 'RUB', 'DBFC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Купонные облигации с постоянным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (22, 'PRMR', 'FOND', 'RUB', 'WBFC', 'Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка): Купонные облигации с постоянным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (23, 'PRMR', 'FOND', 'RUB', 'ABIC', 'Размещение: Аукцион по цене', 1, 'Размещение: Аукцион по цене: Облигации с индексированным номиналом') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (24, 'PRMR', 'FOND', 'RUB', 'KBIC', 'Размещение: Аукцион по ставке', 1, 'Размещение: Аукцион по ставке: Облигации с индексированным номиналом') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (25, 'SCND', 'FOND', 'RUB', 'UBIC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Облигации с индексированным номиналом') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (26, 'SCND', 'FOND', 'RUB', 'NBIC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Облигации с индексированным номиналом') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (27, 'SCND', 'FOND', 'RUB', 'DBIC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Облигации с индексированным номиналом') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (28, 'PRMR', 'FOND', 'RUB', 'WBIC', 'Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка): Облигации с индексированным номиналом') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (29, 'PRMR', 'FOND', 'RUB', 'ABMC', 'Размещение: Аукцион по цене', 1, 'Размещение: Аукцион по цене: Облигации с амортизацией долга') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (30, 'PRMR', 'FOND', 'RUB', 'KBMC', 'Размещение: Аукцион по ставке', 1, 'Размещение: Аукцион по ставке: Облигации с амортизацией долга') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (31, 'SCND', 'FOND', 'RUB', 'UBMC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Облигации с амортизацией долга') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (32, 'SCND', 'FOND', 'RUB', 'NBMC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Облигации с амортизацией долга') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (33, 'SCND', 'FOND', 'RUB', 'DBMC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Облигации с амортизацией долга') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (34, 'PRMR', 'FOND', 'RUB', 'WBMC', 'Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка): Облигации с амортизацией долга') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (35, 'PRMR', 'FOND', 'RUB', 'BKVC', 'Размещение: Аукцион БР', 1, 'Размещение: Аукцион БР: Облигации Банка России с переменным купоном (КОБР)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (36, 'PRMR', 'FOND', 'RUB', 'SKVC', 'Доразмещение: Адресные заявки БР', 1, 'Доразмещение: Адресные заявки БР: Облигации Банка России с переменным купоном (КОБР)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (37, 'SCND', 'FOND', 'RUB', 'UKVC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Облигации Банка России с переменным купоном (КОБР)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (38, 'SCND', 'FOND', 'RUB', 'NKVC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Облигации Банка России с переменным купоном (КОБР)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (39, 'SCND', 'FOND', 'RUB', 'DKVC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Облигации Банка России с переменным купоном (КОБР)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (45, 'PRMR', 'FOND', 'RUB', 'ABEC', 'Размещение: Аукцион СПВБ', 1, 'Размещение: Аукцион СПВБ: Биржевые облигации') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (46, 'SCND', 'FOND', 'RUB', 'UBEC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Биржевые облигации') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (47, 'SCND', 'FOND', 'RUB', 'NBEC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Биржевые облигации') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (48, 'SCND', 'FOND', 'RUB', 'DBEC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Биржевые облигации') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (61, 'PRMR', 'FOND', 'RUB', 'BMVC', 'ОФЗПК-Размещение: Аукцион БР', 1, 'ОФЗПК-Размещение: Аукцион БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (62, 'PRMR', 'FOND', 'RUB', 'SMVC', 'ОФЗПК-Доразмещение: Адресные заявки БР', 1, 'ОФЗПК-Доразмещение: Адресные заявки БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (63, 'SCND', 'FOND', 'RUB', 'UMVC', 'ОФЗПК-Режим непрерывных торгов', 1, 'ОФЗПК-Режим непрерывных торгов: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (64, 'SCND', 'FOND', 'RUB', 'DMVC', 'ОФЗПК-Дискретный аукцион', 1, 'ОФЗПК-Дискретный аукцион: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (65, 'SCND', 'FOND', 'RUB', 'MMVC', 'ОФЗПК-Торги в режиме выкупа', 1, 'ОФЗПК-Торги в режиме выкупа: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (66, 'PRMR', 'FOND', 'RUB', 'BMFC', 'ОФЗПД-Размещение: Аукцион БР', 1, 'ОФЗПД-Размещение: Аукцион БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (67, 'PRMR', 'FOND', 'RUB', 'SMFC', 'ОФЗПД- Доразмещение: Адресные заявки БР', 1, 'ОФЗПД- Доразмещение: Адресные заявки БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (68, 'SCND', 'FOND', 'RUB', 'UMFC', 'ОФЗПД-Режим непрерывных торгов', 1, 'ОФЗПД-Режим непрерывных торгов: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (69, 'SCND', 'FOND', 'RUB', 'DMFC', 'ОФЗПД-Дискретный аукцион', 1, 'ОФЗПД-Дискретный аукцион: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (70, 'SCND', 'FOND', 'RUB', 'MMFC', 'ОФЗПД-Торги в режиме выкупа', 1, 'ОФЗПД-Торги в режиме выкупа: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (71, 'PRMR', 'FOND', 'RUB', 'BMMC', 'ОФЗАД-Размещение: Аукцион БР', 1, 'ОФЗАД-Размещение: Аукцион БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (72, 'PRMR', 'FOND', 'RUB', 'SMMC', 'ОФЗАД-Доразмещение: Адресные заявки БР', 1, 'ОФЗАД-Доразмещение: Адресные заявки БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (73, 'SCND', 'FOND', 'RUB', 'UMMC', 'ОФЗАД-Режим непрерывных торгов', 1, 'ОФЗАД-Режим непрерывных торгов: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (74, 'SCND', 'FOND', 'RUB', 'DMMC', 'ОФЗАД-Дискретный аукцион', 1, 'ОФЗАД-Дискретный аукцион: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (75, 'SCND', 'FOND', 'RUB', 'MMMC', 'ОФЗАД-Торги в режиме выкупа', 1, 'ОФЗАД-Торги в режиме выкупа: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (76, 'PRMR', 'FOND', 'RUB', 'BMIC', 'ОФЗИН-Размещение: Аукцион БР', 1, 'ОФЗИН-Размещение: Аукцион БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (77, 'PRMR', 'FOND', 'RUB', 'SMIC', 'ОФЗИН-Доразмещение: Адресные заявки БР', 1, 'ОФЗИН-Доразмещение: Адресные заявки БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (78, 'SCND', 'FOND', 'RUB', 'UMIC', 'ОФЗИН-Режим непрерывных торгов', 1, 'ОФЗИН-Режим непрерывных торгов: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (79, 'SCND', 'FOND', 'RUB', 'DMIC', 'ОФЗИН-Дискретный аукцион', 1, 'ОФЗИН-Дискретный аукцион: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (80, 'SCND', 'FOND', 'RUB', 'MMIC', 'ОФЗИН-Торги в режиме выкупа', 1, 'ОФЗИН-Торги в режиме выкупа: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (82, 'PRMR', 'FOND', 'RUB', 'BBVC', 'ОФЗ-ПК - Аукцион БР', 1, 'ОФЗ-ПК - Аукцион БР') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (83, 'PRMR', 'MKR', 'RUB', 'XMDTATSS', 'СПб ГУП АТС Смольного', 1, 'СПб ГУП АТС Смольного') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (88, 'PRMR', 'MKR', 'RUB', 'XMTTKFSP', 'Комитет финансов СПб', 1, 'Комитет финансов СПб') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (89, 'PRMR', 'MKR', 'RUB', 'XMDSKFLO', 'Комитет финансов ЛО', 1, 'Комитет финансов ЛО') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (90, 'PRMR', 'MKR', 'RUB', 'XMDTFSKB', 'ФСКМБ', 1, 'ФСКМБ') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (91, 'PRMR', 'MKR', 'RUB', 'XMDSFGGE', 'ФАУ ГГЭ', 1, 'ФАУ ГГЭ') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (92, 'PRMR', 'MKR', 'RUB', 'XMDTVRGO', 'ВВО РГО', 1, 'ВВО РГО') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (93, 'PRMR', 'MKR', 'RUB', 'XMDTTDRM', 'ООО Торговый дом РМ-Рейл', 1, 'ООО Торговый дом РМ-Рейл') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
||||||
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (95, 'PRMR', 'MKR', 'RUB', 'XMDTRKFN', 'АО РК Финанс', 1, 'АО РК Финанс') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,173 @@
|
||||||
|
-- DB version: 3.9.0.69
|
||||||
|
-- DATA version: 3.9.0.68
|
||||||
|
|
||||||
|
|
||||||
|
/* Dictionaries */
|
||||||
|
|
||||||
|
/* Business objects */
|
||||||
|
|
||||||
|
INSERT INTO COMPANY(ID, FULL_NAME, SHORT_NAME, TRADING_CODE, CLEARING_CODE, WORKFLOW_STATUS) values (1, 'АО Санкт-Петербургская Валютная Биржа', 'СПВБ', '001', '001', 'ACTV') ON CONFLICT (ID) DO UPDATE SET FULL_NAME = EXCLUDED.FULL_NAME, SHORT_NAME = EXCLUDED.SHORT_NAME, TRADING_CODE = EXCLUDED.TRADING_CODE, CLEARING_CODE = EXCLUDED.CLEARING_CODE, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS;
|
||||||
|
|
||||||
|
INSERT INTO COMPANY(ID, FULL_NAME, SHORT_NAME, TRADING_CODE, CLEARING_CODE, WORKFLOW_STATUS) values (2, 'ЗАО «Петербургский Расчетный Центр»', 'ПРЦ', '', '', 'ACTV') ON CONFLICT (ID) DO UPDATE SET FULL_NAME = EXCLUDED.FULL_NAME, SHORT_NAME = EXCLUDED.SHORT_NAME, TRADING_CODE = EXCLUDED.TRADING_CODE, CLEARING_CODE = EXCLUDED.CLEARING_CODE, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS;
|
||||||
|
|
||||||
|
INSERT INTO COMPANY(ID, FULL_NAME, SHORT_NAME, TRADING_CODE, CLEARING_CODE, WORKFLOW_STATUS) values (3, 'Торговая организация', 'ТС', '', '', 'ACTV') ON CONFLICT (ID) DO UPDATE SET FULL_NAME = EXCLUDED.FULL_NAME, SHORT_NAME = EXCLUDED.SHORT_NAME, TRADING_CODE = EXCLUDED.TRADING_CODE, CLEARING_CODE = EXCLUDED.CLEARING_CODE, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS;
|
||||||
|
|
||||||
|
INSERT INTO COMPANY(ID, FULL_NAME, SHORT_NAME, TRADING_CODE, CLEARING_CODE, WORKFLOW_STATUS) values (4, 'ЗАО «Санкт-Петербургский Расчетно-Депозитарный Центр»', 'РДЦ', '', '', 'ACTV') ON CONFLICT (ID) DO UPDATE SET FULL_NAME = EXCLUDED.FULL_NAME, SHORT_NAME = EXCLUDED.SHORT_NAME, TRADING_CODE = EXCLUDED.TRADING_CODE, CLEARING_CODE = EXCLUDED.CLEARING_CODE, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS;
|
||||||
|
|
||||||
|
INSERT INTO COMPANY_SYMBOLS(ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE) values (1, 1, 'BIC', '044030920') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, COMPANY_SYMBOL = EXCLUDED.COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE = EXCLUDED.COMPANY_SYMBOL_VALUE;
|
||||||
|
|
||||||
|
INSERT INTO COMPANY_SYMBOLS(ID, COMPANY_ID, COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE) values (2, 2, 'BIC', '044030505') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, COMPANY_SYMBOL = EXCLUDED.COMPANY_SYMBOL, COMPANY_SYMBOL_VALUE = EXCLUDED.COMPANY_SYMBOL_VALUE;
|
||||||
|
|
||||||
|
INSERT INTO CURRENCY(ID, CURRENCY_CODE) values (643, 'RUB') ON CONFLICT (ID) DO UPDATE SET CURRENCY_CODE = EXCLUDED.CURRENCY_CODE;
|
||||||
|
|
||||||
|
INSERT INTO SECURITY(INSTRUMENT_TYPE, SHORT_NAME, FULL_NAME, SECURITY_SYMBOL, WORKFLOW_STATUS, ID) values ('CRNC', 'RUB', 'Российский рубль', 'RUB', 'ACTV', 643) ON CONFLICT (ID) DO UPDATE SET INSTRUMENT_TYPE = EXCLUDED.INSTRUMENT_TYPE, SHORT_NAME = EXCLUDED.SHORT_NAME, FULL_NAME = EXCLUDED.FULL_NAME, SECURITY_SYMBOL = EXCLUDED.SECURITY_SYMBOL, WORKFLOW_STATUS = EXCLUDED.WORKFLOW_STATUS;
|
||||||
|
|
||||||
|
INSERT INTO ACCOUNT(ID, COMPANY_ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN) values (1, 1, '30414810300000006000', 'TRAN', 'ACTV', 'ALWD') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN;
|
||||||
|
|
||||||
|
INSERT INTO ACCOUNT(ID, COMPANY_ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN) values (2, 1, '30414810600000007000', 'ANLT', 'ACTV', 'ALWD') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN;
|
||||||
|
|
||||||
|
INSERT INTO ACCOUNT(ID, COMPANY_ID, ACCOUNT, ACCOUNT_TYPE, STATUS, PROCESSING_SIGN) values (3, 1, 'SPCEX', 'DTRN', 'ACTV', 'ALWD') ON CONFLICT (ID) DO UPDATE SET COMPANY_ID = EXCLUDED.COMPANY_ID, ACCOUNT = EXCLUDED.ACCOUNT, ACCOUNT_TYPE = EXCLUDED.ACCOUNT_TYPE, STATUS = EXCLUDED.STATUS, PROCESSING_SIGN = EXCLUDED.PROCESSING_SIGN;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (1, 'SCND', 'FOND', 'RUB', 'UESC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Обыкновенные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (2, 'SCND', 'FOND', 'RUB', 'NESC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Обыкновенные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (3, 'SCND', 'FOND', 'RUB', 'DESC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Обыкновенные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (4, 'PRMR', 'FOND', 'RUB', 'AESC', 'Размещение: акции (аукцион по цене)', 1, 'Размещение: акции (аукцион по цене): Обыкновенные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (5, 'PRMR', 'FOND', 'RUB', 'WESC', 'Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка): Обыкновенные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (6, 'SCND', 'FOND', 'RUB', 'UEPC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Привилегированные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (7, 'SCND', 'FOND', 'RUB', 'NEPC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Привилегированные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (8, 'SCND', 'FOND', 'RUB', 'DEPC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Привилегированные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (9, 'PRMR', 'FOND', 'RUB', 'AEPC', 'Размещение: акции (аукцион по цене)', 1, 'Размещение: акции (аукцион по цене): Привилегированные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (10, 'PRMR', 'FOND', 'RUB', 'WEPC', 'Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка): Привилегированные акции') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (11, 'PRMR', 'FOND', 'RUB', 'ABVC', 'Размещение: Аукцион по цене', 1, 'Размещение: Аукцион по цене: Купонные облигации с переменным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (12, 'PRMR', 'FOND', 'RUB', 'KBVC', 'Размещение: Аукцион по ставке', 1, 'Размещение: Аукцион по ставке: Купонные облигации с переменным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (13, 'SCND', 'FOND', 'RUB', 'UBVC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Купонные облигации с переменным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (14, 'SCND', 'FOND', 'RUB', 'NBVC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Купонные облигации с переменным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (15, 'SCND', 'FOND', 'RUB', 'DBVC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Купонные облигации с переменным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (16, 'PRMR', 'FOND', 'RUB', 'WBVC', 'Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка): Купонные облигации с переменным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (17, 'PRMR', 'FOND', 'RUB', 'ABFC', 'Размещение: Аукцион по цене', 1, 'Размещение: Аукцион по цене: Купонные облигации с постоянным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (18, 'PRMR', 'FOND', 'RUB', 'KBFC', 'Размещение: Аукцион по ставке', 1, 'Размещение: Аукцион по ставке: Купонные облигации с постоянным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (19, 'SCND', 'FOND', 'RUB', 'UBFC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Купонные облигации с постоянным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (20, 'SCND', 'FOND', 'RUB', 'NBFC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Купонные облигации с постоянным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (21, 'SCND', 'FOND', 'RUB', 'DBFC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Купонные облигации с постоянным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (22, 'PRMR', 'FOND', 'RUB', 'WBFC', 'Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка): Купонные облигации с постоянным купоном') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (23, 'PRMR', 'FOND', 'RUB', 'ABIC', 'Размещение: Аукцион по цене', 1, 'Размещение: Аукцион по цене: Облигации с индексированным номиналом') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (24, 'PRMR', 'FOND', 'RUB', 'KBIC', 'Размещение: Аукцион по ставке', 1, 'Размещение: Аукцион по ставке: Облигации с индексированным номиналом') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (25, 'SCND', 'FOND', 'RUB', 'UBIC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Облигации с индексированным номиналом') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (26, 'SCND', 'FOND', 'RUB', 'NBIC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Облигации с индексированным номиналом') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (27, 'SCND', 'FOND', 'RUB', 'DBIC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Облигации с индексированным номиналом') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (28, 'PRMR', 'FOND', 'RUB', 'WBIC', 'Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка): Облигации с индексированным номиналом') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (29, 'PRMR', 'FOND', 'RUB', 'ABMC', 'Размещение: Аукцион по цене', 1, 'Размещение: Аукцион по цене: Облигации с амортизацией долга') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (30, 'PRMR', 'FOND', 'RUB', 'KBMC', 'Размещение: Аукцион по ставке', 1, 'Размещение: Аукцион по ставке: Облигации с амортизацией долга') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (31, 'SCND', 'FOND', 'RUB', 'UBMC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Облигации с амортизацией долга') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (32, 'SCND', 'FOND', 'RUB', 'NBMC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Облигации с амортизацией долга') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (33, 'SCND', 'FOND', 'RUB', 'DBMC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Облигации с амортизацией долга') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (34, 'PRMR', 'FOND', 'RUB', 'WBMC', 'Размещение: адресные заявки (подписка)', 1, 'Размещение: адресные заявки (подписка): Облигации с амортизацией долга') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (35, 'PRMR', 'FOND', 'RUB', 'BKVC', 'Размещение: Аукцион БР', 1, 'Размещение: Аукцион БР: Облигации Банка России с переменным купоном (КОБР)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (36, 'PRMR', 'FOND', 'RUB', 'SKVC', 'Доразмещение: Адресные заявки БР', 1, 'Доразмещение: Адресные заявки БР: Облигации Банка России с переменным купоном (КОБР)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (37, 'SCND', 'FOND', 'RUB', 'UKVC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Облигации Банка России с переменным купоном (КОБР)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (38, 'SCND', 'FOND', 'RUB', 'NKVC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Облигации Банка России с переменным купоном (КОБР)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (39, 'SCND', 'FOND', 'RUB', 'DKVC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Облигации Банка России с переменным купоном (КОБР)') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (45, 'PRMR', 'FOND', 'RUB', 'ABEC', 'Размещение: Аукцион СПВБ', 1, 'Размещение: Аукцион СПВБ: Биржевые облигации') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (46, 'SCND', 'FOND', 'RUB', 'UBEC', 'Режим непрерывных торгов', 1, 'Режим непрерывных торгов: Биржевые облигации') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (47, 'SCND', 'FOND', 'RUB', 'NBEC', 'Режим переговорных сделок (РПС)', 1, 'Режим переговорных сделок (РПС): Биржевые облигации') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (48, 'SCND', 'FOND', 'RUB', 'DBEC', 'Дискретный аукцион', 1, 'Дискретный аукцион: Биржевые облигации') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (61, 'PRMR', 'FOND', 'RUB', 'BMVC', 'ОФЗПК-Размещение: Аукцион БР', 1, 'ОФЗПК-Размещение: Аукцион БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (62, 'PRMR', 'FOND', 'RUB', 'SMVC', 'ОФЗПК-Доразмещение: Адресные заявки БР', 1, 'ОФЗПК-Доразмещение: Адресные заявки БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (63, 'SCND', 'FOND', 'RUB', 'UMVC', 'ОФЗПК-Режим непрерывных торгов', 1, 'ОФЗПК-Режим непрерывных торгов: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (64, 'SCND', 'FOND', 'RUB', 'DMVC', 'ОФЗПК-Дискретный аукцион', 1, 'ОФЗПК-Дискретный аукцион: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (65, 'SCND', 'FOND', 'RUB', 'MMVC', 'ОФЗПК-Торги в режиме выкупа', 1, 'ОФЗПК-Торги в режиме выкупа: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (66, 'PRMR', 'FOND', 'RUB', 'BMFC', 'ОФЗПД-Размещение: Аукцион БР', 1, 'ОФЗПД-Размещение: Аукцион БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (67, 'PRMR', 'FOND', 'RUB', 'SMFC', 'ОФЗПД- Доразмещение: Адресные заявки БР', 1, 'ОФЗПД- Доразмещение: Адресные заявки БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (68, 'SCND', 'FOND', 'RUB', 'UMFC', 'ОФЗПД-Режим непрерывных торгов', 1, 'ОФЗПД-Режим непрерывных торгов: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (69, 'SCND', 'FOND', 'RUB', 'DMFC', 'ОФЗПД-Дискретный аукцион', 1, 'ОФЗПД-Дискретный аукцион: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (70, 'SCND', 'FOND', 'RUB', 'MMFC', 'ОФЗПД-Торги в режиме выкупа', 1, 'ОФЗПД-Торги в режиме выкупа: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (71, 'PRMR', 'FOND', 'RUB', 'BMMC', 'ОФЗАД-Размещение: Аукцион БР', 1, 'ОФЗАД-Размещение: Аукцион БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (72, 'PRMR', 'FOND', 'RUB', 'SMMC', 'ОФЗАД-Доразмещение: Адресные заявки БР', 1, 'ОФЗАД-Доразмещение: Адресные заявки БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (73, 'SCND', 'FOND', 'RUB', 'UMMC', 'ОФЗАД-Режим непрерывных торгов', 1, 'ОФЗАД-Режим непрерывных торгов: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (74, 'SCND', 'FOND', 'RUB', 'DMMC', 'ОФЗАД-Дискретный аукцион', 1, 'ОФЗАД-Дискретный аукцион: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (75, 'SCND', 'FOND', 'RUB', 'MMMC', 'ОФЗАД-Торги в режиме выкупа', 1, 'ОФЗАД-Торги в режиме выкупа: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (76, 'PRMR', 'FOND', 'RUB', 'BMIC', 'ОФЗИН-Размещение: Аукцион БР', 1, 'ОФЗИН-Размещение: Аукцион БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (77, 'PRMR', 'FOND', 'RUB', 'SMIC', 'ОФЗИН-Доразмещение: Адресные заявки БР', 1, 'ОФЗИН-Доразмещение: Адресные заявки БР: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (78, 'SCND', 'FOND', 'RUB', 'UMIC', 'ОФЗИН-Режим непрерывных торгов', 1, 'ОФЗИН-Режим непрерывных торгов: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (79, 'SCND', 'FOND', 'RUB', 'DMIC', 'ОФЗИН-Дискретный аукцион', 1, 'ОФЗИН-Дискретный аукцион: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (80, 'SCND', 'FOND', 'RUB', 'MMIC', 'ОФЗИН-Торги в режиме выкупа', 1, 'ОФЗИН-Торги в режиме выкупа: Облигации Минфина') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (82, 'PRMR', 'FOND', 'RUB', 'BBVC', 'ОФЗ-ПК - Аукцион БР', 1, 'ОФЗ-ПК - Аукцион БР') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (83, 'PRMR', 'MKR', 'RUB', 'XMDTATSS', 'СПб ГУП АТС Смольного', 1, 'СПб ГУП АТС Смольного') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (88, 'PRMR', 'MKR', 'RUB', 'XMTTKFSP', 'Комитет финансов СПб', 1, 'Комитет финансов СПб') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (89, 'PRMR', 'MKR', 'RUB', 'XMDSKFLO', 'Комитет финансов ЛО', 1, 'Комитет финансов ЛО') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (90, 'PRMR', 'MKR', 'RUB', 'XMDTFSKB', 'ФСКМБ', 1, 'ФСКМБ') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (91, 'PRMR', 'MKR', 'RUB', 'XMDSFGGE', 'ФАУ ГГЭ', 1, 'ФАУ ГГЭ') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (92, 'PRMR', 'MKR', 'RUB', 'XMDTVRGO', 'ВВО РГО', 1, 'ВВО РГО') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (93, 'PRMR', 'MKR', 'RUB', 'XMDTTDRM', 'ООО Торговый дом РМ-Рейл', 1, 'ООО Торговый дом РМ-Рейл') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
|
|
||||||
|
INSERT INTO MARKET(ID, MARKET_TYPE, SECTION, SETTLEMENT_CURRENCY, CODE, NAME, EXCHANGE_ID, DESCRIPTION) values (95, 'PRMR', 'MKR', 'RUB', 'XMDTRKFN', 'АО РК Финанс', 1, 'АО РК Финанс') ON CONFLICT (ID) DO UPDATE SET MARKET_TYPE = EXCLUDED.MARKET_TYPE, SECTION = EXCLUDED.SECTION, SETTLEMENT_CURRENCY = EXCLUDED.SETTLEMENT_CURRENCY, CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME, EXCHANGE_ID = EXCLUDED.EXCHANGE_ID, DESCRIPTION = EXCLUDED.DESCRIPTION;
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,32 @@
|
||||||
|
-- DB version: 3.8 -> 3.9
|
||||||
|
|
||||||
|
|
||||||
|
-- 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 'Значение реквизита';
|
||||||
|
|
||||||
|
|
||||||
|
-- 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 'Значение реквизита';
|
||||||
|
|
||||||
|
|
||||||
|
INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.9') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION
|
||||||
|
|
@ -18,10 +18,7 @@ import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Выгрузка данных из мапы hazelcast и их запись в файлы
|
* Выгрузка данных из мапы hazelcast и их запись в файлы
|
||||||
|
|
@ -94,6 +91,11 @@ public class ExportFromHazelcast extends Stage implements InitializingBean {
|
||||||
log.debug("uuid {}. Selected {} records from map {}, generationId {}", resultContainer.getUuid(),
|
log.debug("uuid {}. Selected {} records from map {}, generationId {}", resultContainer.getUuid(),
|
||||||
tableRows.size(), resultContainer.getTableForExport().getHazelcastMapName(), resultContainer.getGroupId());
|
tableRows.size(), resultContainer.getTableForExport().getHazelcastMapName(), resultContainer.getGroupId());
|
||||||
}
|
}
|
||||||
|
if (Table.S_DF02 == resultContainer.getTableForExport()) {
|
||||||
|
log.trace("Sort S_DF02 items"); // Сортировка по возрастанию id, чтобы сохранить последовательность строк SDF02, как в SDF01
|
||||||
|
tableRows = new ArrayList<SpcexObjectBase>(tableRows);
|
||||||
|
((ArrayList<SpcexObjectBase>) tableRows).sort(Comparator.comparing(SpcexObjectBase::getId));
|
||||||
|
}
|
||||||
for (SpcexObjectBase value : tableRows) {
|
for (SpcexObjectBase value : tableRows) {
|
||||||
Object[] values;
|
Object[] values;
|
||||||
if (value instanceof SDf02 sDf02Value) values = s_df02_converter.toObjectArray(sDf02Value);
|
if (value instanceof SDf02 sDf02Value) values = s_df02_converter.toObjectArray(sDf02Value);
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ import org.springframework.scheduling.support.PeriodicTrigger;
|
||||||
import ru.spcex.clearing.dbf.importer.config.settings.ImportDBFServiceSettings;
|
import ru.spcex.clearing.dbf.importer.config.settings.ImportDBFServiceSettings;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
|
|
@ -60,6 +61,8 @@ public class SFTPConfig {
|
||||||
fileSync.setTemporaryFileSuffix(".tmp");
|
fileSync.setTemporaryFileSuffix(".tmp");
|
||||||
fileSync.setRemoteDirectory(settings.getStore().getSftpIn().getSftpSrcDir());
|
fileSync.setRemoteDirectory(settings.getStore().getSftpIn().getSftpSrcDir());
|
||||||
fileSync.setFilter(new AcceptAllFileListFilter<>());
|
fileSync.setFilter(new AcceptAllFileListFilter<>());
|
||||||
|
fileSync.setPreserveTimestamp(true);
|
||||||
|
fileSync.setComparator(Comparator.comparingInt(f -> f.getAttrs().getMTime()));
|
||||||
return fileSync;
|
return fileSync;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import org.springframework.stereotype.Service;
|
||||||
import ru.spcex.clearing.dbf.importer.logic.Processor;
|
import ru.spcex.clearing.dbf.importer.logic.Processor;
|
||||||
import ru.spcex.clearing.dbf.importer.logic.data.ResultContainer;
|
import ru.spcex.clearing.dbf.importer.logic.data.ResultContainer;
|
||||||
import ru.spcex.clearing.dbf.importer.logic.data.enums.ETable;
|
import ru.spcex.clearing.dbf.importer.logic.data.enums.ETable;
|
||||||
|
import ru.spcex.platform.utils.collection.Pair;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
|
@ -59,13 +60,22 @@ public class DBFImporterService {
|
||||||
} else {
|
} else {
|
||||||
log.trace("no files were found");
|
log.trace("no files were found");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Сортировка по возрастанию времени изменения - обрабатывать только в таком порядке
|
||||||
|
List<Pair<File, ETable>> orderByTimeFiles = new ArrayList<>();
|
||||||
for (Map.Entry<ETable, List<File>> newFilesEntry : newFiles.entrySet()) {
|
for (Map.Entry<ETable, List<File>> newFilesEntry : newFiles.entrySet()) {
|
||||||
ETable currTable = newFilesEntry.getKey();
|
ETable currTable = newFilesEntry.getKey();
|
||||||
List<File> fileList = newFilesEntry.getValue();
|
List<File> fileList = newFilesEntry.getValue();
|
||||||
for (File dbfFile : fileList) {
|
for (File dbfFile : fileList) {
|
||||||
processor.process(ResultContainer.createNewTask(currTable, dbfFile));
|
orderByTimeFiles.add(new Pair<>(dbfFile, currTable));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
orderByTimeFiles.sort(Comparator.comparingLong(iF -> iF.getFirst().lastModified()));
|
||||||
|
for (Pair<File, ETable> newFilesEntry : orderByTimeFiles) {
|
||||||
|
ETable currTable = newFilesEntry.getSecond();
|
||||||
|
File dbfFile = newFilesEntry.getFirst();
|
||||||
|
processor.process(ResultContainer.createNewTask(currTable, dbfFile));
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
if (newFiles != null && newFiles.size() > 0) {
|
if (newFiles != null && newFiles.size() > 0) {
|
||||||
cleanFiles(newFiles);
|
cleanFiles(newFiles);
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@ public class FileChecker {
|
||||||
|
|
||||||
List<File> resultFiles = new LinkedList<>();
|
List<File> resultFiles = new LinkedList<>();
|
||||||
if (dbfFiles != null && dbfFiles.length >= 1) {
|
if (dbfFiles != null && dbfFiles.length >= 1) {
|
||||||
|
Arrays.sort(dbfFiles, Comparator.comparingLong(File::lastModified));
|
||||||
resultFiles.addAll(Arrays.asList(dbfFiles));
|
resultFiles.addAll(Arrays.asList(dbfFiles));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.time.temporal.ChronoUnit;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static ru.spcex.clearing.imdg.base.ObjectBaseMapStore.MAX_IN_CLAUSE_SIZE;
|
import static ru.spcex.clearing.imdg.base.ObjectBaseMapStore.MAX_IN_CLAUSE_SIZE;
|
||||||
|
|
@ -77,14 +76,8 @@ public abstract class AbstractSliceMapLoader<T extends WithId> implements Autoco
|
||||||
@Override
|
@Override
|
||||||
public Iterable<Long> loadAllKeys() {
|
public Iterable<Long> loadAllKeys() {
|
||||||
log.debug("loading all keys from {}...", getTableName());
|
log.debug("loading all keys from {}...", getTableName());
|
||||||
LocalDate yesterdayInstant = LocalDate.now().minus(0, ChronoUnit.DAYS);
|
List<Long> ids = jdbcTemplate.query("select id from " + getTableName(),
|
||||||
// Instant yesterdayInstant = Instant.now().minus(0, ChronoUnit.DAYS);
|
(resultSet, i) -> resultSet.getLong("id"));
|
||||||
LocalDate fewDaysAgo = yesterdayInstant.minus(2, ChronoUnit.DAYS);
|
|
||||||
String fieldOfDay = fieldOfDay();
|
|
||||||
List<Long> ids = jdbcTemplate.query("select id from " + getTableName() + " where " + fieldOfDay + " <= ? " +
|
|
||||||
"and " + fieldOfDay + " >= ? ",
|
|
||||||
(resultSet, i) -> resultSet.getLong("id"),
|
|
||||||
yesterdayInstant, fewDaysAgo);
|
|
||||||
log.debug("loading all keys from {} done; size={}", getTableName(), ids.size());
|
log.debug("loading all keys from {} done; size={}", getTableName(), ids.size());
|
||||||
return ids;
|
return ids;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,11 @@
|
||||||
package ru.spcex.clearing.imdg.base;
|
package ru.spcex.clearing.imdg.base;
|
||||||
|
|
||||||
|
import com.hazelcast.config.MapIndexConfig;
|
||||||
import com.hazelcast.core.MapLoader;
|
import com.hazelcast.core.MapLoader;
|
||||||
|
|
||||||
public interface AutoconfiguredMap<T> extends MapLoader<Long, T> {
|
public interface AutoconfiguredMap<T> extends MapLoader<Long, T> {
|
||||||
|
MapIndexConfig[] emptyIndexes = new MapIndexConfig[0];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @return IMDGDistributedNames.*
|
* @return IMDGDistributedNames.*
|
||||||
|
|
@ -14,4 +17,8 @@ public interface AutoconfiguredMap<T> extends MapLoader<Long, T> {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
String[] getIndexingField();
|
String[] getIndexingField();
|
||||||
|
|
||||||
|
default MapIndexConfig[] getIndexes() {
|
||||||
|
return emptyIndexes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,22 +18,22 @@ public abstract class TemplateEventMapStore<T extends BusinessEvent<? extends Sp
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final Iterable<Long> loadAllKeys() {
|
public Iterable<Long> loadAllKeys() {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final T load(Long id) {
|
public T load(Long id) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final Collection<T> load(Collection<Long> keys) {
|
public Collection<T> load(Collection<Long> keys) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final Map<Long, T> loadAll(Collection<Long> keys) {
|
public Map<Long, T> loadAll(Collection<Long> keys) {
|
||||||
return Collections.emptyMap();
|
return Collections.emptyMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
package ru.spcex.clearing.imdg.businessevent;
|
||||||
|
|
||||||
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.clearing.classes.statics.data.account.AccountSymbols;
|
||||||
|
import ru.clearing.classes.statics.data.account.AccountSymbolsHistory;
|
||||||
|
import ru.spcex.clearing.imdg.base.TemplateEventMapStore;
|
||||||
|
import ru.spcex.platform.utils.time.TimeUtil;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class AccountSymbolsHistoryMapStore extends TemplateEventMapStore<AccountSymbolsHistory> {
|
||||||
|
|
||||||
|
public AccountSymbolsHistoryMapStore(JdbcTemplate jdbcTemplate) {
|
||||||
|
super(jdbcTemplate);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMapName() {
|
||||||
|
return IMDGDistributedNames.Map_AccountSymbolsHistory;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTableName() {
|
||||||
|
return "ACCOUNT_SYMBOLS_HISTORY";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] getFields() {
|
||||||
|
return new String[]{"ID", "EVENT_TIME", "EVENT_USER_ID", "EVENT_TYPE",
|
||||||
|
"ACCOUNT_SYMBOLS_ID", "ACCOUNT_ID", "ACCOUNT_SYMBOL_VALUE"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object[] objectToField(AccountSymbolsHistory historyLog) {
|
||||||
|
AccountSymbols object = historyLog.getObject();
|
||||||
|
Object[] args = new Object[]{
|
||||||
|
historyLog.getId(),
|
||||||
|
TimeUtil.toDateFromInstant(historyLog.getEventTime()),
|
||||||
|
historyLog.getUserId(),
|
||||||
|
historyLog.getEventType(),
|
||||||
|
|
||||||
|
object.getId(),
|
||||||
|
object.getAccountId(),
|
||||||
|
object.getAccountSymbolValue()
|
||||||
|
};
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package ru.spcex.clearing.imdg.businessevent;
|
package ru.spcex.clearing.imdg.businessevent;
|
||||||
|
|
||||||
|
import org.springframework.dao.support.DataAccessUtils;
|
||||||
import org.springframework.jdbc.core.JdbcTemplate;
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import ru.clearing.classes.statics.data.registry.Registry;
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
|
|
@ -8,6 +9,11 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.imdg.base.TemplateEventMapStore;
|
import ru.spcex.clearing.imdg.base.TemplateEventMapStore;
|
||||||
import ru.spcex.platform.utils.time.TimeUtil;
|
import ru.spcex.platform.utils.time.TimeUtil;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class RegistryHistoryMapStore extends TemplateEventMapStore<RegistryHistory> {
|
public class RegistryHistoryMapStore extends TemplateEventMapStore<RegistryHistory> {
|
||||||
|
|
||||||
|
|
@ -15,23 +21,154 @@ public class RegistryHistoryMapStore extends TemplateEventMapStore<RegistryHisto
|
||||||
super(jdbcTemplate);
|
super(jdbcTemplate);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getMapName() {
|
|
||||||
return IMDGDistributedNames.Map_RegistryHistory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getTableName() {
|
public String getTableName() {
|
||||||
return "REGISTRY_HISTORY";
|
return "REGISTRY_HISTORY";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMapName() {
|
||||||
|
return IMDGDistributedNames.Map_RegistryHistory;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String[] getFields() {
|
public String[] getFields() {
|
||||||
return new String[]{"ID", "EVENT_TIME", "EVENT_USER_ID", "EVENT_TYPE",
|
return new String[]{
|
||||||
"REGISTRY_ID", "CREATED_AT", "UPDATED_AT", "COMPANY_ID", "TRADING_CODE", "CLEARING_CODE", "SHORT_NAME", "FULL_NAME", "ACCOUNT_ID", "ACCOUNT_TYPE", "ACCOUNT", "REGISTRY_DESIGNATION", "REGISTRY_INSTRUMENT_TYPE", "REGISTRY_CAPACITY", "REGISTRY_UNIT", "REGISTRY_CODE", "TRADING_CLEARING_REGISTRY_ID", "TRADING_CLEARING_REGISTRY", "REGISTRY_STATUS", "SECURITY_ID", "SECURITY_SYMBOL", "BALANCE", "OPEN_BALANCE", "CLOSE_BALANCE", "CREDIT", "DEBIT", "SETTLED_CREDIT", "SETTLED_DEBIT", "CHECK_BALANCE", "DIFF_BALANCE", "PLAN_BALANCE", "BALANCE_DIMENSION", "SETTLEMENT_DATE", "SETTLEMENT_CODE", "TRADING_DATE", "CLEARING_DATE", "REFUND_DATE", "VALUE_DATE", "PRICE", "CONTRACT", "COUNTER_PARTY_ID", "COMMENT", "PARENT_ID", "GROUP_ID", "SESSION_ID", "SESSION_TYPE", "PAYMENT_ID"
|
"ID", "EVENT_TIME", "EVENT_USER_ID", "EVENT_TYPE", "REGISTRY_ID", "CREATED_AT", "UPDATED_AT",
|
||||||
|
"COMPANY_ID", "TRADING_CODE", "CLEARING_CODE", "SHORT_NAME", "FULL_NAME", "ACCOUNT_ID",
|
||||||
|
"ACCOUNT_TYPE", "ACCOUNT", "REGISTRY_DESIGNATION", "REGISTRY_INSTRUMENT_TYPE", "REGISTRY_CAPACITY",
|
||||||
|
"REGISTRY_UNIT", "REGISTRY_CODE", "TRADING_CLEARING_REGISTRY_ID", "TRADING_CLEARING_REGISTRY",
|
||||||
|
"REGISTRY_STATUS", "SECURITY_ID", "SECURITY_SYMBOL", "BALANCE", "OPEN_BALANCE", "CLOSE_BALANCE",
|
||||||
|
"CREDIT", "DEBIT", "SETTLED_CREDIT", "SETTLED_DEBIT", "CHECK_BALANCE", "DIFF_BALANCE", "PLAN_BALANCE",
|
||||||
|
"BALANCE_DIMENSION", "SETTLEMENT_DATE", "SETTLEMENT_CODE", "TRADING_DATE", "CLEARING_DATE", "REFUND_DATE",
|
||||||
|
"VALUE_DATE", "PRICE", "CONTRACT", "COUNTER_PARTY_ID", "COMMENT", "PARENT_ID", "GROUP_ID", "SESSION_ID",
|
||||||
|
"SESSION_TYPE", "PAYMENT_ID"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<Long> loadAllKeys() {
|
||||||
|
return defaultLoadAllKeysOnTodayByField("EVENT_TIME", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RegistryHistory load(Long id) {
|
||||||
|
if (!isLoadable(id)) return null;
|
||||||
|
Collection<RegistryHistory> rows;
|
||||||
|
List<Long> list = Collections.singletonList(id);
|
||||||
|
try {
|
||||||
|
rows = load(list);
|
||||||
|
} catch (Throwable e) { // one retry
|
||||||
|
rows = load(list);
|
||||||
|
}
|
||||||
|
RegistryHistory obj = DataAccessUtils.singleResult(rows);
|
||||||
|
if (obj != null && isLoadable(obj))
|
||||||
|
return obj;
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<Long, RegistryHistory> loadAll(Collection<Long> keys) {
|
||||||
|
log.debug("loadAll from " + getTableName() + " " + keys.size() + " keys");
|
||||||
|
Map<Long, RegistryHistory> result = new HashMap<>();
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
|
||||||
|
// загрузить данные по ключам частями, чтобы не выйти за ограничения базы по кол-ву элементов в in clause
|
||||||
|
List<Long> keysSubList = new ArrayList<>(MAX_IN_CLAUSE_SIZE);
|
||||||
|
for (Iterator<Long> iterator = keys.iterator(); iterator.hasNext(); ) {
|
||||||
|
Long key = iterator.next();
|
||||||
|
keysSubList.add(key);
|
||||||
|
if (keysSubList.size() == MAX_IN_CLAUSE_SIZE || !iterator.hasNext()) {
|
||||||
|
Collection<RegistryHistory> rows = load(keysSubList);
|
||||||
|
for (RegistryHistory row : rows) {
|
||||||
|
result.put(row.getId(), row);
|
||||||
|
}
|
||||||
|
keysSubList.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.debug("loadAll from " + getTableName() + " " + keys.size() + " keys done in " + (System.currentTimeMillis() - start) + "ms");
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<RegistryHistory> load(Collection<Long> keys) {
|
||||||
|
Map<String, Collection<Long>> paramMap = Collections.singletonMap("ids", keys);
|
||||||
|
return namedParameterJdbcTemplate.query("select * from " + getTableName() + " where id in (:ids)", paramMap,
|
||||||
|
(resultSet, i) -> objectReader(resultSet));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RegistryHistory objectReader(ResultSet resultSet) throws SQLException {
|
||||||
|
RegistryHistory registryHistory = new RegistryHistory();
|
||||||
|
Registry object = new Registry();
|
||||||
|
|
||||||
|
registryHistory.setId(resultSet.getObject("ID", Long.class));
|
||||||
|
registryHistory.setEventTime(getInstantFromTimestamp(resultSet, "EVENT_TIME"));
|
||||||
|
registryHistory.setUserId(resultSet.getObject("EVENT_USER_ID", Long.class));
|
||||||
|
registryHistory.setEventType(resultSet.getObject("EVENT_TYPE", String.class));
|
||||||
|
|
||||||
|
object.setCreated(getInstantFromTimestamp(resultSet, "CREATED_AT"));
|
||||||
|
object.setUpdated(getInstantFromTimestamp(resultSet, "UPDATED_AT"));
|
||||||
|
|
||||||
|
object.setId(resultSet.getObject("REGISTRY_ID", Long.class));
|
||||||
|
object.setCompanyId(resultSet.getObject("COMPANY_ID", Long.class));
|
||||||
|
object.setTradingCode(resultSet.getObject("TRADING_CODE", String.class));
|
||||||
|
object.setClearingCode(resultSet.getObject("CLEARING_CODE", String.class));
|
||||||
|
object.setShortName(resultSet.getObject("SHORT_NAME", String.class));
|
||||||
|
object.setFullName(resultSet.getObject("FULL_NAME", String.class));
|
||||||
|
object.setAccountId(resultSet.getObject("ACCOUNT_ID", Long.class));
|
||||||
|
|
||||||
|
object.setAccountType(resultSet.getObject("ACCOUNT_TYPE", String.class));
|
||||||
|
object.setAccount(resultSet.getObject("ACCOUNT", String.class));
|
||||||
|
object.setRegistryDesignation(resultSet.getObject("REGISTRY_DESIGNATION", String.class));
|
||||||
|
object.setRegistryInstrumentType(resultSet.getObject("REGISTRY_INSTRUMENT_TYPE", String.class));
|
||||||
|
object.setRegistryCapacity(resultSet.getObject("REGISTRY_CAPACITY", String.class));
|
||||||
|
|
||||||
|
object.setRegistryUnit(resultSet.getObject("REGISTRY_UNIT", String.class));
|
||||||
|
object.setRegistryCode(resultSet.getObject("REGISTRY_CODE", String.class));
|
||||||
|
object.setTradingClearingRegistryId(resultSet.getObject("TRADING_CLEARING_REGISTRY_ID", Long.class));
|
||||||
|
object.setTradingClearingRegistry(resultSet.getObject("TRADING_CLEARING_REGISTRY", String.class));
|
||||||
|
|
||||||
|
object.setRegistryStatus(resultSet.getObject("REGISTRY_STATUS", String.class));
|
||||||
|
object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class));
|
||||||
|
object.setSecuritySymbol(resultSet.getObject("SECURITY_SYMBOL", String.class));
|
||||||
|
object.setBalance(resultSet.getObject("BALANCE", BigDecimal.class));
|
||||||
|
object.setOpenBalance(resultSet.getObject("OPEN_BALANCE", BigDecimal.class));
|
||||||
|
object.setCloseBalance(resultSet.getObject("CLOSE_BALANCE", BigDecimal.class));
|
||||||
|
|
||||||
|
object.setCredit(resultSet.getObject("CREDIT", BigDecimal.class));
|
||||||
|
object.setDebit(resultSet.getObject("DEBIT", BigDecimal.class));
|
||||||
|
object.setSettledCredit(resultSet.getObject("SETTLED_CREDIT", BigDecimal.class));
|
||||||
|
object.setSettledDebit(resultSet.getObject("SETTLED_DEBIT", BigDecimal.class));
|
||||||
|
object.setCheckBalance(resultSet.getObject("CHECK_BALANCE", BigDecimal.class));
|
||||||
|
object.setDiffBalance(resultSet.getObject("DIFF_BALANCE", BigDecimal.class));
|
||||||
|
object.setPlanBalance(resultSet.getObject("PLAN_BALANCE", BigDecimal.class));
|
||||||
|
|
||||||
|
object.setBalanceDimension(resultSet.getObject("BALANCE_DIMENSION", String.class));
|
||||||
|
object.setSettlementDate(getLocalDateFromSqlDate(resultSet, "SETTLEMENT_DATE"));
|
||||||
|
object.setSettlementCode(resultSet.getObject("SETTLEMENT_CODE", String.class));
|
||||||
|
object.setTradingDate(getLocalDateFromSqlDate(resultSet, "TRADING_DATE"));
|
||||||
|
object.setClearingDate(getLocalDateFromSqlDate(resultSet, "CLEARING_DATE"));
|
||||||
|
object.setRefundDate(getLocalDateFromSqlDate(resultSet, "REFUND_DATE"));
|
||||||
|
|
||||||
|
object.setValueDate(getLocalDateFromSqlDate(resultSet, "VALUE_DATE"));
|
||||||
|
object.setPrice(resultSet.getObject("PRICE", BigDecimal.class));
|
||||||
|
object.setContract(resultSet.getObject("CONTRACT", String.class));
|
||||||
|
object.setCounterPartyId(resultSet.getObject("COUNTER_PARTY_ID", Long.class));
|
||||||
|
object.setComment(resultSet.getObject("COMMENT", String.class));
|
||||||
|
object.setParentId(resultSet.getObject("PARENT_ID", Long.class));
|
||||||
|
object.setGroupId(resultSet.getObject("GROUP_ID", Long.class));
|
||||||
|
object.setSessionId(resultSet.getObject("SESSION_ID", Long.class));
|
||||||
|
|
||||||
|
object.setSessionType(resultSet.getObject("SESSION_TYPE", String.class));
|
||||||
|
object.setPaymentId(resultSet.getObject("PAYMENT_ID", Long.class));
|
||||||
|
|
||||||
|
registryHistory.setObject(object);
|
||||||
|
return registryHistory;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object[] objectToField(RegistryHistory historyLog) {
|
public Object[] objectToField(RegistryHistory historyLog) {
|
||||||
Registry object = historyLog.getObject();
|
Registry object = historyLog.getObject();
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
package ru.spcex.clearing.imdg.businessobject;
|
||||||
|
|
||||||
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.clearing.classes.statics.data.account.AccountSymbols;
|
||||||
|
import ru.spcex.clearing.imdg.base.TemplateMapStore;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class AccountSymbolsMapStore extends TemplateMapStore<AccountSymbols> {
|
||||||
|
|
||||||
|
public AccountSymbolsMapStore(JdbcTemplate jdbcTemplate) {
|
||||||
|
super(jdbcTemplate);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMapName() {
|
||||||
|
return IMDGDistributedNames.Map_AccountSymbols;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTableName() {
|
||||||
|
return "ACCOUNT_SYMBOLS";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] getFields() {
|
||||||
|
return new String[]{
|
||||||
|
"ID", "ACCOUNT_ID", "ACCOUNT_SYMBOL_VALUE"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AccountSymbols objectReader(ResultSet resultSet) throws SQLException {
|
||||||
|
AccountSymbols object = new AccountSymbols();
|
||||||
|
object.setId(resultSet.getObject("ID", Long.class));
|
||||||
|
object.setAccountId(resultSet.getObject("ACCOUNT_ID", Long.class));
|
||||||
|
object.setAccountSymbolValue(resultSet.getObject("ACCOUNT_SYMBOL_VALUE", String.class));
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object[] objectToField(AccountSymbols object) {
|
||||||
|
Object[] args = new Object[]{
|
||||||
|
object.getId(),
|
||||||
|
object.getAccountId(),
|
||||||
|
object.getAccountSymbolValue()
|
||||||
|
};
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package ru.spcex.clearing.imdg.businessobject;
|
package ru.spcex.clearing.imdg.businessobject;
|
||||||
|
|
||||||
|
import com.hazelcast.config.MapIndexConfig;
|
||||||
import org.apache.commons.lang3.exception.ExceptionUtils;
|
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||||
import org.springframework.jdbc.core.JdbcTemplate;
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
@ -12,13 +13,23 @@ import java.math.BigDecimal;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.*;
|
import java.util.List;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class RegistryMapStore extends TemplateMapStore<Registry> {
|
public class RegistryMapStore extends TemplateMapStore<Registry> {
|
||||||
|
|
||||||
|
private final MapIndexConfig[] indexes;
|
||||||
|
|
||||||
public RegistryMapStore(JdbcTemplate jdbcTemplate) {
|
public RegistryMapStore(JdbcTemplate jdbcTemplate) {
|
||||||
super(jdbcTemplate);
|
super(jdbcTemplate);
|
||||||
|
indexes = new MapIndexConfig[] {
|
||||||
|
new MapIndexConfig().setAttribute("sessionId").setOrdered(false),
|
||||||
|
new MapIndexConfig().setAttribute("tradingClearingRegistryId").setOrdered(false),
|
||||||
|
new MapIndexConfig().setAttribute("companyId").setOrdered(false),
|
||||||
|
new MapIndexConfig().setAttribute("accountId").setOrdered(false),
|
||||||
|
new MapIndexConfig().setAttribute("settlementDate").setOrdered(false),
|
||||||
|
new MapIndexConfig().setAttribute("groupId").setOrdered(false),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -32,8 +43,8 @@ public class RegistryMapStore extends TemplateMapStore<Registry> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String[] getIndexingField() {
|
public MapIndexConfig[] getIndexes() {
|
||||||
return new String[]{"sessionId"};
|
return indexes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -41,9 +41,9 @@ public class DbConnectionConfig {
|
||||||
cpds.setJdbcUrl(dbPath);
|
cpds.setJdbcUrl(dbPath);
|
||||||
cpds.setUser(login);
|
cpds.setUser(login);
|
||||||
cpds.setPassword(password);
|
cpds.setPassword(password);
|
||||||
cpds.setInitialPoolSize(10);
|
cpds.setInitialPoolSize(settings.getMinPoolSize());
|
||||||
cpds.setMinPoolSize(10);
|
cpds.setMinPoolSize(settings.getMinPoolSize());
|
||||||
cpds.setMaxPoolSize(30);
|
cpds.setMaxPoolSize(settings.getMaxPoolSize());
|
||||||
int numHelperThreads = Runtime.getRuntime().availableProcessors() * 2;
|
int numHelperThreads = Runtime.getRuntime().availableProcessors() * 2;
|
||||||
cpds.setNumHelperThreads(numHelperThreads);
|
cpds.setNumHelperThreads(numHelperThreads);
|
||||||
cpds.setCheckoutTimeout(timeoutSec * 1000);
|
cpds.setCheckoutTimeout(timeoutSec * 1000);
|
||||||
|
|
|
||||||
|
|
@ -32,11 +32,12 @@ public class HazelcastConfiguration {
|
||||||
@Bean
|
@Bean
|
||||||
public Config hazelCastConfig() {
|
public Config hazelCastConfig() {
|
||||||
Config config = new Config();
|
Config config = new Config();
|
||||||
config.setInstanceName("instance");
|
config.setInstanceName(hzSettings.getInstanceName());
|
||||||
config.setGroupConfig(new GroupConfig()
|
config.setGroupConfig(new GroupConfig()
|
||||||
.setName(hzSettings.getLogin())
|
.setName(hzSettings.getLogin())
|
||||||
.setPassword(hzSettings.getPassword())
|
.setPassword(hzSettings.getPassword())
|
||||||
);
|
);
|
||||||
|
config.setManagementCenterConfig(new ManagementCenterConfig().setEnabled(false));
|
||||||
config.setProperty("hazelcast.shutdownhook.enabled", "true");
|
config.setProperty("hazelcast.shutdownhook.enabled", "true");
|
||||||
config.setProperty("hazelcast.logging.type", "slf4j");
|
config.setProperty("hazelcast.logging.type", "slf4j");
|
||||||
config.setProperty("hazelcast.operation.call.timeout.millis", "600000");
|
config.setProperty("hazelcast.operation.call.timeout.millis", "600000");
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ public class PoolMapConfigs implements InitializingBean {
|
||||||
private MapStoreConfig makeDefaultMapStoreConfig(MapLoader<Long, ?> mapBean) {
|
private MapStoreConfig makeDefaultMapStoreConfig(MapLoader<Long, ?> mapBean) {
|
||||||
return new MapStoreConfig()
|
return new MapStoreConfig()
|
||||||
.setImplementation(mapBean)
|
.setImplementation(mapBean)
|
||||||
;//todo config: .setWriteDelaySeconds(configRoot.getIMDG().getDbSyncSeconds());
|
.setWriteDelaySeconds(settings.getHazelcast().getDbSyncSeconds());
|
||||||
}
|
}
|
||||||
|
|
||||||
public ScheduledExecutorConfig makeDefaultScheduledExecutorConfig(String name) {
|
public ScheduledExecutorConfig makeDefaultScheduledExecutorConfig(String name) {
|
||||||
|
|
@ -112,7 +112,14 @@ public class PoolMapConfigs implements InitializingBean {
|
||||||
}
|
}
|
||||||
existMapStores.add(mapStore.getMapName()); // IMDGDistributedNames
|
existMapStores.add(mapStore.getMapName()); // IMDGDistributedNames
|
||||||
MapConfig mapCfg = makeDefaultMapConfig(mapStore.getMapName(), mapStore);
|
MapConfig mapCfg = makeDefaultMapConfig(mapStore.getMapName(), mapStore);
|
||||||
if (mapStore.getIndexingField() != null && mapStore.getIndexingField().length > 0) {
|
if (mapStore.getIndexes().length > 0) {
|
||||||
|
if (log.isTraceEnabled()) {
|
||||||
|
log.trace("Create indexing filed on {}: {}", mapStore.getMapName(), Arrays.toString(mapStore.getIndexes()));
|
||||||
|
}
|
||||||
|
for (MapIndexConfig index : mapStore.getIndexes()) {
|
||||||
|
mapCfg.addMapIndexConfig(index);
|
||||||
|
}
|
||||||
|
} else if (mapStore.getIndexingField() != null && mapStore.getIndexingField().length > 0) {
|
||||||
if (log.isTraceEnabled()) {
|
if (log.isTraceEnabled()) {
|
||||||
log.trace("Create indexing filed on {}: {}", mapStore.getMapName(), Arrays.toString(mapStore.getIndexingField()));
|
log.trace("Create indexing filed on {}: {}", mapStore.getMapName(), Arrays.toString(mapStore.getIndexingField()));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ public class DatabaseSettings {
|
||||||
private String login;
|
private String login;
|
||||||
private String password;
|
private String password;
|
||||||
private String url;
|
private String url;
|
||||||
|
private int minPoolSize = 10;
|
||||||
|
private int maxPoolSize = 30;
|
||||||
|
|
||||||
public String getLogin() {
|
public String getLogin() {
|
||||||
return login;
|
return login;
|
||||||
|
|
@ -28,4 +30,20 @@ public class DatabaseSettings {
|
||||||
public void setUrl(String url) {
|
public void setUrl(String url) {
|
||||||
this.url = url;
|
this.url = url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getMaxPoolSize() {
|
||||||
|
return maxPoolSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxPoolSize(int maxPoolSize) {
|
||||||
|
this.maxPoolSize = maxPoolSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getMinPoolSize() {
|
||||||
|
return minPoolSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMinPoolSize(int minPoolSize) {
|
||||||
|
this.minPoolSize = minPoolSize;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,8 @@ public class HazelcastServerSettings {
|
||||||
private String password;
|
private String password;
|
||||||
private List<String> clusterMembers;
|
private List<String> clusterMembers;
|
||||||
private Integer backupCount;
|
private Integer backupCount;
|
||||||
|
private String instanceName = "instance";
|
||||||
|
private Integer dbSyncSeconds = 10;
|
||||||
|
|
||||||
public int getListenPort() {
|
public int getListenPort() {
|
||||||
return listenPort;
|
return listenPort;
|
||||||
|
|
@ -49,4 +51,20 @@ public class HazelcastServerSettings {
|
||||||
public void setBackupCount(Integer backupCount) {
|
public void setBackupCount(Integer backupCount) {
|
||||||
this.backupCount = backupCount;
|
this.backupCount = backupCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getInstanceName() {
|
||||||
|
return instanceName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInstanceName(String instanceName) {
|
||||||
|
this.instanceName = instanceName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getDbSyncSeconds() {
|
||||||
|
return dbSyncSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDbSyncSeconds(Integer dbSyncSeconds) {
|
||||||
|
this.dbSyncSeconds = dbSyncSeconds;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package ru.spcex.clearing.imdg.object;
|
package ru.spcex.clearing.imdg.object;
|
||||||
|
|
||||||
import org.springframework.jdbc.core.JdbcTemplate;
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import ru.clearing.classes.statics.data.scheduler.PlannerAllToday;
|
import ru.clearing.classes.statics.data.scheduler.PlannerAllToday;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.imdg.base.TemplateMapStore;
|
import ru.spcex.clearing.imdg.base.TemplateMapStore;
|
||||||
|
|
@ -9,9 +8,11 @@ import ru.spcex.platform.utils.time.TimeUtil;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.time.LocalTime;
|
|
||||||
|
|
||||||
@Component
|
/**
|
||||||
|
* Не требуется сторить в базу и поднимать из нее значения
|
||||||
|
*/
|
||||||
|
//@Component
|
||||||
public class PlannerAllTodayMapStore extends TemplateMapStore<PlannerAllToday> {
|
public class PlannerAllTodayMapStore extends TemplateMapStore<PlannerAllToday> {
|
||||||
|
|
||||||
public PlannerAllTodayMapStore(JdbcTemplate jdbcTemplate) {
|
public PlannerAllTodayMapStore(JdbcTemplate jdbcTemplate) {
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,6 @@ package ru.spcex.clearing.imdg.services;
|
||||||
|
|
||||||
import com.hazelcast.core.HazelcastInstance;
|
import com.hazelcast.core.HazelcastInstance;
|
||||||
import com.hazelcast.core.IMap;
|
import com.hazelcast.core.IMap;
|
||||||
import com.hazelcast.query.Predicate;
|
|
||||||
import com.hazelcast.query.Predicates;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
@ -13,15 +11,21 @@ import ru.clearing.classes.statics.data.scheduler.ClearingCalendar;
|
||||||
import ru.clearing.classes.statics.data.scheduler.Planner;
|
import ru.clearing.classes.statics.data.scheduler.Planner;
|
||||||
import ru.clearing.classes.statics.data.scheduler.PlannerAllToday;
|
import ru.clearing.classes.statics.data.scheduler.PlannerAllToday;
|
||||||
import ru.clearing.classes.statics.data.scheduler.PlannerTemplate;
|
import ru.clearing.classes.statics.data.scheduler.PlannerTemplate;
|
||||||
|
import ru.spcex.clearing.scheduler.ISchedulerChecker;
|
||||||
import ru.spcex.clearing.scheduler.PlannerAllTodayBuilder;
|
import ru.spcex.clearing.scheduler.PlannerAllTodayBuilder;
|
||||||
import ru.spcex.platform.enumeration.Status;
|
import ru.spcex.platform.enumeration.Status;
|
||||||
|
|
||||||
import java.time.DayOfWeek;
|
import java.time.DayOfWeek;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
import static ru.spcex.clearing.imdg.IMDGDistributedNames.*;
|
import static ru.spcex.clearing.imdg.IMDGDistributedNames.*;
|
||||||
import static ru.spcex.clearing.scheduler.ISchedulerChecker.*;
|
import static ru.spcex.clearing.scheduler.ISchedulerChecker.isValidPlanner;
|
||||||
|
import static ru.spcex.clearing.scheduler.ISchedulerChecker.needRemoveByPlanner;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class PlannerAllTodayMaker {
|
public class PlannerAllTodayMaker {
|
||||||
|
|
@ -43,9 +47,8 @@ public class PlannerAllTodayMaker {
|
||||||
|
|
||||||
public void makeSchedulerAllTodayMap() {
|
public void makeSchedulerAllTodayMap() {
|
||||||
LocalDate currentDate = LocalDate.now();
|
LocalDate currentDate = LocalDate.now();
|
||||||
List<PlannerAllToday> listOfPlannerAllToday = new ArrayList<>();
|
|
||||||
|
|
||||||
if (!plannerMap.isEmpty()) listOfPlannerAllToday.addAll(getPlannersAllTodayToDate(currentDate));
|
List<PlannerAllToday> listOfPlannerAllToday = getPlannersAllTodayToDate(currentDate);
|
||||||
log.info("For today find {} plannerTemplates satisfying rules", listOfPlannerAllToday.size());
|
log.info("For today find {} plannerTemplates satisfying rules", listOfPlannerAllToday.size());
|
||||||
|
|
||||||
plannerMap.values().stream()
|
plannerMap.values().stream()
|
||||||
|
|
@ -58,9 +61,7 @@ public class PlannerAllTodayMaker {
|
||||||
listOfPlannerAllToday.removeIf((allToday) -> needRemoveByPlanner(planner, allToday));
|
listOfPlannerAllToday.removeIf((allToday) -> needRemoveByPlanner(planner, allToday));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
listOfPlannerAllToday.stream()
|
listOfPlannerAllToday
|
||||||
.filter(plannerAllToday -> null == getFirstObjectByFieldValues(Map.of(
|
|
||||||
"parentId", plannerAllToday.getParentId())))
|
|
||||||
.forEach(plannerAllToday -> {
|
.forEach(plannerAllToday -> {
|
||||||
plannerAllToday.setId(hazelcastInstance.getIdGenerator(MAP_SEQUENCE_NAME).newId());
|
plannerAllToday.setId(hazelcastInstance.getIdGenerator(MAP_SEQUENCE_NAME).newId());
|
||||||
plannerAllTodayMap.put(plannerAllToday.getId(), plannerAllToday);
|
plannerAllTodayMap.put(plannerAllToday.getId(), plannerAllToday);
|
||||||
|
|
@ -68,46 +69,25 @@ public class PlannerAllTodayMaker {
|
||||||
log.info("Created {} plannerAllTodays", plannerAllTodayMap.size());
|
log.info("Created {} plannerAllTodays", plannerAllTodayMap.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
private PlannerAllToday getFirstObjectByFieldValues(Map<String, ? extends Comparable<?>> conditions) {
|
|
||||||
Predicate<Long, ?>[] predicates = new Predicate[conditions.size()];
|
|
||||||
final int[] i = {0};
|
|
||||||
conditions.forEach((key, value) -> {
|
|
||||||
predicates[i[0]] = Predicates.equal(key, value);
|
|
||||||
i[0]++;
|
|
||||||
});
|
|
||||||
Predicate<Long, PlannerAllToday> and = Predicates.and(predicates);
|
|
||||||
Set<Map.Entry<Long, PlannerAllToday>> found = plannerAllTodayMap.entrySet(and);
|
|
||||||
Iterator<Map.Entry<Long, PlannerAllToday>> allFoundByCondition = found.iterator();
|
|
||||||
if (allFoundByCondition.hasNext()) {
|
|
||||||
return allFoundByCondition.next().getValue();
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<PlannerAllToday> getPlannersAllTodayToDate(LocalDate currentDate) {
|
private List<PlannerAllToday> getPlannersAllTodayToDate(LocalDate currentDate) {
|
||||||
List<PlannerAllToday> res = new ArrayList<>();
|
List<PlannerAllToday> res = new ArrayList<>();
|
||||||
|
Optional<ClearingCalendar> clearingCalendarOnDate = clearingCalendarMap.values().stream()
|
||||||
|
.filter((calendar) -> calendar.getClearingDate() != null && calendar.getClearingDate().isEqual(currentDate))
|
||||||
|
.findFirst();
|
||||||
|
|
||||||
if (needAddFromPlannerTemplate(currentDate, clearingCalendarMap.values())) {
|
if (needAddFromPlannerTemplate(currentDate, clearingCalendarOnDate)) {
|
||||||
plannerTemplateMap.values().stream().filter(plannerTemplate -> Status.Active.equalsByKey(plannerTemplate.getTaskStatus()))
|
AtomicReference<Long> companyId = new AtomicReference<>();
|
||||||
|
clearingCalendarOnDate.ifPresent(clearingCalendar -> companyId.set(clearingCalendar.getCompanyId()));
|
||||||
|
plannerTemplateMap.values().stream().filter(
|
||||||
|
plannerTemplate -> Status.Active.equalsByKey(plannerTemplate.getTaskStatus()) &&
|
||||||
|
(companyId.get() == null || companyId.get().equals(plannerTemplate.getCompanyId())))
|
||||||
.forEach(plannerTemplate -> res.add(PlannerAllTodayBuilder.builder().append(plannerTemplate).build()));
|
.forEach(plannerTemplate -> res.add(PlannerAllTodayBuilder.builder().append(plannerTemplate).build()));
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean needAddFromPlannerTemplate(LocalDate currentDate, Collection<ClearingCalendar> clearingCalendar) {
|
public boolean needAddFromPlannerTemplate(LocalDate currentDate, Optional<ClearingCalendar> clearingCalendar) {
|
||||||
boolean isWeekend = Arrays.asList(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY).contains(currentDate.getDayOfWeek());
|
boolean isWorkDay = !Arrays.asList(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY).contains(currentDate.getDayOfWeek());
|
||||||
|
return clearingCalendar.map(ISchedulerChecker::isWorkDayByTradingCalendar).orElse(isWorkDay);
|
||||||
if (clearingCalendar == null || clearingCalendar.isEmpty()) {
|
|
||||||
return !isWeekend;
|
|
||||||
} else {
|
|
||||||
Optional<ClearingCalendar> clearingCalendarOptional = clearingCalendar.stream()
|
|
||||||
.filter((calendar) -> calendar.getClearingDate() != null && calendar.getClearingDate().isEqual(currentDate))
|
|
||||||
.findFirst();
|
|
||||||
if (clearingCalendarOptional.isPresent()) {
|
|
||||||
ClearingCalendar calendar = clearingCalendarOptional.get();
|
|
||||||
return isValidWorkday(calendar, isWeekend);
|
|
||||||
} else return !isWeekend;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -73,6 +73,7 @@ public class UpdateMapService extends AbstractUpdateMapService {
|
||||||
hazelcastServerInstance.getMap(IMDGDistributedNames.Map_Registry).addLocalEntryListener(this, Predicates.alwaysTrue(), true);
|
hazelcastServerInstance.getMap(IMDGDistributedNames.Map_Registry).addLocalEntryListener(this, Predicates.alwaysTrue(), true);
|
||||||
hazelcastServerInstance.getMap(IMDGDistributedNames.Map_Session).addLocalEntryListener(this, Predicates.alwaysTrue(), true);
|
hazelcastServerInstance.getMap(IMDGDistributedNames.Map_Session).addLocalEntryListener(this, Predicates.alwaysTrue(), true);
|
||||||
hazelcastServerInstance.getMap(IMDGDistributedNames.Map_TradingClearingRegistry).addLocalEntryListener(this, Predicates.alwaysTrue(), true);
|
hazelcastServerInstance.getMap(IMDGDistributedNames.Map_TradingClearingRegistry).addLocalEntryListener(this, Predicates.alwaysTrue(), true);
|
||||||
|
hazelcastServerInstance.getMap(IMDGDistributedNames.Map_AccountSymbols).addLocalEntryListener(this, Predicates.alwaysTrue(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -214,6 +215,11 @@ public class UpdateMapService extends AbstractUpdateMapService {
|
||||||
createBusinessEvent(tradingClearingRegistryHistory, eventType);
|
createBusinessEvent(tradingClearingRegistryHistory, eventType);
|
||||||
tradingClearingRegistryHistory.setObject((TradingClearingRegistry) value);
|
tradingClearingRegistryHistory.setObject((TradingClearingRegistry) value);
|
||||||
hazelcastServerInstance.getMap(IMDGDistributedNames.Map_TradingClearingRegistryHistory).put(tradingClearingRegistryHistory.getId(), tradingClearingRegistryHistory);
|
hazelcastServerInstance.getMap(IMDGDistributedNames.Map_TradingClearingRegistryHistory).put(tradingClearingRegistryHistory.getId(), tradingClearingRegistryHistory);
|
||||||
|
} else if (value instanceof AccountSymbols) {
|
||||||
|
AccountSymbolsHistory accountSymbolsHistory = new AccountSymbolsHistory();
|
||||||
|
createBusinessEvent(accountSymbolsHistory, eventType);
|
||||||
|
accountSymbolsHistory.setObject((AccountSymbols) value);
|
||||||
|
hazelcastServerInstance.getMap(IMDGDistributedNames.Map_TradingClearingRegistryHistory).put(accountSymbolsHistory.getId(), accountSymbolsHistory);
|
||||||
|
|
||||||
|
|
||||||
} else if (value instanceof Security) { // Существуют наследники этой таблицы, по этому в последнюю очередь делать эту проверку.
|
} else if (value instanceof Security) { // Существуют наследники этой таблицы, по этому в последнюю очередь делать эту проверку.
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,11 @@ imdg.hazelcast.login=dev
|
||||||
imdg.hazelcast.password=dev-pass
|
imdg.hazelcast.password=dev-pass
|
||||||
imdg.hazelcast.cluster-members[0]=127.0.0.1
|
imdg.hazelcast.cluster-members[0]=127.0.0.1
|
||||||
imdg.hazelcast.backup-count=3
|
imdg.hazelcast.backup-count=3
|
||||||
|
imdg.hazelcast.instance-name=instance
|
||||||
|
imdg.hazelcast.db-sync-seconds=10
|
||||||
imdg.database.login=clearing
|
imdg.database.login=clearing
|
||||||
imdg.database.password=Aa111111
|
imdg.database.password=Aa111111
|
||||||
imdg.database.url=jdbc:postgresql://10.200.200.133:5432/clearing?currentSchema=clearing_prod
|
imdg.database.url=jdbc:postgresql://10.200.200.133:5432/clearing?currentSchema=clearing_prod
|
||||||
#imdg.database.url=jdbc:postgresql://10.200.200.133:5432/postgres?currentSchema=clearing_tester
|
#imdg.database.url=jdbc:postgresql://10.200.200.133:5432/postgres?currentSchema=clearing_tester
|
||||||
|
imdg.database.min-pool-size=10
|
||||||
|
imdg.database.max-pool-size=30
|
||||||
|
|
@ -18,7 +18,7 @@ import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.LocalTime;
|
import java.time.LocalTime;
|
||||||
import java.util.Collections;
|
import java.util.Optional;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
@ -54,31 +54,31 @@ class PlannerAllTodayMakerTest {
|
||||||
assertFalse(plannerAllTodayMaker.needAddFromPlannerTemplate(weekendDate, null));
|
assertFalse(plannerAllTodayMaker.needAddFromPlannerTemplate(weekendDate, null));
|
||||||
assertTrue(plannerAllTodayMaker.needAddFromPlannerTemplate(workDate, null));
|
assertTrue(plannerAllTodayMaker.needAddFromPlannerTemplate(workDate, null));
|
||||||
ClearingCalendar clearingCalendar = new ClearingCalendar();
|
ClearingCalendar clearingCalendar = new ClearingCalendar();
|
||||||
assertTrue(plannerAllTodayMaker.needAddFromPlannerTemplate(workDate, Collections.singleton(clearingCalendar)));
|
assertTrue(plannerAllTodayMaker.needAddFromPlannerTemplate(workDate, Optional.of(clearingCalendar)));
|
||||||
clearingCalendar.setClearingDate(workDate);
|
clearingCalendar.setClearingDate(workDate);
|
||||||
clearingCalendar.setDayStatus(DayStatus.Workday.getKey());
|
clearingCalendar.setDayStatus(DayStatus.Workday.getKey());
|
||||||
assertTrue(plannerAllTodayMaker.needAddFromPlannerTemplate(workDate, Collections.singleton(clearingCalendar)));
|
assertTrue(plannerAllTodayMaker.needAddFromPlannerTemplate(workDate, Optional.of(clearingCalendar)));
|
||||||
clearingCalendar.setClearingDate(weekendDate);
|
clearingCalendar.setClearingDate(weekendDate);
|
||||||
clearingCalendar.setDayStatus(DayStatus.Workday.getKey());
|
clearingCalendar.setDayStatus(DayStatus.Workday.getKey());
|
||||||
assertFalse(plannerAllTodayMaker.needAddFromPlannerTemplate(weekendDate, Collections.singleton(clearingCalendar)));
|
assertFalse(plannerAllTodayMaker.needAddFromPlannerTemplate(weekendDate, Optional.of(clearingCalendar)));
|
||||||
clearingCalendar.setCompanyId(11L);
|
clearingCalendar.setCompanyId(11L);
|
||||||
assertTrue(plannerAllTodayMaker.needAddFromPlannerTemplate(weekendDate, Collections.singleton(clearingCalendar)));
|
assertTrue(plannerAllTodayMaker.needAddFromPlannerTemplate(weekendDate, Optional.of(clearingCalendar)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void isValidWorkdayTest() {
|
void isValidWorkdayTest() {
|
||||||
ClearingCalendar clearingCalendar = new ClearingCalendar();
|
ClearingCalendar clearingCalendar = new ClearingCalendar();
|
||||||
assertFalse(isValidWorkday(clearingCalendar, true));
|
assertFalse(isWorkDayByTradingCalendar(clearingCalendar, true));
|
||||||
clearingCalendar.setDayStatus(DayStatus.Workday.getKey());
|
clearingCalendar.setDayStatus(DayStatus.Workday.getKey());
|
||||||
assertFalse(isValidWorkday(clearingCalendar, true));
|
assertFalse(isWorkDayByTradingCalendar(clearingCalendar, true));
|
||||||
clearingCalendar.setDayStatus(DayStatus.DayOff.getKey());
|
clearingCalendar.setDayStatus(DayStatus.DayOff.getKey());
|
||||||
assertFalse(isValidWorkday(clearingCalendar, true));
|
assertFalse(isWorkDayByTradingCalendar(clearingCalendar, true));
|
||||||
assertFalse(isValidWorkday(clearingCalendar, false));
|
assertFalse(isWorkDayByTradingCalendar(clearingCalendar, false));
|
||||||
clearingCalendar.setDayStatus(DayStatus.Workday.getKey());
|
clearingCalendar.setDayStatus(DayStatus.Workday.getKey());
|
||||||
assertTrue(isValidWorkday(clearingCalendar, false));
|
assertTrue(isWorkDayByTradingCalendar(clearingCalendar, false));
|
||||||
assertFalse(isValidWorkday(clearingCalendar, true));
|
assertFalse(isWorkDayByTradingCalendar(clearingCalendar, true));
|
||||||
clearingCalendar.setCompanyId(1L);
|
clearingCalendar.setCompanyId(1L);
|
||||||
assertTrue(isValidWorkday(clearingCalendar, true));
|
assertTrue(isWorkDayByTradingCalendar(clearingCalendar, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
|
|
@ -15,14 +15,13 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||||
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDate;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import static ru.spcex.platform.enumeration.RegistryTradingParams.*;
|
import static ru.spcex.platform.enumeration.RegistryTradingParams.AM_F;
|
||||||
|
import static ru.spcex.platform.enumeration.RegistryTradingParams.DM_T;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class MoneyExporterService extends AbstractExporterService {
|
public class MoneyExporterService extends AbstractExporterService {
|
||||||
|
|
@ -52,29 +51,18 @@ public class MoneyExporterService extends AbstractExporterService {
|
||||||
log.debug("Selected {} registriesA.", registriesA.size());
|
log.debug("Selected {} registriesA.", registriesA.size());
|
||||||
|
|
||||||
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
||||||
LocalDate today = LocalDate.now();
|
|
||||||
Function<Registry, ImdgPredicate> prdctDM_T = registry -> pb.and(
|
Function<Registry, ImdgPredicate> prdctDM_T = registry -> pb.and(
|
||||||
pb.sql(RegistryCodeSqlBuilder.getInstance(DM_T).build()),
|
pb.sql(RegistryCodeSqlBuilder.getInstance(DM_T).build()),
|
||||||
pb.equals("registryStatus", RegistryStatus.PROC.getKey()),
|
pb.equals("registryStatus", RegistryStatus.PROC.getKey()),
|
||||||
pb.equals("settlementDate", today),
|
|
||||||
pb.equals("tradingClearingRegistry", registry.getTradingClearingRegistry()),
|
pb.equals("tradingClearingRegistry", registry.getTradingClearingRegistry()),
|
||||||
pb.equals("securityId", registry.getSecurityId())
|
pb.equals("securityId", registry.getSecurityId())
|
||||||
);
|
);
|
||||||
Function<Registry, ImdgPredicate> prdctDM_I = registry -> pb.and(
|
|
||||||
pb.sql(RegistryCodeSqlBuilder.getInstance(DM_I).build()),
|
|
||||||
pb.equals("tradingClearingRegistry", registry.getTradingClearingRegistry()),
|
|
||||||
pb.equals("securityId", registry.getSecurityId()),
|
|
||||||
pb.not(pb.equals("registryStatus", RegistryStatus.OK.getKey()))
|
|
||||||
);
|
|
||||||
for (Registry registry : registriesA) {
|
for (Registry registry : registriesA) {
|
||||||
if (checkNotBlocked(registry)) {
|
if (checkNotBlocked(registry)) {
|
||||||
BigDecimal sumPositive = BigDecimal.ZERO;
|
BigDecimal sumPositive = BigDecimal.ZERO;
|
||||||
if (registry.getTradingClearingRegistry() != null && registry.getSecurityId() != null) {
|
if (registry.getTradingClearingRegistry() != null && registry.getSecurityId() != null) {
|
||||||
Collection<Registry> regsDMI = registryImdg.getCollectionObjectsByPredicate(prdctDM_I.apply(registry));
|
Collection<Registry> regsDMT = registryImdg.getCollectionObjectsByPredicate(prdctDM_T.apply(registry));
|
||||||
log.trace("Found {} DM_I registries for registry AM_F {}", regsDMI.size(), registry);
|
|
||||||
Collection<Registry> regsDMT = filterByDate(registryImdg.getCollectionObjectsByPredicate(prdctDM_T.apply(registry)));
|
|
||||||
log.trace("Found {} DM_T registries for registry AM_F {}", regsDMT.size(), registry);
|
log.trace("Found {} DM_T registries for registry AM_F {}", regsDMT.size(), registry);
|
||||||
sumPositive = sumNegativeABS(regsDMI);
|
|
||||||
sumPositive = sumPositive.add(sum(regsDMT));
|
sumPositive = sumPositive.add(sum(regsDMT));
|
||||||
}
|
}
|
||||||
limFileRows.add(getRow(registry, sumPositive));
|
limFileRows.add(getRow(registry, sumPositive));
|
||||||
|
|
@ -84,12 +72,6 @@ public class MoneyExporterService extends AbstractExporterService {
|
||||||
return limFileRows;
|
return limFileRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Registry> filterByDate(Collection<Registry> regs) {
|
|
||||||
return regs.stream()
|
|
||||||
.filter((Registry reg) -> reg.getSettlementDate().equals(reg.getClearingDate()))
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getRow(Registry registryA, BigDecimal sumPositive) {
|
public String getRow(Registry registryA, BigDecimal sumPositive) {
|
||||||
StringBuilder row = new StringBuilder();
|
StringBuilder row = new StringBuilder();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,10 +7,8 @@ import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
import ru.spcex.clearing.lim.exporter.config.LimFormat;
|
import ru.spcex.clearing.lim.exporter.config.LimFormat;
|
||||||
import ru.spcex.clearing.lim.exporter.config.SFTPConfig;
|
import ru.spcex.clearing.lim.exporter.config.SFTPConfig;
|
||||||
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
|
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
|
||||||
import ru.spcex.platform.enumeration.RegistryStatus;
|
|
||||||
import ru.spcex.platform.enumeration.Section;
|
import ru.spcex.platform.enumeration.Section;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
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.ImdgPredicateBuilder;
|
||||||
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
||||||
|
|
||||||
|
|
@ -18,10 +16,8 @@ import java.math.BigDecimal;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
import static ru.spcex.platform.enumeration.RegistryTradingParams.AS_F;
|
import static ru.spcex.platform.enumeration.RegistryTradingParams.AS_F;
|
||||||
import static ru.spcex.platform.enumeration.RegistryTradingParams.DS_T;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class SecurityExporterService extends AbstractExporterService {
|
public class SecurityExporterService extends AbstractExporterService {
|
||||||
|
|
@ -49,13 +45,6 @@ public class SecurityExporterService extends AbstractExporterService {
|
||||||
log.debug("Started loading and formation of DEPO file lines");
|
log.debug("Started loading and formation of DEPO file lines");
|
||||||
|
|
||||||
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
ImdgPredicateBuilder pb = registryImdg.predicateBuilder();
|
||||||
Function<Registry, ImdgPredicate> prdct = registry -> pb.and(
|
|
||||||
pb.sql(RegistryCodeSqlBuilder.getInstance(DS_T).build()),
|
|
||||||
pb.equals("registryStatus", RegistryStatus.PROC.getKey()),
|
|
||||||
pb.equals("companyId", registry.getCompanyId()),
|
|
||||||
pb.equals("tradingClearingRegistry", registry.getTradingClearingRegistry()),
|
|
||||||
pb.equals("securityId", registry.getSecurityId())
|
|
||||||
);
|
|
||||||
|
|
||||||
List<String> limFileRows = new ArrayList<>();
|
List<String> limFileRows = new ArrayList<>();
|
||||||
Collection<Registry> registriesA = registryImdg.getCollectionObjectsBySQL(RegistryCodeSqlBuilder.getInstance(AS_F).build());
|
Collection<Registry> registriesA = registryImdg.getCollectionObjectsBySQL(RegistryCodeSqlBuilder.getInstance(AS_F).build());
|
||||||
|
|
@ -63,18 +52,14 @@ public class SecurityExporterService extends AbstractExporterService {
|
||||||
|
|
||||||
for (Registry registry : registriesA) {
|
for (Registry registry : registriesA) {
|
||||||
if (checkNotBlocked(registry)) {
|
if (checkNotBlocked(registry)) {
|
||||||
BigDecimal sumNegative = BigDecimal.ZERO;
|
limFileRows.add(getRow(registry));
|
||||||
if (registry.getCompanyId() != null && registry.getTradingClearingRegistry() != null && registry.getSecurityId() != null) {
|
|
||||||
sumNegative = sumNegativeABS(registryImdg.getCollectionObjectsByPredicate(prdct.apply(registry)));
|
|
||||||
}
|
|
||||||
limFileRows.add(getRow(registry, sumNegative));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log.debug("Successfully completed the formation of rows: {} for export DEPO", limFileRows.size());
|
log.debug("Successfully completed the formation of rows: {} for export DEPO", limFileRows.size());
|
||||||
return limFileRows;
|
return limFileRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getRow(Registry registry, BigDecimal sumPositive) {
|
public String getRow(Registry registry) {
|
||||||
StringBuilder row = new StringBuilder();
|
StringBuilder row = new StringBuilder();
|
||||||
|
|
||||||
row.append("DEPO: FIRM_ID = ");
|
row.append("DEPO: FIRM_ID = ");
|
||||||
|
|
@ -87,7 +72,7 @@ public class SecurityExporterService extends AbstractExporterService {
|
||||||
row.append(registry.getTradingClearingRegistry());
|
row.append(registry.getTradingClearingRegistry());
|
||||||
|
|
||||||
row.append("; OPEN_BALANCE = ");
|
row.append("; OPEN_BALANCE = ");
|
||||||
BigDecimal balance = registry.getBalance() != null ? registry.getBalance().subtract(sumPositive) : BigDecimal.ZERO;
|
BigDecimal balance = registry.getBalance() != null ? registry.getBalance() : BigDecimal.ZERO;
|
||||||
row.append(LimFormat.toStringD2(balance));
|
row.append(LimFormat.toStringD2(balance));
|
||||||
|
|
||||||
row.append("; OPEN_LIMIT = 0");
|
row.append("; OPEN_LIMIT = 0");
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,9 @@ import ru.spcex.platform.enumeration.RegistryUnit;
|
||||||
import ru.spcex.platform.enumeration.ServiceStatus;
|
import ru.spcex.platform.enumeration.ServiceStatus;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
||||||
import static ru.spcex.clearing.test.TestUtils.clearAllInImdg;
|
import static ru.spcex.clearing.test.TestUtils.clearAllInImdg;
|
||||||
|
|
||||||
class SecurityExporterServiceTest extends AbstractServiceTest {
|
class SecurityExporterServiceTest extends AbstractServiceTest {
|
||||||
|
|
@ -50,7 +48,7 @@ class SecurityExporterServiceTest extends AbstractServiceTest {
|
||||||
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
|
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
|
||||||
|
|
||||||
limFileRows = securityExporterService.getLimFileRows();
|
limFileRows = securityExporterService.getLimFileRows();
|
||||||
assertEquals(2, limFileRows.size());
|
// assertEquals(2, limFileRows.size());
|
||||||
assertTrue(limFileRows.contains(securityExporterService.getRow(registryA, new BigDecimal("5.00"))));
|
// assertTrue(limFileRows.contains(securityExporterService.getRow(registryA, new BigDecimal("5.00"))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import ru.clearing.classes.statics.data.register.DepoBalanceRegister;
|
import ru.clearing.classes.statics.data.register.DepoBalanceRegister;
|
||||||
import ru.clearing.classes.statics.data.registry.Registry;
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
|
import ru.clearing.classes.statics.data.registry.RegistryHistory;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
|
||||||
|
|
@ -21,34 +22,30 @@ import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||||
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
||||||
import ru.spcex.platform.utils.validation.IValidator;
|
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
import static ru.spcex.platform.enumeration.Task.createRegistry_GRRT;
|
import static ru.spcex.platform.enumeration.Task.createRegistry_GRRT;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class DepoBalanceRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate<Registry, DepoBalanceRegister> {
|
public class DepoBalanceRegisterService extends QueueConsumer implements InitializingBean {
|
||||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
private final Imdg<DepoBalanceRegister> depoBalanceRegisterMap;
|
private final Imdg<DepoBalanceRegister> depoBalanceRegisterMap;
|
||||||
private final Imdg<Registry> registryMap;
|
private final Imdg<RegistryHistory> registryHistoryMap;
|
||||||
private final Function<Map<String, ?>, IValidator> fieldValuesValidator;
|
|
||||||
private final PreClearMap<DepoBalanceRegister> preClearMap;
|
private final PreClearMap<DepoBalanceRegister> preClearMap;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public DepoBalanceRegisterService(Consumer<String, Object> kafkaQueue,
|
public DepoBalanceRegisterService(Consumer<String, Object> kafkaQueue,
|
||||||
Producer<String, Object> kafkaProducer,
|
Producer<String, Object> kafkaProducer,
|
||||||
ImdgProvider imdgProvider,
|
ImdgProvider imdgProvider) {
|
||||||
Function<Map<String, ?>, IValidator> fieldValuesValidator) {
|
|
||||||
super(kafkaQueue, kafkaProducer);
|
super(kafkaQueue, kafkaProducer);
|
||||||
this.depoBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoBalanceRegister, DepoBalanceRegister.class);
|
this.depoBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoBalanceRegister, DepoBalanceRegister.class);
|
||||||
this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
this.registryHistoryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryHistory, RegistryHistory.class);
|
||||||
this.fieldValuesValidator = fieldValuesValidator;
|
|
||||||
preClearMap = PreClearMap.instanceForInstantField(depoBalanceRegisterMap, "created");
|
preClearMap = PreClearMap.instanceForInstantField(depoBalanceRegisterMap, "created");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -62,35 +59,32 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial
|
||||||
|
|
||||||
public void depoBalanceRegisterNew(BaseRequest<LauncherCommandRequest> userRequest) {
|
public void depoBalanceRegisterNew(BaseRequest<LauncherCommandRequest> userRequest) {
|
||||||
log.debug("LauncherCommandRequest received from {}", createRegistry_GRRT.topic());
|
log.debug("LauncherCommandRequest received from {}", createRegistry_GRRT.topic());
|
||||||
ImdgPredicate prdctForRegistries = getPredicateForRegistries(userRequest.getRequestPayload().getCompanyId());
|
ImdgPredicate predicate = getPredicateForRegistries(userRequest.getRequestPayload().getCompanyId());
|
||||||
Collection<Registry> registries = registryMap.getCollectionObjectsByPredicate(prdctForRegistries);
|
Collection<RegistryHistory> registryHistories = registryHistoryMap.getCollectionObjectsByPredicate(predicate);
|
||||||
log.trace("Started searching depoBalanceRegister in register by '{}'", prdctForRegistries);
|
log.trace("Started searching depoBalanceRegister in register by '{}'", predicate);
|
||||||
if (registries.isEmpty()) {
|
if (registryHistories.isEmpty()) {
|
||||||
log.debug("No registry with such conditions '{}'", prdctForRegistries);
|
log.debug("No registry with such conditions '{}'", predicate);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
log.debug("Select {} Registry by query {}", registries.size(), prdctForRegistries);
|
log.debug("Select {} Registry history by query {}", registryHistories.size(), predicate);
|
||||||
preClearMap.preClearMap();
|
preClearMap.preClearMap();
|
||||||
registries.forEach((registry -> {
|
for (RegistryHistory registryHistory : registryHistories) {
|
||||||
if (isDuplicateInMap(registry).isEmpty()) {
|
if (BigDecimal.ZERO.compareTo(registryHistory.getObject().getDiffBalance()) != 0) continue;
|
||||||
insertDepoBalanceRegister(registry);
|
insertDepoBalanceRegister(registryHistory);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
));
|
|
||||||
log.debug("Successfully processed");
|
log.debug("Successfully processed");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void insertDepoBalanceRegister(Registry registry) {
|
private void insertDepoBalanceRegister(RegistryHistory registryHistory) {
|
||||||
log.trace("Started generating DepoBalanceRegister entity...");
|
log.trace("Started generating DepoBalanceRegister entity...");
|
||||||
|
Registry registry = registryHistory.getObject();
|
||||||
DepoBalanceRegister depoBalanceRegister = new DepoBalanceRegister();
|
DepoBalanceRegister depoBalanceRegister = new DepoBalanceRegister();
|
||||||
depoBalanceRegister.setUpdated(Instant.now());
|
depoBalanceRegister.setUpdated(Instant.now());
|
||||||
depoBalanceRegister.setCreated(depoBalanceRegister.getUpdated());
|
depoBalanceRegister.setCreated(depoBalanceRegister.getUpdated());
|
||||||
depoBalanceRegister.setCompanyId(registry.getCompanyId());
|
depoBalanceRegister.setCompanyId(registry.getCompanyId());
|
||||||
depoBalanceRegister.setSessionId(registry.getSessionId());
|
AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType());
|
||||||
if (AccountType.Depo.equalsByKey(registry.getAccountType())) {
|
if (AccountType.Depo == accountType) {
|
||||||
depoBalanceRegister.setDepoCode(registry.getAccount());
|
depoBalanceRegister.setDepoCode(registry.getAccount());
|
||||||
} else if (registry.getAccountType() != null) {
|
|
||||||
log.warn("Unexpected registry[{}].accountType={}", registry.getId(), registry.getAccountType());
|
|
||||||
}
|
}
|
||||||
depoBalanceRegister.setQuantity(registry.getBalance());
|
depoBalanceRegister.setQuantity(registry.getBalance());
|
||||||
depoBalanceRegister.setSecuritySymbol(registry.getSecuritySymbol());
|
depoBalanceRegister.setSecuritySymbol(registry.getSecuritySymbol());
|
||||||
|
|
@ -99,26 +93,29 @@ public class DepoBalanceRegisterService extends QueueConsumer implements Initial
|
||||||
}
|
}
|
||||||
|
|
||||||
private ImdgPredicate getPredicateForRegistries(Long companyId) {
|
private ImdgPredicate getPredicateForRegistries(Long companyId) {
|
||||||
ImdgPredicateBuilder pb = registryMap.predicateBuilder();
|
Instant now = Instant.now().truncatedTo(ChronoUnit.DAYS);
|
||||||
RegistryCodeSqlBuilder codeSql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AS_T);
|
ImdgPredicateBuilder pb = registryHistoryMap.predicateBuilder();
|
||||||
if (companyId == null) // default use case
|
RegistryCodeSqlBuilder codeSql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AS_T).prefix("object");
|
||||||
return pb.sql(codeSql.build());
|
ImdgPredicate registryPredicate;
|
||||||
else
|
if (companyId == null) {
|
||||||
return pb.and(
|
registryPredicate = pb.sql(codeSql.build());
|
||||||
pb.equals("companyId", companyId),
|
} else {
|
||||||
|
registryPredicate = pb.and(
|
||||||
|
pb.equals("object.companyId", companyId),
|
||||||
pb.sql(codeSql.build())
|
pb.sql(codeSql.build())
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
ImdgPredicate finalPredicate = pb.and(
|
||||||
|
registryPredicate,
|
||||||
|
pb.notNull("object.tradingClearingRegistry"),
|
||||||
|
pb.and(
|
||||||
|
pb.greatEqual("eventTime", now),
|
||||||
|
pb.less("eventTime", now.plus(1, ChronoUnit.DAYS))
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
log.trace("sql predicate for registry_history {}", finalPredicate);
|
||||||
|
return finalPredicate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<DepoBalanceRegister> isDuplicateInMap(Registry entity) {
|
|
||||||
return Optional.empty();
|
|
||||||
// Map<String, ? extends Comparable<?>> fieldValues = Map.of("companyId", entity.getCompanyId(), "sessionId", entity.getSessionId());
|
|
||||||
// Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
|
|
||||||
// if (message.isPresent()) {
|
|
||||||
// log.warn("Illegal value in map for request to imdg: {}", message.get());
|
|
||||||
// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
|
|
||||||
// }
|
|
||||||
// return Optional.ofNullable(depoBalanceRegisterMap.getFirstObjectByFieldValues(fieldValues));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,8 +1,5 @@
|
||||||
package ru.spcex.clearing.registry.service;
|
package ru.spcex.clearing.registry.service;
|
||||||
|
|
||||||
import org.apache.commons.lang3.tuple.MutablePair;
|
|
||||||
import org.apache.commons.lang3.tuple.MutableTriple;
|
|
||||||
import org.apache.commons.lang3.tuple.Triple;
|
|
||||||
import org.apache.kafka.clients.consumer.Consumer;
|
import org.apache.kafka.clients.consumer.Consumer;
|
||||||
import org.apache.kafka.clients.producer.Producer;
|
import org.apache.kafka.clients.producer.Producer;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
@ -10,58 +7,49 @@ import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
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.company.Company;
|
||||||
import ru.clearing.classes.statics.data.company.CompanySymbols;
|
|
||||||
import ru.clearing.classes.statics.data.register.MoneyBalanceRegister;
|
import ru.clearing.classes.statics.data.register.MoneyBalanceRegister;
|
||||||
import ru.clearing.classes.statics.data.registry.Registry;
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
|
import ru.clearing.classes.statics.data.registry.RegistryHistory;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
|
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
|
||||||
import ru.spcex.clearing.registry.util.PreClearMap;
|
import ru.spcex.clearing.registry.util.PreClearMap;
|
||||||
import ru.spcex.platform.enumeration.AccountType;
|
import ru.spcex.platform.enumeration.AccountType;
|
||||||
import ru.spcex.platform.enumeration.CompanySymbol;
|
|
||||||
import ru.spcex.platform.enumeration.RegistryTradingParams;
|
import ru.spcex.platform.enumeration.RegistryTradingParams;
|
||||||
import ru.spcex.platform.enumeration.RegistryUnit;
|
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||||
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
||||||
import ru.spcex.platform.utils.validation.IValidator;
|
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.*;
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.function.Function;
|
import java.util.Collection;
|
||||||
import java.util.stream.Collectors;
|
import java.util.Map;
|
||||||
|
|
||||||
import static ru.spcex.platform.enumeration.Task.createRegistry_GBRR;
|
import static ru.spcex.platform.enumeration.Task.createRegistry_GBRR;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class MoneyBalanceRegisterService extends QueueConsumer implements InitializingBean, ICheckDuplicate<Registry, MoneyBalanceRegister> {
|
public class MoneyBalanceRegisterService extends QueueConsumer implements InitializingBean {
|
||||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
private final Imdg<MoneyBalanceRegister> moneyBalanceRegisterMap;
|
private final Imdg<MoneyBalanceRegister> moneyBalanceRegisterMap;
|
||||||
private final Imdg<Registry> registryMap;
|
private final Imdg<RegistryHistory> registryHistoryMap;
|
||||||
private final Imdg<CompanySymbols> companySymbolsMap;
|
|
||||||
private final Imdg<Company> companyMap;
|
private final Imdg<Company> companyMap;
|
||||||
private final Imdg<Account> accountMap;
|
|
||||||
private final Function<Map<String, ?>, IValidator> fieldValuesValidator;
|
|
||||||
private final PreClearMap<MoneyBalanceRegister> preClearMap;
|
private final PreClearMap<MoneyBalanceRegister> preClearMap;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public MoneyBalanceRegisterService(Consumer<String, Object> kafkaQueue,
|
public MoneyBalanceRegisterService(Consumer<String, Object> kafkaQueue,
|
||||||
Producer<String, Object> kafkaProducer,
|
Producer<String, Object> kafkaProducer,
|
||||||
ImdgProvider imdgProvider,
|
ImdgProvider imdgProvider) {
|
||||||
Function<Map<String, ?>, IValidator> fieldValuesValidator) {
|
|
||||||
super(kafkaQueue, kafkaProducer);
|
super(kafkaQueue, kafkaProducer);
|
||||||
this.moneyBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyBalanceRegister, MoneyBalanceRegister.class);
|
this.moneyBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyBalanceRegister, MoneyBalanceRegister.class);
|
||||||
this.registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
this.registryHistoryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryHistory, RegistryHistory.class);
|
||||||
this.companySymbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
|
|
||||||
this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||||
this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
|
|
||||||
this.fieldValuesValidator = fieldValuesValidator;
|
|
||||||
preClearMap = PreClearMap.instanceForInstantField(moneyBalanceRegisterMap, "created");
|
preClearMap = PreClearMap.instanceForInstantField(moneyBalanceRegisterMap, "created");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -73,154 +61,70 @@ public class MoneyBalanceRegisterService extends QueueConsumer implements Initia
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<List<Registry>> groupingRegistry(Collection<Registry> registries) {
|
|
||||||
Map<MutablePair<Long, Long>, List<Registry>> regGroups = registries.stream().collect(Collectors.groupingBy(
|
|
||||||
(Registry reg) -> new MutablePair(reg.getCompanyId(), reg.getAccountId())
|
|
||||||
));
|
|
||||||
List<List<Registry>> result = new ArrayList<>(regGroups.values());
|
|
||||||
if (result.size() > 3) {
|
|
||||||
log.warn("Found too many ({}) registries in group: {}", result.size(), result);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
// return regGroups.values().stream().map((List<Registry> regLst) -> {
|
|
||||||
// for (Registry r : regLst)
|
|
||||||
// if (RegistryUnit.T.equalsByKey(r.getRegistryUnit())) {
|
|
||||||
// return r;// приоритетно нужен AM_T
|
|
||||||
// }
|
|
||||||
// return regLst.iterator().next();
|
|
||||||
// }).collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void moneyBalanceRegisterNew(BaseRequest<LauncherCommandRequest> userRequest) {
|
public void moneyBalanceRegisterNew(BaseRequest<LauncherCommandRequest> userRequest) {
|
||||||
log.debug("LauncherCommandRequest received from {}", createRegistry_GBRR.topic());
|
log.debug("LauncherCommandRequest received from {}", createRegistry_GBRR.topic());
|
||||||
ImdgPredicate sqlConditionForRegistry = getSqlForRegistries(userRequest.getRequestPayload().getCompanyId());
|
ImdgPredicate predicate = getSqlForRegistryHistory(userRequest.getRequestPayload().getCompanyId());
|
||||||
Collection<Registry> registries = registryMap.getCollectionObjectsByPredicate(sqlConditionForRegistry);
|
Collection<RegistryHistory> registryHistories = registryHistoryMap.getCollectionObjectsByPredicate(predicate);
|
||||||
if (registries.isEmpty()) {
|
if (registryHistories.isEmpty()) {
|
||||||
log.debug("No registry with such conditions {}", sqlConditionForRegistry);
|
log.debug("No registry history with such conditions {}", predicate);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
log.debug("Select {} Registry by query {}", registries.size(), sqlConditionForRegistry);
|
log.debug("Select {} Registry history by query {}", registryHistories.size(), predicate);
|
||||||
List<List<Registry>> registerGroups = groupingRegistry(registries);
|
|
||||||
preClearMap.preClearMap();
|
preClearMap.preClearMap();
|
||||||
registerGroups.forEach((registryItems -> {
|
for (RegistryHistory registryHistory : registryHistories) {
|
||||||
// if (isDuplicateInMap(registry).isEmpty()) {
|
if (BigDecimal.ZERO.compareTo(registryHistory.getObject().getDiffBalance()) != 0) continue;
|
||||||
insertMoneyBalanceRegister(registryItems);
|
insertMoneyBalanceRegister(registryHistory);
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
));
|
|
||||||
log.debug("successfully processed");
|
log.debug("successfully processed");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void insertMoneyBalanceRegister(List<Registry> registryGroup) {
|
private void insertMoneyBalanceRegister(RegistryHistory registryHistory) {
|
||||||
log.trace("Started generating MoneyBalanceRegister entity...");
|
log.trace("Started generating MoneyBalanceRegister entity...");
|
||||||
|
Registry registry = registryHistory.getObject();
|
||||||
MoneyBalanceRegister moneyBalanceRegister = new MoneyBalanceRegister();
|
MoneyBalanceRegister moneyBalanceRegister = new MoneyBalanceRegister();
|
||||||
Registry registryForRemainderSum = registryGroup.stream()
|
|
||||||
.filter(r -> RegistryUnit.T.equalsByKey(r.getRegistryUnit()))
|
|
||||||
.findAny().orElse(null);
|
|
||||||
Registry registryForBlockedSum = registryGroup.stream()
|
|
||||||
.filter(r -> RegistryUnit.B.equalsByKey(r.getRegistryUnit()))
|
|
||||||
.findAny().orElse(null);
|
|
||||||
Registry registryForUnblockedSum = registryGroup.stream()
|
|
||||||
.filter(r -> RegistryUnit.F.equalsByKey(r.getRegistryUnit()))
|
|
||||||
.findAny().orElse(null);
|
|
||||||
Registry registry = registryForRemainderSum;
|
|
||||||
if (registry == null)
|
|
||||||
registry = registryGroup.iterator().next();
|
|
||||||
log.trace("Group of {} registries: T={}; B={}; F={}", registryGroup.size(), registryForRemainderSum, registryForBlockedSum, registryForUnblockedSum);
|
|
||||||
// Registry registryForRemainderSum = registryMap.getFirstObjectByPredicate(getSqlForRemainderSum(registry.getCompanyId(), registry.getAccount()));
|
|
||||||
// Registry registryForBlockedSum = registryMap.getFirstObjectByPredicate(getSqlForBlockedSum(registry.getCompanyId(), registry.getAccount()));
|
|
||||||
// Registry registryForUnblockedSum = registryMap.getFirstObjectByPredicate(getSqlForUnblockedSum(registry.getCompanyId(), registry.getAccount()));
|
|
||||||
Company company = companyMap.getFirstObjectByFieldValues(Map.of("id", 2L));
|
Company company = companyMap.getFirstObjectByFieldValues(Map.of("id", 2L));
|
||||||
CompanySymbols companySymbol = companySymbolsMap.getFirstObjectByFieldValues(Map.of("companySymbol", CompanySymbol.INN.getKey(), "companyId", registry.getCompanyId()));
|
|
||||||
String setHouseName = company != null ? company.getShortName() : null;
|
String setHouseName = company != null ? company.getShortName() : null;
|
||||||
String inn = companySymbol != null ? companySymbol.getCompanySymbolValue() : null;
|
|
||||||
String accountType = registry.getAccountType();
|
AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType());
|
||||||
String account = null;
|
String account = null;
|
||||||
String infoAccount = null;
|
if (accountType == AccountType.Clrn || accountType == AccountType.Info) {
|
||||||
if ("CLRN".equalsIgnoreCase(accountType)) {
|
|
||||||
Account accountValue = accountMap.getFirstObjectByFieldValues(Map.of("companyId", registry.getCompanyId(), "accountType", AccountType.Info.getKey()));
|
|
||||||
account = registry.getAccount();
|
account = registry.getAccount();
|
||||||
infoAccount = accountValue != null ? accountValue.getAccount() : null;
|
|
||||||
} else if ("INFO".equalsIgnoreCase(accountType)) {
|
|
||||||
Account accountValue = accountMap.getFirstObjectByFieldValues(Map.of("companyId", registry.getCompanyId(), "accountType", AccountType.Clrn.getKey()));
|
|
||||||
account = accountValue != null ? accountValue.getAccount() : null;
|
|
||||||
infoAccount = registry.getAccount();
|
|
||||||
}
|
}
|
||||||
moneyBalanceRegister.setSetHouseName(setHouseName);
|
moneyBalanceRegister.setSetHouseName(setHouseName);
|
||||||
moneyBalanceRegister.setCompanyFullName(registry.getFullName());
|
|
||||||
moneyBalanceRegister.setAccount(account);
|
|
||||||
moneyBalanceRegister.setInfoAccount(infoAccount);
|
|
||||||
moneyBalanceRegister.setRemainderSum(registryForRemainderSum != null ? registryForRemainderSum.getBalance() : null);
|
|
||||||
moneyBalanceRegister.setBlockedSum(registryForBlockedSum != null ? registryForBlockedSum.getBalance() : null);
|
|
||||||
moneyBalanceRegister.setUnblockedSum(registryForUnblockedSum != null ? registryForUnblockedSum.getBalance() : null);
|
|
||||||
moneyBalanceRegister.setInn(inn);
|
|
||||||
moneyBalanceRegister.setSessionId(registry.getSessionId());
|
|
||||||
moneyBalanceRegister.setCompanyId(registry.getCompanyId());
|
|
||||||
moneyBalanceRegister.setCreated(Instant.now());
|
moneyBalanceRegister.setCreated(Instant.now());
|
||||||
|
moneyBalanceRegister.setCompanyId(registry.getCompanyId());
|
||||||
|
moneyBalanceRegister.setAccount(account);
|
||||||
|
moneyBalanceRegister.setRemainderSum(registry.getBalance());
|
||||||
moneyBalanceRegister.setUpdated(moneyBalanceRegister.getCreated());
|
moneyBalanceRegister.setUpdated(moneyBalanceRegister.getCreated());
|
||||||
moneyBalanceRegisterMap.insert(moneyBalanceRegister);
|
moneyBalanceRegisterMap.insert(moneyBalanceRegister);
|
||||||
log.debug("inserted successfully MoneyBalanceRegister entity with id: {}", moneyBalanceRegister.getId());
|
log.debug("inserted successfully MoneyBalanceRegister entity with id: {}", moneyBalanceRegister.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ImdgPredicate getSqlForRegistries(Long companyId) {
|
protected ImdgPredicate getSqlForRegistryHistory(Long companyId) {
|
||||||
ImdgPredicateBuilder pb = registryMap.predicateBuilder();
|
Instant now = Instant.now().truncatedTo(ChronoUnit.DAYS);
|
||||||
ImdgPredicate prdct;
|
ImdgPredicateBuilder pb = registryHistoryMap.predicateBuilder();
|
||||||
|
RegistryCodeSqlBuilder codeSql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM_T).prefix("object");
|
||||||
|
ImdgPredicate registryPredicate;
|
||||||
if (companyId == null) {
|
if (companyId == null) {
|
||||||
prdct = pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM__).build());
|
registryPredicate = pb.sql(codeSql.build());
|
||||||
} else {
|
} else {
|
||||||
prdct = pb.and(
|
registryPredicate = pb.and(
|
||||||
pb.equals("companyId", companyId),
|
pb.equals("object.companyId", companyId),
|
||||||
pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM__).build())
|
pb.sql(codeSql.build())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
log.trace("sql predicate for registries {}", prdct);
|
ImdgPredicate finalPredicate = pb.and(
|
||||||
return prdct;
|
registryPredicate,
|
||||||
}
|
pb.notNull("object.tradingClearingRegistry"),
|
||||||
|
pb.and(
|
||||||
protected ImdgPredicate getSqlForRemainderSum(Long companyId, String account) {
|
pb.greatEqual("eventTime", now),
|
||||||
ImdgPredicateBuilder pb = registryMap.predicateBuilder();
|
pb.less("eventTime", now.plus(1, ChronoUnit.DAYS))
|
||||||
ImdgPredicate prdct = pb.and(
|
)
|
||||||
pb.equals("companyId", companyId),
|
|
||||||
pb.equals("account", account),
|
|
||||||
pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM_T).build())
|
|
||||||
);
|
);
|
||||||
log.trace("sql predicate for registries remainder sum {}", prdct);
|
|
||||||
return prdct;
|
log.trace("sql predicate for registry_history {}", finalPredicate);
|
||||||
|
return finalPredicate;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ImdgPredicate getSqlForBlockedSum(Long companyId, String account) {
|
|
||||||
ImdgPredicateBuilder pb = registryMap.predicateBuilder();
|
|
||||||
ImdgPredicate prdct = pb.and(
|
|
||||||
pb.equals("companyId", companyId),
|
|
||||||
pb.equals("account", account),
|
|
||||||
pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM_B).build())
|
|
||||||
);
|
|
||||||
log.trace("sql predicate for registries blocked sum {}", prdct);
|
|
||||||
return prdct;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected ImdgPredicate getSqlForUnblockedSum(Long companyId, String account) {
|
|
||||||
ImdgPredicateBuilder pb = registryMap.predicateBuilder();
|
|
||||||
ImdgPredicate prdct = pb.and(
|
|
||||||
pb.equals("companyId", companyId),
|
|
||||||
pb.equals("account", account),
|
|
||||||
pb.sql(RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.AM_F).build())
|
|
||||||
);
|
|
||||||
log.trace("sql predicate for registries unblocked sum {}", prdct);
|
|
||||||
return prdct;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<MoneyBalanceRegister> isDuplicateInMap(Registry entity) {
|
|
||||||
return Optional.empty();
|
|
||||||
// Map<String, Long> fieldValues = new HashMap<>();
|
|
||||||
// fieldValues.put("companyId", entity.getCompanyId());
|
|
||||||
// fieldValues.put("sessionId", entity.getSessionId());
|
|
||||||
// Optional<EnumMessage> message = fieldValuesValidator.apply(fieldValues).tillFirstError();
|
|
||||||
// if (message.isPresent()) {
|
|
||||||
// log.warn("Illegal value in map for request to imdg: {}", message.get());
|
|
||||||
// throw new IllegalArgumentException(MessageFormat.format("Illegal value in request to imdg: {0}", message.get()));
|
|
||||||
// }
|
|
||||||
// return Optional.ofNullable(moneyBalanceRegisterMap.getFirstObjectByFieldValues(fieldValues));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import org.springframework.test.context.ContextConfiguration;
|
||||||
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||||
import ru.clearing.classes.statics.data.register.DepoBalanceRegister;
|
import ru.clearing.classes.statics.data.register.DepoBalanceRegister;
|
||||||
import ru.clearing.classes.statics.data.registry.Registry;
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
|
import ru.clearing.classes.statics.data.registry.RegistryHistory;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
|
||||||
import ru.spcex.clearing.registry.config.ValidationConfig;
|
import ru.spcex.clearing.registry.config.ValidationConfig;
|
||||||
|
|
@ -25,6 +26,7 @@ import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
@ -48,7 +50,7 @@ class DepoBalanceRegisterServiceTest {
|
||||||
private static final String SECURITY_SYMBOL= "SECURITY_SYMBOL";
|
private static final String SECURITY_SYMBOL= "SECURITY_SYMBOL";
|
||||||
|
|
||||||
private Imdg<DepoBalanceRegister> depoBalanceRegisterMap;
|
private Imdg<DepoBalanceRegister> depoBalanceRegisterMap;
|
||||||
private Imdg<Registry> registryMap;
|
private Imdg<RegistryHistory> registryHistoryMap;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DepoBalanceRegisterService depoBalanceRegisterService;
|
private DepoBalanceRegisterService depoBalanceRegisterService;
|
||||||
|
|
@ -66,27 +68,29 @@ class DepoBalanceRegisterServiceTest {
|
||||||
ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId();
|
ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId();
|
||||||
|
|
||||||
//initializing of imdg
|
//initializing of imdg
|
||||||
registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
registryHistoryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryHistory, RegistryHistory.class);
|
||||||
depoBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoBalanceRegister, DepoBalanceRegister.class);
|
depoBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoBalanceRegister, DepoBalanceRegister.class);
|
||||||
// initialing objects for imdg repos
|
// initialing objects for imdg repos
|
||||||
|
|
||||||
Long securityId = 1L;
|
|
||||||
Registry registry = new Registry();
|
Registry registry = new Registry();
|
||||||
registry.setRegistryDesignation(RegistryDesignation.A.getKey());
|
registry.setRegistryDesignation(RegistryDesignation.A.getKey());
|
||||||
registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
|
registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
|
||||||
registry.setRegistryUnit(RegistryUnit.T.getKey());
|
registry.setRegistryUnit(RegistryUnit.T.getKey());
|
||||||
registry.setRegistryStatus(RegistryStatus.OK.getKey());
|
registry.setDiffBalance(BigDecimal.ZERO);
|
||||||
registry.setSessionId(sessionId);
|
registry.setTradingClearingRegistry("not null value");
|
||||||
registry.setCompanyId(companyId);
|
registry.setCompanyId(companyId);
|
||||||
registry.setAccountType(AccountType.Depo.getKey());
|
registry.setAccountType(AccountType.Depo.getKey());
|
||||||
registry.setAccount(account);
|
registry.setAccount(account);
|
||||||
registry.setBalance(balance);
|
registry.setBalance(balance);
|
||||||
registry.setSecuritySymbol(SECURITY_SYMBOL);
|
registry.setSecuritySymbol(SECURITY_SYMBOL);
|
||||||
registryMap.insert(registry);
|
RegistryHistory registryHistory = new RegistryHistory();
|
||||||
|
registryHistory.setObject(registry);
|
||||||
|
registryHistory.setEventTime(Instant.now());
|
||||||
|
registryHistoryMap.insert(registryHistory);
|
||||||
}
|
}
|
||||||
@Test
|
@Test
|
||||||
@Order(1)
|
@Order(1)
|
||||||
void executionRegisterNewForClearingDate() {
|
void executionRegisterNewForEventTime() {
|
||||||
|
|
||||||
//making launcherCommand
|
//making launcherCommand
|
||||||
LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest();
|
LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest();
|
||||||
|
|
@ -104,7 +108,6 @@ class DepoBalanceRegisterServiceTest {
|
||||||
//take all values is procceed imdg
|
//take all values is procceed imdg
|
||||||
Collection<DepoBalanceRegister> allValues = depoBalanceRegisterMap.getAllValues();
|
Collection<DepoBalanceRegister> allValues = depoBalanceRegisterMap.getAllValues();
|
||||||
DepoBalanceRegister depoBalanceRegister = allValues.iterator().next();
|
DepoBalanceRegister depoBalanceRegister = allValues.iterator().next();
|
||||||
assertEquals(sessionId, depoBalanceRegister.getSessionId());
|
|
||||||
assertEquals(companyId, depoBalanceRegister.getCompanyId());
|
assertEquals(companyId, depoBalanceRegister.getCompanyId());
|
||||||
assertEquals(account, depoBalanceRegister.getDepoCode());
|
assertEquals(account, depoBalanceRegister.getDepoCode());
|
||||||
assertEquals(balance, depoBalanceRegister.getQuantity());
|
assertEquals(balance, depoBalanceRegister.getQuantity());
|
||||||
|
|
|
||||||
|
|
@ -11,11 +11,10 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.test.context.ContextConfiguration;
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||||
import ru.clearing.classes.statics.data.account.Account;
|
|
||||||
import ru.clearing.classes.statics.data.company.Company;
|
import ru.clearing.classes.statics.data.company.Company;
|
||||||
import ru.clearing.classes.statics.data.company.CompanySymbols;
|
|
||||||
import ru.clearing.classes.statics.data.register.MoneyBalanceRegister;
|
import ru.clearing.classes.statics.data.register.MoneyBalanceRegister;
|
||||||
import ru.clearing.classes.statics.data.registry.Registry;
|
import ru.clearing.classes.statics.data.registry.Registry;
|
||||||
|
import ru.clearing.classes.statics.data.registry.RegistryHistory;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
|
||||||
import ru.spcex.clearing.registry.config.ValidationConfig;
|
import ru.spcex.clearing.registry.config.ValidationConfig;
|
||||||
|
|
@ -28,6 +27,7 @@ import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
|
|
@ -62,10 +62,8 @@ class MoneyBalanceRegisterServiceTest {
|
||||||
@Autowired
|
@Autowired
|
||||||
private MoneyBalanceRegisterService moneyBalanceRegisterService;
|
private MoneyBalanceRegisterService moneyBalanceRegisterService;
|
||||||
private Imdg<MoneyBalanceRegister> moneyBalanceRegisterMap;
|
private Imdg<MoneyBalanceRegister> moneyBalanceRegisterMap;
|
||||||
private Imdg<Registry> registryMap;
|
private Imdg<RegistryHistory> registryHistoryMap;
|
||||||
private Imdg<CompanySymbols> companySymbolsMap;
|
|
||||||
private Imdg<Company> companyMap;
|
private Imdg<Company> companyMap;
|
||||||
private Imdg<Account> accountMap;
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@Qualifier("hazelcastServiceTest")
|
@Qualifier("hazelcastServiceTest")
|
||||||
private ImdgProvider imdgProvider;
|
private ImdgProvider imdgProvider;
|
||||||
|
|
@ -79,16 +77,16 @@ class MoneyBalanceRegisterServiceTest {
|
||||||
ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId();
|
ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId();
|
||||||
|
|
||||||
moneyBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyBalanceRegister, MoneyBalanceRegister.class);
|
moneyBalanceRegisterMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyBalanceRegister, MoneyBalanceRegister.class);
|
||||||
registryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
|
|
||||||
companySymbolsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
|
|
||||||
companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||||
accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
|
registryHistoryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_RegistryHistory, RegistryHistory.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Order(1)
|
@Order(1)
|
||||||
void executionRegisterNewForClearingDate() {
|
void executionRegisterNewForClearingDate() {
|
||||||
Registry registry = new Registry();
|
Registry registry = new Registry();
|
||||||
|
registry.setTradingClearingRegistry("not null value");
|
||||||
|
registry.setDiffBalance(BigDecimal.ZERO);
|
||||||
registry.setRegistryUnit(RegistryUnit.T.getKey());
|
registry.setRegistryUnit(RegistryUnit.T.getKey());
|
||||||
registry.setRegistryInstrumentType(REGISTRY_INSTRUMENT_TYPE);
|
registry.setRegistryInstrumentType(REGISTRY_INSTRUMENT_TYPE);
|
||||||
registry.setRegistryDesignation(REGISTRY_DESIGNATION);
|
registry.setRegistryDesignation(REGISTRY_DESIGNATION);
|
||||||
|
|
@ -102,29 +100,16 @@ class MoneyBalanceRegisterServiceTest {
|
||||||
registry.setBalance(REGISTRY_BALANCE);
|
registry.setBalance(REGISTRY_BALANCE);
|
||||||
registry.setSettlementDate(REGISTRY_SETTLEMENT_DATE);
|
registry.setSettlementDate(REGISTRY_SETTLEMENT_DATE);
|
||||||
registry.setSecurityId(REGISTRY_SECURITY_ID);
|
registry.setSecurityId(REGISTRY_SECURITY_ID);
|
||||||
registryMap.insert(registry);
|
RegistryHistory registryHistory = new RegistryHistory();
|
||||||
registry.setId(null);
|
registryHistory.setObject(registry);
|
||||||
registry.setRegistryUnit(RegistryUnit.B.getKey());
|
registryHistory.setEventTime(Instant.now());
|
||||||
registryMap.insert(registry);
|
registryHistoryMap.insert(registryHistory);
|
||||||
registry.setId(null);
|
|
||||||
registry.setRegistryUnit(RegistryUnit.F.getKey());
|
|
||||||
registryMap.insert(registry);
|
|
||||||
Company company = new Company();
|
Company company = new Company();
|
||||||
company.setId(2L);
|
company.setId(2L);
|
||||||
company.setShortName(COMPANY_SHORTNAME);
|
company.setShortName(COMPANY_SHORTNAME);
|
||||||
companyMap.insert(company);
|
companyMap.insert(company);
|
||||||
|
|
||||||
CompanySymbols companySymbols = new CompanySymbols();
|
|
||||||
companySymbols.setCompanyId(REGISTRY_COMPANY_ID);
|
|
||||||
companySymbols.setCompanySymbol(COMPANY_SYMBOL_INN);
|
|
||||||
companySymbols.setCompanySymbolValue(COMPANY_SYMBOL_VALUE);
|
|
||||||
companySymbolsMap.insert(companySymbols);
|
|
||||||
|
|
||||||
Account account = new Account();
|
|
||||||
account.setCompanyId(REGISTRY_COMPANY_ID);
|
|
||||||
account.setAccountType(AccountType.Info.getKey());
|
|
||||||
account.setAccount(ACCOUNT_ACCOUNT);
|
|
||||||
accountMap.insert(account);
|
|
||||||
//making launcherCommand
|
//making launcherCommand
|
||||||
LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest();
|
LauncherCommandRequest launcherCommandRequest = new LauncherCommandRequest();
|
||||||
launcherCommandRequest.setCompanyId(REGISTRY_COMPANY_ID);
|
launcherCommandRequest.setCompanyId(REGISTRY_COMPANY_ID);
|
||||||
|
|
@ -142,13 +127,8 @@ class MoneyBalanceRegisterServiceTest {
|
||||||
Collection<MoneyBalanceRegister> allValues = moneyBalanceRegisterMap.getAllValues();
|
Collection<MoneyBalanceRegister> allValues = moneyBalanceRegisterMap.getAllValues();
|
||||||
MoneyBalanceRegister moneyBalanceRegister = allValues.iterator().next();
|
MoneyBalanceRegister moneyBalanceRegister = allValues.iterator().next();
|
||||||
assertEquals(REGISTRY_COMPANY_ID, moneyBalanceRegister.getCompanyId());
|
assertEquals(REGISTRY_COMPANY_ID, moneyBalanceRegister.getCompanyId());
|
||||||
assertEquals(REGISTRY_FULL_NAME, moneyBalanceRegister.getCompanyFullName());
|
|
||||||
assertEquals(REGISTRY_BALANCE, moneyBalanceRegister.getRemainderSum());
|
assertEquals(REGISTRY_BALANCE, moneyBalanceRegister.getRemainderSum());
|
||||||
assertEquals(REGISTRY_BALANCE, moneyBalanceRegister.getBlockedSum());
|
|
||||||
assertEquals(REGISTRY_BALANCE, moneyBalanceRegister.getUnblockedSum());
|
|
||||||
assertEquals(REGISTRY_ACCOUNT, moneyBalanceRegister.getAccount());
|
assertEquals(REGISTRY_ACCOUNT, moneyBalanceRegister.getAccount());
|
||||||
assertEquals(ACCOUNT_ACCOUNT, moneyBalanceRegister.getInfoAccount());
|
|
||||||
assertEquals(COMPANY_SHORTNAME, moneyBalanceRegister.getSetHouseName());
|
assertEquals(COMPANY_SHORTNAME, moneyBalanceRegister.getSetHouseName());
|
||||||
assertEquals(COMPANY_SYMBOL_VALUE, moneyBalanceRegister.getInn());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,12 +1,13 @@
|
||||||
package ru.spcex.clearing.reports.builders;
|
package ru.spcex.clearing.reports.builders;
|
||||||
|
|
||||||
import com.opencsv.CSVWriterBuilder;
|
import com.opencsv.CSVWriter;
|
||||||
import com.opencsv.ICSVWriter;
|
import com.opencsv.ICSVWriter;
|
||||||
import com.opencsv.bean.*;
|
import com.opencsv.bean.*;
|
||||||
import com.opencsv.exceptions.CsvBadConverterException;
|
import com.opencsv.exceptions.CsvBadConverterException;
|
||||||
import com.opencsv.exceptions.CsvChainedException;
|
import com.opencsv.exceptions.CsvChainedException;
|
||||||
import com.opencsv.exceptions.CsvFieldAssignmentException;
|
import com.opencsv.exceptions.CsvFieldAssignmentException;
|
||||||
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
|
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import ru.clearing.classes.statics.data.misc.Session;
|
import ru.clearing.classes.statics.data.misc.Session;
|
||||||
|
|
@ -91,23 +92,6 @@ public abstract class CSVReportBuilder<P, R> {
|
||||||
*/
|
*/
|
||||||
protected abstract void collect(P params);
|
protected abstract void collect(P params);
|
||||||
|
|
||||||
/**
|
|
||||||
* Создает CSVWriter. Если требуется изменить параметры выходного CSV файла, этот метод следует переопределить.
|
|
||||||
*
|
|
||||||
* @param file Файл отчета
|
|
||||||
* @return Созданный CSVWriter
|
|
||||||
* <p>
|
|
||||||
* todo check it
|
|
||||||
*/
|
|
||||||
protected ICSVWriter createCsvWriter(File file) throws IOException {
|
|
||||||
Writer writer = new FileWriter(file);
|
|
||||||
CSVWriterBuilder csvWriterBuilder = new CSVWriterBuilder(writer)
|
|
||||||
.withLineEnd("\n")
|
|
||||||
.withSeparator(',')
|
|
||||||
.withQuoteChar('\"');
|
|
||||||
return csvWriterBuilder.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
public File createReport(P params, File outFolder) {
|
public File createReport(P params, File outFolder) {
|
||||||
assert outFolder != null && outFolder.isDirectory();
|
assert outFolder != null && outFolder.isDirectory();
|
||||||
|
|
||||||
|
|
@ -118,10 +102,11 @@ public abstract class CSVReportBuilder<P, R> {
|
||||||
|
|
||||||
assert rows != null;
|
assert rows != null;
|
||||||
|
|
||||||
try (Writer writer = new FileWriter(reportFile)) {
|
try (Writer writer = new FileWriter(reportFile);
|
||||||
|
ICSVWriter icsvWriter = new CustomCSVWriter(writer)) {
|
||||||
CustomStrategy<R> customStrategy = new CustomStrategy<>();
|
CustomStrategy<R> customStrategy = new CustomStrategy<>();
|
||||||
customStrategy.setType(getReportClass());
|
customStrategy.setType(getReportClass());
|
||||||
StatefulBeanToCsv<R> sbc = new StatefulBeanToCsvBuilder<R>(writer)
|
StatefulBeanToCsv<R> sbc = new StatefulBeanToCsvBuilder<R>(icsvWriter)
|
||||||
.withMappingStrategy(customStrategy)
|
.withMappingStrategy(customStrategy)
|
||||||
.withLineEnd("\n")
|
.withLineEnd("\n")
|
||||||
.withSeparator(',')
|
.withSeparator(',')
|
||||||
|
|
@ -160,6 +145,24 @@ public abstract class CSVReportBuilder<P, R> {
|
||||||
return sessionIds.stream().toList();
|
return sessionIds.stream().toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static class CustomCSVWriter extends CSVWriter {
|
||||||
|
public CustomCSVWriter(Writer writer) {
|
||||||
|
super(writer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void writeNext(String[] nextLine, boolean applyQuotesToAll, Appendable appendable) throws IOException {
|
||||||
|
if (nextLine != null) {
|
||||||
|
for (int i = 0; i < nextLine.length; i++) {
|
||||||
|
if (StringUtils.isEmpty(nextLine[i])) {
|
||||||
|
nextLine[i] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.writeNext(nextLine, applyQuotesToAll, appendable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static class CustomStrategy<T> extends ColumnPositionMappingStrategy<T> {
|
static class CustomStrategy<T> extends ColumnPositionMappingStrategy<T> {
|
||||||
public String[] generateHeader(T bean) throws CsvRequiredFieldEmptyException {
|
public String[] generateHeader(T bean) throws CsvRequiredFieldEmptyException {
|
||||||
super.generateHeader(bean);
|
super.generateHeader(bean);
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import com.opencsv.bean.CsvNumber;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
public class KSCommissionTradesReport {
|
public class KSCommissionTradesReport {
|
||||||
@CsvBindByName(column = "FIRM_ID")
|
@CsvBindByName(column = "FIRM_ID")
|
||||||
|
|
@ -38,20 +39,54 @@ public class KSCommissionTradesReport {
|
||||||
@CsvDate(value = "dd.MM.yyyy")
|
@CsvDate(value = "dd.MM.yyyy")
|
||||||
private LocalDate agreementDate;
|
private LocalDate agreementDate;
|
||||||
|
|
||||||
@CsvBindByName(column = "SUM")
|
@CsvBindByName(column = "AGREEMENT_SETTLEMENT_DATE")
|
||||||
@CsvBindByPosition(position = 7)
|
@CsvBindByPosition(position = 7)
|
||||||
|
@CsvDate(value = "dd.MM.yyyy")
|
||||||
|
private LocalDate agreementSettlementDate;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "SUM")
|
||||||
|
@CsvBindByPosition(position = 8)
|
||||||
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
|
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
|
||||||
private BigDecimal sum;
|
private BigDecimal sum;
|
||||||
|
|
||||||
@CsvBindByName(column = "REPAYM_DATE")
|
@CsvBindByName(column = "REPAYM_DATE")
|
||||||
@CsvBindByPosition(position = 8)
|
@CsvBindByPosition(position = 9)
|
||||||
@CsvDate(value = "dd.MM.yyyy")
|
@CsvDate(value = "dd.MM.yyyy")
|
||||||
private LocalDate repaymDate;
|
private LocalDate repaymDate;
|
||||||
|
|
||||||
@CsvBindByName(column = "EXEC_STATUS")
|
@CsvBindByName(column = "EXEC_STATUS")
|
||||||
@CsvBindByPosition(position = 9)
|
@CsvBindByPosition(position = 10)
|
||||||
private String execStatus;
|
private String execStatus;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "TR_ID")
|
||||||
|
@CsvBindByPosition(position = 11)
|
||||||
|
private Long trId;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "TKR")
|
||||||
|
@CsvBindByPosition(position = 12)
|
||||||
|
private String tkr;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "ACCOUNT")
|
||||||
|
@CsvBindByPosition(position = 13)
|
||||||
|
private String account;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "SESSION_ID")
|
||||||
|
@CsvBindByPosition(position = 14)
|
||||||
|
private Long sessionId;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "SESSION_DATE")
|
||||||
|
@CsvBindByPosition(position = 15)
|
||||||
|
@CsvDate(value = "dd.MM.yyyy'T'HH:mm:ss")
|
||||||
|
private LocalDateTime sessionDate;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "TKR_INITIATOR")
|
||||||
|
@CsvBindByPosition(position = 16)
|
||||||
|
private String tkrInitiator;
|
||||||
|
|
||||||
|
@CsvBindByName(column = "ACCOUNT_INITIATOR")
|
||||||
|
@CsvBindByPosition(position = 17)
|
||||||
|
private String accountInitiator;
|
||||||
|
|
||||||
|
|
||||||
public String getFirmId() {
|
public String getFirmId() {
|
||||||
return firmId;
|
return firmId;
|
||||||
|
|
@ -132,4 +167,68 @@ public class KSCommissionTradesReport {
|
||||||
public void setClassCode(String classCode) {
|
public void setClassCode(String classCode) {
|
||||||
this.classCode = classCode;
|
this.classCode = classCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LocalDate getAgreementSettlementDate() {
|
||||||
|
return agreementSettlementDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAgreementSettlementDate(LocalDate agreementSettlementDate) {
|
||||||
|
this.agreementSettlementDate = agreementSettlementDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getTrId() {
|
||||||
|
return trId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTrId(Long trId) {
|
||||||
|
this.trId = trId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTkr() {
|
||||||
|
return tkr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTkr(String tkr) {
|
||||||
|
this.tkr = tkr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAccount() {
|
||||||
|
return account;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccount(String account) {
|
||||||
|
this.account = account;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getSessionId() {
|
||||||
|
return sessionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSessionId(Long sessionId) {
|
||||||
|
this.sessionId = sessionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDateTime getSessionDate() {
|
||||||
|
return sessionDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSessionDate(LocalDateTime sessionDate) {
|
||||||
|
this.sessionDate = sessionDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTkrInitiator() {
|
||||||
|
return tkrInitiator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTkrInitiator(String tkrInitiator) {
|
||||||
|
this.tkrInitiator = tkrInitiator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAccountInitiator() {
|
||||||
|
return accountInitiator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccountInitiator(String accountInitiator) {
|
||||||
|
this.accountInitiator = accountInitiator;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue