Compare commits

...
Sign in to create a new pull request.

102 commits

Author SHA1 Message Date
ialbert
7c2ce48bd1 DM_X search: statuses PROC/MNG 2024-01-29 13:54:12 +03:00
ialbert
0fd9208e41 clearing-service changeStatusExtract => gateway without timeout
optional max-poll-interval-ms setting
2024-01-17 13:22:13 +03:00
ialbert
ab80d194a5 SDF57 cs_blocked to gateway DM_V 2024-01-12 13:12:53 +03:00
ialbert
6590d63026 cs_blocked при создании PaymentInstruction: для категории I ИЛИ V 2024-01-12 11:20:41 +03:00
ialbert
b96fcaae7d http://jira.mfd.msk:8088/browse/CLS-311 2024-01-11 15:33:27 +03:00
ialbert
517dc8669a http://jira.mfd.msk:8088/browse/CLS-311 2024-01-11 14:29:59 +03:00
ialbert
8df2442aa6 SDF06 DM*T.status condition OK/MNG => PROC/MNG 2024-01-10 17:24:38 +03:00
ialbert
c959023094 A**T openBalance null => 0 2023-12-20 11:58:23 +03:00
ialbert
54c3d7c235 >> SDF57 D**I -> OK && session present => AxxT.planned += DxxI.balance 2023-12-19 14:47:04 +03:00
AKurakin
892bdcb769 http://jira.mfd.msk:8088/browse/CLS-600 meta 2023-12-18 14:02:40 +03:00
ialbert
66ead14acb lim-exporter money DM*T settlement_date condition removed [2] 2023-12-18 12:34:18 +03:00
ialbert
072a5dbcd9 lim-exporter money DM*T settlement_date condition removed 2023-12-18 11:26:07 +03:00
ialbert
730ae2aba4 imdg application.properties 2023-12-15 17:29:54 +03:00
ialbert
5ad1b0d569 imdg settings: imdg.hazelcast.instance-name/imdg.hazelcast.db-sync-seconds/imdg.database.min-pool-size/imdg.database.max-pool-size 2023-12-15 17:12:59 +03:00
AKurakin
2a400e1a8a Merge branch 'tmpCLS-585' into dev 2023-12-15 16:29:44 +03:00
AKurakin
c8336ce8a4 http://jira.mfd.msk:8088/browse/CLS-585 уточнение получено 2023-12-15 16:29:11 +03:00
ialbert
08867e3cb9 http://jira.mfd.msk:8088/browse/CLS-603 2023-12-15 13:12:35 +03:00
akulikov
999b0999de http://jira.mfd.msk:8088/browse/CLS-602 (fix date format) 2023-12-15 10:06:00 +03:00
akulikov
038f676eef http://jira.mfd.msk:8088/browse/CLS-602 2023-12-14 12:17:12 +03:00
ialbert
c5a62a0bd4 removed mm2-prefixless-policy.jar 2023-12-13 15:25:56 +03:00
ialbert
ab34364a22 lim-exporter OPEN-BALANCE fix 2023-12-12 13:38:27 +03:00
akulikov
91b6f9efbc http://jira.mfd.msk:8088/browse/CLS-601 fixes 2023-12-12 10:45:33 +03:00
akulikov
9a279eead8 http://jira.mfd.msk:8088/browse/CLS-601 remove DM_X registry sessionId condition 2023-12-08 15:29:11 +03:00
akulikov
c5f79afb50 http://jira.mfd.msk:8088/browse/CLS-601 fix report test 2023-12-08 14:00:56 +03:00
akulikov
de9619376b registry-service fix, ImdgPredicateBuilder fix, RegistryCodeSqlBuilder fix dot 2023-12-08 13:53:12 +03:00
akulikov
0dd5cec12e http://jira.mfd.msk:8088/browse/CLS-601 2023-12-08 13:31:30 +03:00
etreschenkov
cd488b19d8 revert dot 2023-12-08 13:11:23 +03:00
etreschenkov
1ec2b25714 http://jira.mfd.msk:8088/browse/CLS-523 2023-12-08 13:07:24 +03:00
akulikov
8fe43dee98 http://jira.mfd.msk:8088/browse/CLS-599 2023-12-07 19:13:06 +03:00
akulikov
49b3191a63 http://jira.mfd.msk:8088/browse/CLS-599 2023-12-07 18:52:46 +03:00
akulikov
2a81e33b78 http://jira.mfd.msk:8088/browse/CLS-599 2023-12-07 17:27:56 +03:00
akulikov
313ff28cbd http://jira.mfd.msk:8088/browse/CLS-599 2023-12-07 13:19:11 +03:00
AKurakin
2656d6a78c db-scripts DATA_INITIAL.sql поправлен TRADING_CODE для СПВБ=001, транзитный счёт для бумаг SPCEX 2023-12-07 12:19:04 +03:00
ialbert
dc21de68f2 http://jira.mfd.msk:8088/browse/CLS-328 fix 2023-12-01 19:31:52 +03:00
ialbert
2c2cc64595 http://jira.mfd.msk:8088/browse/CLS-328 2023-12-01 19:27:45 +03:00
ialbert
17910bd224 http://jira.mfd.msk:8088/browse/CLS-328 2023-12-01 19:04:18 +03:00
ialbert
02e2b3a3f2 indexes for Registry map 2023-11-30 20:13:32 +03:00
ialbert
fe48b00464 ExecutionFond from s_trade log, clearing-service log pattern 2023-11-30 13:39:03 +03:00
ialbert
3f5fa0433f ExecutionFond#Quantity 2023-11-29 19:59:57 +03:00
ialbert
4e78439e54 ExecutionFond settlementAmount valuation for EQTY 2023-11-29 15:42:27 +03:00
ialbert
673bb48938 запросе сделок из тс, статус запроса (не отвисает кнопка на вебе) 2023-11-29 11:51:29 +03:00
ialbert
0dc90cf828 ExecutionFondComponent valuation flag added to logs 2023-11-28 12:43:28 +03:00
ialbert
afbe819255 changeStatusExtract gateway request 2023-11-28 11:56:51 +03:00
ialbert
9b8e68a94c Merge branch 'dev' into execution_and_deals_status
# Conflicts:
#	clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionBuilderV2.java
#	clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/impl/FormingPaymentInstructionAssets.java
2023-11-27 15:39:16 +03:00
etreshenkov
d5e764131d fix PlannerAllTodayMaker 2023-11-27 12:33:25 +03:00
AKurakin
793171b3da security-util UserRoleVerification поправил логи 2023-11-24 19:04:55 +03:00
AKurakin
4bcc725c26 meta 3.9.0.70 текст для couponPeriod 2023-11-24 17:57:35 +03:00
akulikov
2da0ac042c http://jira.mfd.msk:8088/browse/CLS-598 2023-11-24 17:12:48 +03:00
akulikov
99f4dbe292 http://jira.mfd.msk:8088/browse/CLS-597 fix 2023-11-23 18:58:01 +03:00
akulikov
4bd6dab4b1 http://jira.mfd.msk:8088/browse/CLS-597 fix 2023-11-23 18:11:13 +03:00
akulikov
e028aee516 http://jira.mfd.msk:8088/browse/CLS-597 2023-11-23 14:21:35 +03:00
ialbert
7641b2691c CS_BLKD 2023-11-22 19:07:06 +03:00
akulikov
970da463fc http://jira.mfd.msk:8088/browse/CLS-596 fixes 2023-11-22 15:28:18 +03:00
akulikov
5639f9ff8b http://jira.mfd.msk:8088/browse/CLS-596 fix after review 2023-11-22 15:19:41 +03:00
akulikov
8e948bc27a http://jira.mfd.msk:8088/browse/CLS-596 fix 2023-11-22 14:48:18 +03:00
akulikov
0b2bef797e http://jira.mfd.msk:8088/browse/CLS-596 2023-11-22 14:22:35 +03:00
ialbert
e04460b194 http://jira.mfd.msk:8088/browse/CLS-536 2023-11-21 17:21:16 +03:00
ialbert
0c00c7fdb3 PaymentInstruction grouping for securities 2023-11-21 17:09:08 +03:00
ialbert
494bafbe18 http://jira.mfd.msk:8088/browse/CLS-536 2023-11-21 16:25:31 +03:00
ialbert
4b1b6113f4 http://jira.mfd.msk:8088/browse/CLS-536 2023-11-21 16:25:10 +03:00
ialbert
53198ca9f5 Merge branch 'dev' into execution_and_deals_status 2023-11-20 14:08:05 +03:00
ialbert
3e6b8911c9 http://jira.mfd.msk:8088/browse/CLS-536 2023-11-20 14:07:45 +03:00
ialbert
1d4d831ea7 http://jira.mfd.msk:8088/browse/CLS-590 2023-11-20 13:07:52 +03:00
akulikov
085b0cf4ce http://jira.mfd.msk:8088/browse/CLS-497 KSRepTradesReportBuilder 2023-11-20 12:02:16 +03:00
akulikov
632bdf9e09 http://jira.mfd.msk:8088/browse/CLS-497 KSRepCashNettoReportBuilder 2023-11-20 11:17:53 +03:00
ialbert
866c063b0d http://jira.mfd.msk:8088/browse/CLS-590 2023-11-17 13:29:26 +03:00
ialbert
911c90bc45 Merge branch 'dev' into execution_and_deals_status 2023-11-16 18:08:10 +03:00
ialbert
8ae41b9d16 DS*I fix полей 2023-11-16 18:07:36 +03:00
ialbert
37a741e866 D**I fix полей open_balance/close_balance/plan_balance/created_at(new) 2023-11-16 18:07:36 +03:00
AKurakin
4a0df9bb48 dbf-importer swt-importer Забирать и обрабатывать файлы в порядке времени изменения на sftp (2)) 2023-11-16 16:29:53 +03:00
akulikov
939ea451a1 http://jira.mfd.msk:8088/browse/CLS-497 KSRepTrades 2023-11-16 16:16:35 +03:00
ialbert
ee0f95fcde http://jira.mfd.msk:8088/browse/CLS-591 2023-11-16 16:12:22 +03:00
akulikov
4581592380 http://jira.mfd.msk:8088/browse/CLS-497 KSRepCashNettoReport 2023-11-16 13:22:07 +03:00
akulikov
4e431ee798 http://jira.mfd.msk:8088/browse/CLS-497 KSRepTrades 2023-11-16 13:08:04 +03:00
AKurakin
10d8803651 dbf-importer swt-importer Забирать и обрабатывать файлы в порядке времени изменения на sftp 2023-11-16 12:43:44 +03:00
akulikov
fac5dca462 replace SUM and AGREEMENT_SETTLEMENT_DATE (KSCommissionTradesReport) 2023-11-16 11:58:30 +03:00
ialbert
06b38cc61f Merge branch 'dev' into execution_and_deals_status 2023-11-16 11:34:58 +03:00
AKurakin
4dfb642e1b platform-storage-api поправил RegistryCodeSqlBuilder для случая с множеством or параметров 2023-11-15 18:15:55 +03:00
ialbert
740c138ead http://jira.mfd.msk:8088/browse/CLS-536 DM*V создается для settlementDate == valueDate 2023-11-15 17:58:17 +03:00
akulikov
0d134db9c6 http://jira.mfd.msk:8088/browse/CLS-497 2023-11-15 17:26:30 +03:00
ialbert
deaa77a05c http://jira.mfd.msk:8088/browse/CLS-592 2023-11-15 16:47:16 +03:00
ialbert
c86f1e907a http://jira.mfd.msk:8088/browse/CLS-590
http://jira.mfd.msk:8088/browse/CLS-591
2023-11-15 16:46:36 +03:00
AKurakin
04bc8e9edf db-scripts http://jira.mfd.msk:8088/browse/CLS-594 разделение data.xml 2023-11-15 16:31:10 +03:00
ialbert
e8cba0467a http://jira.mfd.msk:8088/browse/CLS-592 2023-11-15 15:56:43 +03:00
AKurakin
9f988d34c0 swt-importer тест на RDC_KS_DF-20 2023-11-15 15:49:29 +03:00
AKurakin
3fbb5931df http://jira.mfd.msk:8088/browse/CLS-593 SDF02 в порядке SDF01 2023-11-15 11:53:09 +03:00
akulikov
15242a0a75 http://jira.mfd.msk:8088/browse/CLS-497 2023-11-14 14:40:17 +03:00
AKurakin
5cd8608584 meta fix 2023-11-13 16:58:50 +03:00
AKurakin
943ec5f762 http://jira.mfd.msk:8088/browse/CLS-585 todo уточнить задание 2023-11-13 16:51:36 +03:00
ialbert
20f6c6a939 mm2-prefixless-policy.jar настройка для репликации кафки 2023-11-13 16:29:00 +03:00
AKurakin
9e9a801bde http://jira.mfd.msk:8088/browse/CLS-497 2023-11-13 15:50:38 +03:00
akulikov
a8386a9ed9 http://jira.mfd.msk:8088/browse/CLS-497 2023-11-10 19:13:26 +03:00
akulikov
fd25105fe8 http://jira.mfd.msk:8088/browse/CLS-497 2023-11-09 17:12:59 +03:00
AKurakin
858e02084b http://jira.mfd.msk:8088/browse/CLS-586 meta / data 3.9.0.68 2023-11-09 16:27:53 +03:00
ialbert
eb3bed4a1d http://jira.mfd.msk:8088/browse/CLS-479 2023-11-09 15:03:25 +03:00
ialbert
8079ec1fb3 http://jira.mfd.msk:8088/browse/CLS-388 2023-11-09 15:03:25 +03:00
ialbert
cc2f20de3c http://jira.mfd.msk:8088/browse/CLS-584 2023-11-09 15:03:25 +03:00
ialbert
145d3f4c74 kill session command 2023-11-09 15:03:25 +03:00
akulikov
e6ede79021 http://jira.mfd.msk:8088/browse/CLS-497 2023-11-09 14:59:21 +03:00
AKurakin
a2ebfd945b backend-api update meta 3.9.0.67 2023-11-09 11:30:53 +03:00
akulikov
c7ad0a181c http://jira.mfd.msk:8088/browse/CLS-497 2023-11-08 15:47:30 +03:00
etreschenkov
12ff85188f http://jira.mfd.msk:8088/browse/CLS-582 2023-11-04 16:22:33 +03:00
121 changed files with 2795 additions and 1161 deletions

View file

@ -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));

View file

@ -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;

View file

@ -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>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<meta version="3.9.0.13"> <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="Запрещено"/>
@ -253,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="Отмена расписания"/>
@ -531,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>

View file

@ -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>

View file

@ -1,6 +1,6 @@
{ {
"version": "3.9.0.65", "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
} }
, ,
@ -4688,7 +4688,7 @@
} }
, ,
{"code": "accountId", {"code": "accountId",
"type": 1,"dbname": "Идентификатор счета","name": "Счет Депо КС","shortname": "Счет Депо КС","searchable": true,"sortable": true,"visible": true,"link": "account","linkCode": "account" "type": 1,"dbname": "Идентификатор счета","name": "Счет депо КС","shortname": "Счет депо КС","searchable": true,"sortable": true,"visible": true,"link": "account","linkCode": "account"
} }
, ,
{"code": "accountSymbolValue", {"code": "accountSymbolValue",
@ -4706,7 +4706,7 @@
"fields": [ "fields": [
{"code": "accountId", {"code": "accountId",
"type": 1,"dbname": "Идентификатор счета","name": "Счет Депо КС","shortname": "Счет Депо КС","link": "account","linkCode": "account","required": true "type": 1,"dbname": "Идентификатор счета","name": "Счет депо КС","shortname": "Счет депо КС","link": "account","linkCode": "account","required": true
} }
, ,
{"code": "accountSymbolValue", {"code": "accountSymbolValue",
@ -5588,6 +5588,17 @@
"name": "Проверка наличия пары ДФ-01/ДФ-57 и ДФ-08/ДФ-21", "name": "Проверка наличия пары ДФ-01/ДФ-57 и ДФ-08/ДФ-21",
"fields": []
}
,
{"method":"post",
"destination": "CCLR",
"group": "Клиринг",
"name": "Завершение неудачных клиринговых сессий",
"fields": [] "fields": []
} }
] ]
@ -5623,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",
@ -6171,11 +6182,11 @@
"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",
@ -6187,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",
@ -6227,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",
@ -6235,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",
@ -6259,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",
@ -6267,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
} }
] ]
@ -6519,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",

View file

@ -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.9.0.66"> <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">
@ -1086,11 +1086,11 @@
</depoAccount> </depoAccount>
<accountSymbols name="Депо КС - РДЦ" destination="accounting/depo-accounts-symbols" class="ru.clearing.classes.statics.data.account.AccountSymbols" logUpdates="true" table="depo_account_symbols"> <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"/> <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"/> <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"/> <accountSymbolValue type="2" length="255" name="Счет РДЦ" shortname="Счет РДЦ" searchable="true" sortable="true" visible="true"/>
<actions> <actions>
<post name="Добавление депо КС - РДЦ" confirmation="accountId,accountSymbolValue" class="ru.spcex.clearing.backendapi.controller.request.cud.account.AccountSymbolsNewAction"> <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"/> <accountId type="1" dbname="Идентификатор счета" name="Счет депо КС" shortname= "Счет депо КС" link="account" linkCode="account" required="true"/>
<accountSymbolValue type="2" length="255" name="Счет РДЦ" shortname="Счет РДЦ" required="true"/> <accountSymbolValue type="2" length="255" name="Счет РДЦ" shortname="Счет РДЦ" required="true"/>
</post> </post>
<delete name="Удаление депо КС - РДЦ" confirmation="accountId,accountSymbolValue"> <delete name="Удаление депо КС - РДЦ" confirmation="accountId,accountSymbolValue">
@ -1288,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>
@ -1296,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"/>
@ -1425,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"/>
@ -1437,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"/>

View file

@ -1,6 +1,6 @@
{ {
"version": "3.9.0.65", "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
} }
, ,
@ -4688,7 +4688,7 @@
} }
, ,
{"code": "accountId", {"code": "accountId",
"type": 1,"dbname": "Идентификатор счета","name": "Счет Депо КС","shortname": "Счет Депо КС","searchable": true,"sortable": true,"visible": true,"link": "account","linkCode": "account" "type": 1,"dbname": "Идентификатор счета","name": "Счет депо КС","shortname": "Счет депо КС","searchable": true,"sortable": true,"visible": true,"link": "account","linkCode": "account"
} }
, ,
{"code": "accountSymbolValue", {"code": "accountSymbolValue",
@ -4706,7 +4706,7 @@
"fields": [ "fields": [
{"code": "accountId", {"code": "accountId",
"type": 1,"dbname": "Идентификатор счета","name": "Счет Депо КС","shortname": "Счет Депо КС","link": "account","linkCode": "account","required": true "type": 1,"dbname": "Идентификатор счета","name": "Счет депо КС","shortname": "Счет депо КС","link": "account","linkCode": "account","required": true
} }
, ,
{"code": "accountSymbolValue", {"code": "accountSymbolValue",
@ -5588,6 +5588,17 @@
"name": "Проверка наличия пары ДФ-01/ДФ-57 и ДФ-08/ДФ-21", "name": "Проверка наличия пары ДФ-01/ДФ-57 и ДФ-08/ДФ-21",
"fields": []
}
,
{"method":"post",
"destination": "CCLR",
"group": "Клиринг",
"name": "Завершение неудачных клиринговых сессий",
"fields": [] "fields": []
} }
] ]
@ -5623,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",
@ -6171,11 +6182,11 @@
"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",
@ -6187,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",
@ -6227,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",
@ -6235,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",
@ -6259,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",
@ -6267,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
} }
] ]
@ -6519,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",

View file

@ -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());

View file

@ -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);

View file

@ -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;
}
} }

View file

@ -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;
}
}

View file

@ -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();
} }

View file

@ -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);
} }
} }

View file

@ -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;
}
}

View file

@ -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;
}
} }

View file

@ -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;
} }

View file

@ -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;
} }

View file

@ -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();

View file

@ -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);

View file

@ -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,

View file

@ -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());

View file

@ -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());

View file

@ -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());

View file

@ -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());

View file

@ -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);
} }
} }

View file

@ -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())

View file

@ -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;
} }

View file

@ -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);
} }

View file

@ -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()) {

View file

@ -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);
} }

View file

@ -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())
) )
) )

View file

@ -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();
} }

View file

@ -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();
}
}

View file

@ -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);

View file

@ -32,5 +32,7 @@ public enum ValidationStored {
SecurityBySecurityCode, SecurityBySecurityCode,
SessionTerminate,
RegistrysByContract, SplitDepositMaxNumber RegistrysByContract, SplitDepositMaxNumber
} }

View file

@ -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());

View file

@ -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();
} }

View file

@ -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();
} }

View file

@ -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();
} }

View file

@ -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();
} }

View file

@ -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();
} }

View file

@ -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();
} }

View file

@ -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();
} }

View file

@ -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;
}
} }

View file

@ -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;
}
}

View file

@ -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;
} }

View file

@ -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());

View file

@ -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()

View file

@ -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;
}
} }

View file

@ -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>

View file

@ -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());
}
} }

View file

@ -1,5 +1,5 @@
-- DB version: 3.9.0.64 -- DB version: 3.9.0.68
-- DATA version: 3.9.0.13 -- DATA version: 3.9.0.68
/* Dictionaries */ /* Dictionaries */
@ -506,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;
@ -1003,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;

View file

@ -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;

View file

@ -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);

View file

@ -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;
} }

View file

@ -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);

View file

@ -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));
} }

View file

@ -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;
}
} }

View file

@ -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();
} }

View file

@ -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();

View file

@ -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

View file

@ -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);

View file

@ -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");

View file

@ -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()));
} }

View file

@ -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;
}
} }

View file

@ -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;
}
} }

View file

@ -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()
@ -66,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;
}
} }
} }

View file

@ -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

View file

@ -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

View file

@ -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();

View file

@ -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");

View file

@ -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"))));
} }
} }

View file

@ -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));
}
} }

View file

@ -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));
}
} }

View file

@ -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());

View file

@ -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());
} }
} }

View file

@ -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);

View file

@ -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;
}
} }

View file

@ -41,6 +41,16 @@ public class KSRepCashNettoReport {
@CsvDate(value = "dd.MM.yyyy") @CsvDate(value = "dd.MM.yyyy")
private LocalDate date; private LocalDate date;
@CsvBindByName(column = "OBL_VALUE")
@CsvBindByPosition(position = 7)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal oblValue;
@CsvBindByName(column = "REQ_VALUE")
@CsvBindByPosition(position = 8)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal reqValue;
public String getFirmId() { public String getFirmId() {
return firmId; return firmId;
@ -98,4 +108,19 @@ public class KSRepCashNettoReport {
this.date = date; this.date = date;
} }
public BigDecimal getOblValue() {
return oblValue;
}
public void setOblValue(BigDecimal oblValue) {
this.oblValue = oblValue;
}
public BigDecimal getReqValue() {
return reqValue;
}
public void setReqValue(BigDecimal reqValue) {
this.reqValue = reqValue;
}
} }

View file

@ -7,6 +7,7 @@ import com.opencsv.bean.CsvDate;
import com.opencsv.bean.CsvNumber; import com.opencsv.bean.CsvNumber;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
public class KSRepTradesReport { public class KSRepTradesReport {
@ -23,41 +24,58 @@ public class KSRepTradesReport {
@CsvBindByPosition(position = 2) @CsvBindByPosition(position = 2)
private Long trId; private Long trId;
@CsvBindByName(column = "FIRM_ID") @CsvBindByName(column = "AGREEMENT_NUMBER")
@CsvBindByPosition(position = 3) @CsvBindByPosition(position = 3)
private String agreementNumber;
@CsvBindByName(column = "FIRM_ID")
@CsvBindByPosition(position = 4)
private String firmId; private String firmId;
@CsvBindByName(column = "TKR") @CsvBindByName(column = "TKR")
@CsvBindByPosition(position = 4) @CsvBindByPosition(position = 5)
private String tkr; private String tkr;
@CsvBindByName(column = "ACCOUNT")
@CsvBindByPosition(position = 6)
private String account;
@CsvBindByName(column = "DEPO_ACCOUNT")
@CsvBindByPosition(position = 7)
private String depoAccount;
@CsvBindByName(column = "CASH_LIABILITY") @CsvBindByName(column = "CASH_LIABILITY")
@CsvBindByPosition(position = 5) @CsvBindByPosition(position = 8)
@CsvNumber(value = "#0.00", writeFormat = "#0.00") @CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal cashLiability; private BigDecimal cashLiability;
@CsvBindByName(column = "DEPO_LIABILITY") @CsvBindByName(column = "DEPO_LIABILITY")
@CsvBindByPosition(position = 6) @CsvBindByPosition(position = 9)
@CsvNumber(value = "#0", writeFormat = "#0") @CsvNumber(value = "#0", writeFormat = "#0")
private BigDecimal depoLiability; private BigDecimal depoLiability;
@CsvBindByName(column = "TRADE_NUM") @CsvBindByName(column = "TRADE_NUM")
@CsvBindByPosition(position = 7) @CsvBindByPosition(position = 10)
private Long tradeNum; private Long tradeNum;
@CsvBindByName(column = "CLASS_CODE") @CsvBindByName(column = "CLASS_CODE")
@CsvBindByPosition(position = 8) @CsvBindByPosition(position = 11)
private String classCode; private String classCode;
@CsvBindByName(column = "TRADE_DATE") @CsvBindByName(column = "TRADE_DATE")
@CsvBindByPosition(position = 9) @CsvBindByPosition(position = 12)
@CsvDate(value = "dd.MM.yyyy'T'HH:mm:ss") @CsvDate(value = "dd.MM.yyyy'T'HH:mm:ss")
private LocalDateTime tradeDate; private LocalDateTime tradeDate;
@CsvBindByName(column = "STATUS") @CsvBindByName(column = "STATUS")
@CsvBindByPosition(position = 10) @CsvBindByPosition(position = 13)
private String status; private String status;
@CsvBindByName(column = "REPAYM_DATE")
@CsvBindByPosition(position = 14)
@CsvDate(value = "dd.MM.yyyy")
private LocalDate repaymDate;
public Long getSessionId() { public Long getSessionId() {
return sessionId; return sessionId;
@ -146,4 +164,36 @@ public class KSRepTradesReport {
public void setStatus(String status) { public void setStatus(String status) {
this.status = status; this.status = status;
} }
public String getAgreementNumber() {
return agreementNumber;
}
public void setAgreementNumber(String agreementNumber) {
this.agreementNumber = agreementNumber;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getDepoAccount() {
return depoAccount;
}
public void setDepoAccount(String depoAccount) {
this.depoAccount = depoAccount;
}
public LocalDate getRepaymDate() {
return repaymDate;
}
public void setRepaymDate(LocalDate repaymDate) {
this.repaymDate = repaymDate;
}
} }

View file

@ -3,7 +3,9 @@ package ru.spcex.clearing.reports.builders.bean;
import com.opencsv.bean.CsvBindByName; import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvBindByPosition; import com.opencsv.bean.CsvBindByPosition;
import com.opencsv.bean.CsvDate; import com.opencsv.bean.CsvDate;
import com.opencsv.bean.CsvNumber;
import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
public class UnfulfilledDealReport { public class UnfulfilledDealReport {
@ -25,6 +27,11 @@ public class UnfulfilledDealReport {
@CsvBindByPosition(position = 3) @CsvBindByPosition(position = 3)
private String settleCode; private String settleCode;
@CsvBindByName(column = "VALUE")
@CsvBindByPosition(position = 4)
@CsvNumber(value = "#0.00", writeFormat = "#0.00")
private BigDecimal value;
public String getSecurityId() { public String getSecurityId() {
return securityId; return securityId;
@ -58,4 +65,11 @@ public class UnfulfilledDealReport {
this.settleCode = settleCode; this.settleCode = settleCode;
} }
public BigDecimal getValue() {
return value;
}
public void setValue(BigDecimal value) {
this.value = value;
}
} }

View file

@ -89,6 +89,7 @@ public class UnfulfilledDealReportBuilder extends CSVReportBuilder<SessionIdPara
unfulfilledDealReport.setTradeNo(executionFond.getExchangeExecutionId()); unfulfilledDealReport.setTradeNo(executionFond.getExchangeExecutionId());
unfulfilledDealReport.setTradeDate(executionFond.getTradingDate()); unfulfilledDealReport.setTradeDate(executionFond.getTradingDate());
unfulfilledDealReport.setSettleCode(executionFond.getSettlementCode()); unfulfilledDealReport.setSettleCode(executionFond.getSettlementCode());
unfulfilledDealReport.setValue(executionFond.getSettlementAmount());
rows.add(unfulfilledDealReport); rows.add(unfulfilledDealReport);
} catch (Throwable e) { } catch (Throwable e) {

View file

@ -1,9 +1,10 @@
package ru.spcex.clearing.reports.builders.ks; package ru.spcex.clearing.reports.builders.ks;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
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.execution.ExecutionDeposit; import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.reports.builders.CSVReportBuilder; import ru.spcex.clearing.reports.builders.CSVReportBuilder;
@ -17,12 +18,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 ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IEnumKey;
import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
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.Map;
@Component @Component
public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSCommissionTradesReport> { public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSCommissionTradesReport> {
@ -30,16 +32,18 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
private final Imdg<Registry> registryImdg; private final Imdg<Registry> registryImdg;
private final Imdg<Company> companyImdg; private final Imdg<Company> companyImdg;
private final Imdg<CompanySymbols> companySymbolsImdg;
private final Imdg<ExecutionDeposit> executionDepositImdg; private final Imdg<ExecutionDeposit> executionDepositImdg;
private final Imdg<Account> accountImdg;
private final Imdg<Session> sessionImdg;
private List<KSCommissionTradesReport> rows = null; private List<KSCommissionTradesReport> rows = null;
public KSCommissionTradesReportBuilder(ImdgProvider imdgProvider) { public KSCommissionTradesReportBuilder(ImdgProvider imdgProvider) {
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class); executionDepositImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class);
accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
} }
@Override @Override
@ -80,15 +84,15 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.TS_T).build(); String sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.TS_T).build();
ImdgPredicate finalPredicate = pb.and( ImdgPredicate finalPredicate = pb.and(
pb.sql(sql), pb.sql(sql),
pb.equals("refundDate", nowDate), pb.greatEqual("refundDate", nowDate),
pb.less("valueDate", nowDate), pb.lessEqual("valueDate", nowDate),
pb.equals("registryStatus", RegistryStatus.CLRD.getKey()), pb.in("sessionType", SessionType.XDEP.getKey(), SessionType.FINL.getKey(), SessionType.MEDM.getKey())
pb.or(pb.equals("sessionType", SessionType.XDEP.getKey()), pb.equals("sessionType", SessionType.FINL.getKey()))
); );
Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate); Collection<Registry> registries = registryImdg.getCollectionObjectsByPredicate(finalPredicate);
log.debug("Found {} Registry by query: {}", registries.size(), finalPredicate); log.debug("Found {} Registry by query: {}", registries.size(), finalPredicate);
rows = new ArrayList<>(registries.size()); rows = new ArrayList<>(registries.size());
for (Registry registry : registries) { for (Registry registry : registries) {
if (registry.getValueDate().equals(registry.getSettlementDate())) continue;
if (registry.getTradingDate() == null) { if (registry.getTradingDate() == null) {
log.warn("For registry id = {} field TradingDate was null, registry was skipped", log.warn("For registry id = {} field TradingDate was null, registry was skipped",
registry.getId()); registry.getId());
@ -108,8 +112,8 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
continue; continue;
} }
String firmId = ""; String firmId = null;
String firmIdInitiator = ""; String firmIdInitiator = null;
if (registryUnit == RegistryUnit.X) { if (registryUnit == RegistryUnit.X) {
firmIdInitiator = registry.getTradingCode(); firmIdInitiator = registry.getTradingCode();
} else if (registryUnit == RegistryUnit.T) { } else if (registryUnit == RegistryUnit.T) {
@ -125,29 +129,21 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
} }
} }
// sql = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.OM_T).build(); String execStatus = null;
// Registry omtRegistry = registryImdg.getFirstObjectByPredicate( RegistryStatus registryStatus = IEnumKey.getEnumByKey(RegistryStatus.class, registry.getRegistryStatus());
// pb.and( if (registryStatus == RegistryStatus.CLRD) execStatus = "Исполнен";
// pb.sql(sql), else if (registryStatus == RegistryStatus.FAIL) execStatus = "Не исполнен";
// pb.equals("contract", registry.getContract()), else if (registryStatus == RegistryStatus.MNG || registryStatus == RegistryStatus.PROC) {
// pb.notNull("groupId") if (registry.getSettlementDate() == null) {
// ) log.warn("Can't define status: registry.settlementDate is null. Registry was skipped");
// ); continue;
// if (omtRegistry == null) { }
// log.warn("Can't find pair OM_T registry for contract = {}. Registry id = {} skipped", if (registry.getSettlementDate().isAfter(nowDate)) {
// registry.getContract(), execStatus = "Срок исполнения не наступил";
// registry.getId()); } else {
// continue; execStatus = "Ожидает исполнения";
// } }
// String tradeNum = extractPartAgreementNumber(String.valueOf(omtRegistry.getGroupId())); }
// if (tradeNum == null) {
// log.warn("Can't extract TradeNum from GroupId (groupId = {} for OM_T registry id = {}). " +
// "Registry id = {} skipped",
// omtRegistry.getGroupId(),
// omtRegistry.getId(),
// registry.getId());
// continue;
// }
String agreementNumber = registry.getContract(); String agreementNumber = registry.getContract();
if (agreementNumber != null && agreementNumber.contains("~")) if (agreementNumber != null && agreementNumber.contains("~"))
@ -169,6 +165,51 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
if (executionDeposits.size() > 1) log.warn("ExecutionDeposit[exchangeExecutionId = {}].size > 1, use first", registry.getGroupId()); if (executionDeposits.size() > 1) log.warn("ExecutionDeposit[exchangeExecutionId = {}].size > 1, use first", registry.getGroupId());
ExecutionDeposit executionDeposit = executionDeposits.iterator().next(); ExecutionDeposit executionDeposit = executionDeposits.iterator().next();
String account = null;
AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType());
if (accountType == AccountType.Clrn) {
account = registry.getAccount();
} else if (accountType == AccountType.Info) {
Account accountFromImdg = accountImdg.getFirstObjectByFieldValues(Map.of(
"accountType", AccountType.Anlt.getKey(),
"companyId", 1L
));
account = accountFromImdg.getAccount();
}
String tkrInitiator = null;
String accountInitiator = null;
ImdgPredicate tmtPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.TM_T).buildPredicate(pb);
Registry tmtRegistry = registryImdg.getFirstObjectByPredicate(
pb.and(
pb.equals("counterPartyId", registry.getCompanyId()),
pb.equals("groupId", registry.getGroupId()),
tmtPredicate
)
);
if (tmtRegistry != null) {
tkrInitiator = tmtRegistry.getTradingClearingRegistry();
accountType = IEnumKey.getEnumByKey(AccountType.class, tmtRegistry.getAccountType());
if (accountType == AccountType.Clrn) {
accountInitiator = tmtRegistry.getAccount();
} else if (accountType == AccountType.Info) {
Account accountFromImdg = accountImdg.getFirstObjectByFieldValues(Map.of(
"accountType", AccountType.Anlt.getKey(),
"companyId", 1L
));
accountInitiator = accountFromImdg.getAccount();
}
}
Session session = sessionImdg.getSingleObjectByID(registry.getSessionId());
LocalDateTime sessionDate = null;
Long sessionId = null;
if (registryStatus != RegistryStatus.MNG && registryStatus != RegistryStatus.PROC) {
sessionId = registry.getSessionId();
if (session != null) {
sessionDate = LocalDateTime.ofInstant(session.getCreated(), getReportZoneId());
}
}
KSCommissionTradesReport ksCommissionTradesReport = new KSCommissionTradesReport(); KSCommissionTradesReport ksCommissionTradesReport = new KSCommissionTradesReport();
ksCommissionTradesReport.setFirmId(firmId); ksCommissionTradesReport.setFirmId(firmId);
ksCommissionTradesReport.setFirmIdInitiator(firmIdInitiator); ksCommissionTradesReport.setFirmIdInitiator(firmIdInitiator);
@ -180,9 +221,17 @@ public class KSCommissionTradesReportBuilder extends CSVReportBuilder<EmptyParam
ksCommissionTradesReport.setAgreementNumber(agreementNumber); ksCommissionTradesReport.setAgreementNumber(agreementNumber);
ksCommissionTradesReport.setAgreementNumberPostfix(agreementNumberPostfix); ksCommissionTradesReport.setAgreementNumberPostfix(agreementNumberPostfix);
ksCommissionTradesReport.setAgreementDate(registry.getTradingDate()); ksCommissionTradesReport.setAgreementDate(registry.getTradingDate());
ksCommissionTradesReport.setSum(registry.getBalance() != null ? registry.getBalance().negate() : BigDecimal.ZERO); ksCommissionTradesReport.setSum(registry.getBalance() != null ? registry.getBalance().negate() : null);
ksCommissionTradesReport.setRepaymDate(registry.getRefundDate()); ksCommissionTradesReport.setRepaymDate(registry.getRefundDate());
ksCommissionTradesReport.setExecStatus("Исполнено"); ksCommissionTradesReport.setExecStatus(execStatus);
ksCommissionTradesReport.setAgreementSettlementDate(registry.getValueDate());
ksCommissionTradesReport.setTrId(registry.getGroupId());
ksCommissionTradesReport.setTkr(registry.getTradingClearingRegistry());
ksCommissionTradesReport.setAccount(account);
ksCommissionTradesReport.setSessionId(sessionId);
ksCommissionTradesReport.setSessionDate(sessionDate);
ksCommissionTradesReport.setTkrInitiator(tkrInitiator);
ksCommissionTradesReport.setAccountInitiator(accountInitiator);
rows.add(ksCommissionTradesReport); rows.add(ksCommissionTradesReport);
} catch (Throwable e) { } catch (Throwable e) {

View file

@ -20,10 +20,7 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.*;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Component @Component
@ -114,8 +111,8 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
boolean invalid = false; boolean invalid = false;
if (!cmtRegistries.isEmpty() || !lmtRegistries.isEmpty()) { if (!cmtRegistries.isEmpty() || !lmtRegistries.isEmpty()) {
String sourceTradingCode = ""; String sourceTradingCode = null;
String sourceTkr = ""; String sourceTkr = null;
if (!cmtRegistries.isEmpty()) { if (!cmtRegistries.isEmpty()) {
Registry next = cmtRegistries.iterator().next(); Registry next = cmtRegistries.iterator().next();
sourceTradingCode = next.getTradingCode(); sourceTradingCode = next.getTradingCode();
@ -127,24 +124,24 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
sourceTkr = next.getTradingClearingRegistry(); sourceTkr = next.getTradingClearingRegistry();
} }
for (Registry currRegistry : cmtRegistries) { for (Registry currRegistry : cmtRegistries) {
if (!sourceTradingCode.equals(currRegistry.getTradingCode())) { if (!Objects.equals(sourceTradingCode, currRegistry.getTradingCode())) {
invalid = true; invalid = true;
log.warn("Invalid CM_T registries set, tradingCode not equals. Registries was skipped"); log.warn("Invalid CM_T registries set, tradingCode not equals. Registries was skipped");
break; break;
} }
if (!sourceTkr.equals(currRegistry.getTradingClearingRegistry())) { if (!Objects.equals(sourceTkr, currRegistry.getTradingClearingRegistry())) {
invalid = true; invalid = true;
log.warn("Invalid CM_T registries set, tradingClearingRegistry not equals. Registries was skipped"); log.warn("Invalid CM_T registries set, tradingClearingRegistry not equals. Registries was skipped");
break; break;
} }
} }
for (Registry currRegistry : lmtRegistries) { for (Registry currRegistry : lmtRegistries) {
if (!sourceTradingCode.equals(currRegistry.getTradingCode())) { if (!Objects.equals(sourceTradingCode, currRegistry.getTradingCode())) {
invalid = true; invalid = true;
log.warn("Invalid LM_T registries set, tradingCode not equals. Registries was skipped"); log.warn("Invalid LM_T registries set, tradingCode not equals. Registries was skipped");
break; break;
} }
if (!sourceTkr.equals(currRegistry.getTradingClearingRegistry())) { if (!Objects.equals(sourceTkr, currRegistry.getTradingClearingRegistry())) {
invalid = true; invalid = true;
log.warn("Invalid CM_T registries set, tradingClearingRegistry not equals. Registries was skipped"); log.warn("Invalid CM_T registries set, tradingClearingRegistry not equals. Registries was skipped");
break; break;
@ -163,7 +160,7 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
ksRepCashNettoReport.setSessionDate(LocalDateTime.ofInstant(session.getCreated(), getReportZoneId())); ksRepCashNettoReport.setSessionDate(LocalDateTime.ofInstant(session.getCreated(), getReportZoneId()));
String account = ""; String account = null;
AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType()); AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType());
if (accountType == AccountType.Clrn) { if (accountType == AccountType.Clrn) {
account = registry.getAccount(); account = registry.getAccount();
@ -180,13 +177,55 @@ public class KSRepCashNettoReportBuilder extends CSVReportBuilder<SessionIdParam
BigDecimal cmtBalance = BigDecimal.ZERO; BigDecimal cmtBalance = BigDecimal.ZERO;
BigDecimal lmtBalance = BigDecimal.ZERO; BigDecimal lmtBalance = BigDecimal.ZERO;
BigDecimal oblValue = BigDecimal.ZERO;
BigDecimal reqValue = BigDecimal.ZERO;
boolean withValue = false;
boolean withOblReqValue = false;
Set<SessionType> sessionTypeForValue = Set.of(
SessionType.IPOT,
SessionType.TRDT,
SessionType.LIQU,
SessionType.IPOB,
SessionType.IPO0
);
Set<SessionType> sessionTypeForOblReqValue = Set.of(
SessionType.FINL,
SessionType.MEDM,
SessionType.XDEP
);
for (Registry cmtRegistry : cmtRegistries) { for (Registry cmtRegistry : cmtRegistries) {
if (cmtRegistry.getBalance() != null) cmtBalance = cmtBalance.add(cmtRegistry.getBalance()); if (cmtRegistry.getBalance() != null) {
SessionType sessionType = IEnumKey.getEnumByKey(SessionType.class, cmtRegistry.getSessionType());
if (sessionType == null) continue;
if (sessionTypeForValue.contains(sessionType)) {
cmtBalance = cmtBalance.add(cmtRegistry.getBalance());
withValue = true;
}
if (sessionTypeForOblReqValue.contains(sessionType)) {
reqValue = reqValue.add(cmtRegistry.getBalance());
withOblReqValue = true;
}
}
} }
for (Registry lmtRegistry : lmtRegistries) { for (Registry lmtRegistry : lmtRegistries) {
if (lmtRegistry.getBalance() != null) lmtBalance = lmtBalance.add(lmtRegistry.getBalance()); if (lmtRegistry.getBalance() != null) {
SessionType sessionType = IEnumKey.getEnumByKey(SessionType.class, lmtRegistry.getSessionType());
if (sessionType == null) continue;
if (sessionTypeForValue.contains(sessionType)) {
lmtBalance = lmtBalance.add(lmtRegistry.getBalance());
withValue = true;
}
if (sessionTypeForOblReqValue.contains(sessionType)) {
oblValue = oblValue.add(lmtRegistry.getBalance());
withOblReqValue = true;
}
}
} }
ksRepCashNettoReport.setValue(cmtBalance.subtract(lmtBalance)); BigDecimal value;
value = cmtBalance.subtract(lmtBalance);
ksRepCashNettoReport.setValue(withValue ? value : null);
ksRepCashNettoReport.setOblValue(withOblReqValue ? oblValue : null);
ksRepCashNettoReport.setReqValue(withOblReqValue ? reqValue : null);
rows.add(ksRepCashNettoReport); rows.add(ksRepCashNettoReport);
} catch (Throwable e) { } catch (Throwable e) {

View file

@ -110,7 +110,7 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyPa
pairRegistry.getId()); pairRegistry.getId());
} }
String account = ""; String account = null;
AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType()); AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType());
if (accountType == AccountType.Clrn) { if (accountType == AccountType.Clrn) {
account = registry.getAccount(); account = registry.getAccount();
@ -124,7 +124,7 @@ public class KSRepCashRegisterSumsReportBuilder extends CSVReportBuilder<EmptyPa
String firmId = registry.getTradingCode(); String firmId = registry.getTradingCode();
String tkr = registry.getTradingClearingRegistry(); String tkr = registry.getTradingClearingRegistry();
String tradeNum = ""; String tradeNum = null;
String registerCode = pairRegistry != null ? pairRegistry.getRegistryCode() : ""; String registerCode = pairRegistry != null ? pairRegistry.getRegistryCode() : "";
BigDecimal addSum = registry.getBalance() != null ? registry.getBalance() :BigDecimal.ZERO; BigDecimal addSum = registry.getBalance() != null ? registry.getBalance() :BigDecimal.ZERO;
Instant addTime = registry.getUpdated(); Instant addTime = registry.getUpdated();

View file

@ -22,10 +22,7 @@ import java.math.BigDecimal;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.ArrayList; import java.util.*;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@Component @Component
public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParams, KSRepCashRegistersReport> { public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParams, KSRepCashRegistersReport> {
@ -100,7 +97,7 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
} }
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue; if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus())) continue;
String account = ""; String account = null;
AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType()); AccountType accountType = IEnumKey.getEnumByKey(AccountType.class, registry.getAccountType());
if (accountType == AccountType.Clrn) { if (accountType == AccountType.Clrn) {
account = registry.getAccount(); account = registry.getAccount();
@ -110,7 +107,8 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
"accountType", AccountType.Anlt.getKey() "accountType", AccountType.Anlt.getKey()
)); ));
if (accountFromIMDG != null) account = accountFromIMDG.getAccount(); if (accountFromIMDG != null) account = accountFromIMDG.getAccount();
} KSRepCashRegistersReport ksRepCashRegistersReport = new KSRepCashRegistersReport(); }
KSRepCashRegistersReport ksRepCashRegistersReport = new KSRepCashRegistersReport();
ksRepCashRegistersReport.setFirmId(registry.getTradingCode()); ksRepCashRegistersReport.setFirmId(registry.getTradingCode());
ksRepCashRegistersReport.setAccount(account); ksRepCashRegistersReport.setAccount(account);
@ -121,7 +119,8 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
BigDecimal openBalance = registry.getOpenBalance() != null ? registry.getOpenBalance() : BigDecimal.ZERO; BigDecimal openBalance = registry.getOpenBalance() != null ? registry.getOpenBalance() : BigDecimal.ZERO;
ksRepCashRegistersReport.setOpenBalance(openBalance); ksRepCashRegistersReport.setOpenBalance(openBalance);
ksRepCashRegistersReport.setRemarks(""); ksRepCashRegistersReport.setRemarks(null);
ksRepCashRegistersReport.setTradeNum(null);
RegistryCodeDictionary registryCodeDictionary = registryCodeDictionaryImdg.getFirstObjectByFieldValues(Map.of("code", registry.getRegistryCode())); RegistryCodeDictionary registryCodeDictionary = registryCodeDictionaryImdg.getFirstObjectByFieldValues(Map.of("code", registry.getRegistryCode()));
if (registryCodeDictionary != null) ksRepCashRegistersReport.setRegisterName(registryCodeDictionary.getName()); if (registryCodeDictionary != null) ksRepCashRegistersReport.setRegisterName(registryCodeDictionary.getName());
@ -151,9 +150,27 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
pb.equals("registryStatus", RegistryStatus.CLRD.getKey()) pb.equals("registryStatus", RegistryStatus.CLRD.getKey())
) )
); );
BigDecimal cmtBalanceSum = cmtRegistries.stream().map(Registry::getBalance).reduce(BigDecimal.ZERO, BigDecimal::add); Set<String> contracts = new HashSet<>();
BigDecimal cmtBalanceSum = BigDecimal.ZERO;
for (Registry cmtRegistry : cmtRegistries) {
BigDecimal balance = cmtRegistry.getBalance();
cmtBalanceSum = cmtBalanceSum.add(balance);
contracts.add(cmtRegistry.getContract());
}
ImdgPredicate dmxPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.DM_X).buildPredicate(pb);
Collection<Registry> dmxRegistries = registryImdg.getCollectionObjectsByPredicate(
pb.and(
dmxPredicate,
pb.in("contract", contracts.toArray(new String[0])),
pb.equals("tradingCode", registry.getTradingCode()),
pb.equals("companyId", registry.getCompanyId()),
pb.equals("account", registry.getAccount()),
pb.equals("registryStatus", RegistryStatus.OK.getKey())
)
);
BigDecimal dmxBalanceSum = dmxRegistries.stream().map(Registry::getBalance).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal lmtBalanceSum = lmtRegistries.stream().map(Registry::getBalance).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal lmtBalanceSum = lmtRegistries.stream().map(Registry::getBalance).reduce(BigDecimal.ZERO, BigDecimal::add);
ksRepCashRegistersReport.setChangeBalance(cmtBalanceSum.subtract(lmtBalanceSum)); ksRepCashRegistersReport.setChangeBalance(cmtBalanceSum.subtract(lmtBalanceSum).subtract(dmxBalanceSum));
registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.DM_I).buildPredicate(pb); registryPredicate = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams.DM_I).buildPredicate(pb);
@ -170,7 +187,9 @@ public class KSRepCashRegistersReportBuilder extends CSVReportBuilder<EmptyParam
) )
); );
BigDecimal addWithdraw = BigDecimal.ZERO; BigDecimal addWithdraw = BigDecimal.ZERO;
for (Registry currRegistry : registriesForAddWithdraw) addWithdraw = addWithdraw.add(currRegistry.getBalance()); for (Registry currRegistry : registriesForAddWithdraw) {
addWithdraw = addWithdraw.add(currRegistry.getBalance());
}
ksRepCashRegistersReport.setAddWithdraw(addWithdraw); ksRepCashRegistersReport.setAddWithdraw(addWithdraw);
BigDecimal closeBalance = ksRepCashRegistersReport.getOpenBalance() BigDecimal closeBalance = ksRepCashRegistersReport.getOpenBalance()

View file

@ -20,10 +20,7 @@ import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.*;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Component @Component
@ -90,9 +87,8 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
List<Registry> groupedRegistry = entry.getValue(); List<Registry> groupedRegistry = entry.getValue();
try { try {
if (groupedRegistry.isEmpty()) { if (groupedRegistry.isEmpty()) {
log.warn("Empty LS_T and CS_T registries for {}. Registries with id = [{}] was skipped", log.warn("Empty LS_T and CS_T registries for {}",
pairRegistryId, pairRegistryId
groupedRegistry.stream().map(r -> String.valueOf(r.getId())).collect(Collectors.joining(", "))
); );
continue; continue;
} }
@ -110,17 +106,17 @@ public class KSRepDepoNettoReportBuilder extends CSVReportBuilder<SessionIdParam
boolean invalid = false; boolean invalid = false;
if (!cstRegistries.isEmpty() || !lstRegistries.isEmpty()) { if (!cstRegistries.isEmpty() || !lstRegistries.isEmpty()) {
String sourceTradingCode = ""; String sourceTradingCode = null;
if (!cstRegistries.isEmpty()) sourceTradingCode = cstRegistries.iterator().next().getTradingCode(); if (!cstRegistries.isEmpty()) sourceTradingCode = cstRegistries.iterator().next().getTradingCode();
if (!lstRegistries.isEmpty()) sourceTradingCode = lstRegistries.iterator().next().getTradingCode(); if (!lstRegistries.isEmpty()) sourceTradingCode = lstRegistries.iterator().next().getTradingCode();
for (Registry currRegistry : cstRegistries) { for (Registry currRegistry : cstRegistries) {
if (sourceTradingCode.equals(currRegistry.getTradingCode())) continue; if (Objects.equals(sourceTradingCode, currRegistry.getTradingCode())) continue;
invalid = true; invalid = true;
log.warn("Invalid CS_T registries set, tradingCode not equals. Registries was skipped"); log.warn("Invalid CS_T registries set, tradingCode not equals. Registries was skipped");
break; break;
} }
for (Registry currRegistry : lstRegistries) { for (Registry currRegistry : lstRegistries) {
if (sourceTradingCode.equals(currRegistry.getTradingCode())) continue; if (Objects.equals(sourceTradingCode, currRegistry.getTradingCode())) continue;
invalid = true; invalid = true;
log.warn("Invalid LS_T registries set, tradingCode not equals. Registries was skipped"); log.warn("Invalid LS_T registries set, tradingCode not equals. Registries was skipped");
break; break;

View file

@ -120,10 +120,10 @@ public class KSRepDepoRegisterQuantitiesReportBuilder extends CSVReportBuilder<E
String firmId = registry.getTradingCode(); String firmId = registry.getTradingCode();
String tkr = registry.getTradingClearingRegistry(); String tkr = registry.getTradingClearingRegistry();
String tradeNum = ""; String tradeNum = null;
String securityId = registry.getSecuritySymbol(); String securityId = registry.getSecuritySymbol();
String registerCode = pairRegistry != null ? pairRegistry.getRegistryCode() : ""; String registerCode = pairRegistry != null ? pairRegistry.getRegistryCode() : null;
BigDecimal addQuantity = registry.getBalance() != null ? registry.getBalance() :BigDecimal.ZERO; BigDecimal addQuantity = registry.getBalance();
Instant addTime = registry.getUpdated(); Instant addTime = registry.getUpdated();
LocalDate addDate = LocalDate.now(); LocalDate addDate = LocalDate.now();

View file

@ -108,10 +108,11 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParam
ksRepDepoRegistersReport.setSecurityId(registry.getSecuritySymbol()); ksRepDepoRegistersReport.setSecurityId(registry.getSecuritySymbol());
ksRepDepoRegistersReport.setRegisterCode(registry.getRegistryCode()); ksRepDepoRegistersReport.setRegisterCode(registry.getRegistryCode());
BigDecimal openBalance = registry.getOpenBalance() != null ? registry.getOpenBalance() : BigDecimal.ZERO; BigDecimal openBalance = registry.getOpenBalance();
ksRepDepoRegistersReport.setOpenQuantity(openBalance); ksRepDepoRegistersReport.setOpenQuantity(openBalance);
ksRepDepoRegistersReport.setRemarks(null); ksRepDepoRegistersReport.setRemarks(null);
ksRepDepoRegistersReport.setTradeNum(null);
RegistryCodeDictionary registryCodeDescription = registryCodeDictionaryImdg.getFirstObjectByFieldValues(Map.of("code", registry.getRegistryCode())); RegistryCodeDictionary registryCodeDescription = registryCodeDictionaryImdg.getFirstObjectByFieldValues(Map.of("code", registry.getRegistryCode()));
if (registryCodeDescription != null) ksRepDepoRegistersReport.setRegisterName(registryCodeDescription.getName()); if (registryCodeDescription != null) ksRepDepoRegistersReport.setRegisterName(registryCodeDescription.getName());
@ -137,7 +138,7 @@ public class KSRepDepoRegistersReportBuilder extends CSVReportBuilder<EmptyParam
for (Registry currRegistry : registriesForAddWithdraw) addWithdraw = addWithdraw.add(currRegistry.getBalance()); for (Registry currRegistry : registriesForAddWithdraw) addWithdraw = addWithdraw.add(currRegistry.getBalance());
ksRepDepoRegistersReport.setAddWithdrawDepo(addWithdraw); ksRepDepoRegistersReport.setAddWithdrawDepo(addWithdraw);
BigDecimal closeBalance = ksRepDepoRegistersReport.getOpenQuantity() BigDecimal closeBalance = (ksRepDepoRegistersReport.getOpenQuantity() != null ? ksRepDepoRegistersReport.getOpenQuantity() : BigDecimal.ZERO)
.add(ksRepDepoRegistersReport.getChangeQuantity()) .add(ksRepDepoRegistersReport.getChangeQuantity())
.add(ksRepDepoRegistersReport.getAddWithdrawDepo()); .add(ksRepDepoRegistersReport.getAddWithdrawDepo());
ksRepDepoRegistersReport.setCloseQuantity(closeBalance); ksRepDepoRegistersReport.setCloseQuantity(closeBalance);

View file

@ -1,11 +1,12 @@
package ru.spcex.clearing.reports.builders.ks; package ru.spcex.clearing.reports.builders.ks;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.AccountSymbols;
import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.execution.ExecutionCommon; import ru.clearing.classes.statics.data.execution.ExecutionCommon;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit; import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.execution.ExecutionFond; import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.clearing.classes.statics.data.misc.Market;
import ru.clearing.classes.statics.data.misc.Session; import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry; import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry; import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
@ -16,7 +17,6 @@ import ru.spcex.clearing.reports.builders.bean.KSRepTradesReport;
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.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder; import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
import ru.spcex.platform.utils.enumeration.IEnumKey; import ru.spcex.platform.utils.enumeration.IEnumKey;
@ -24,20 +24,21 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.time.format.DateTimeFormatter;
import java.util.Arrays; import java.util.*;
import java.util.Collection;
import java.util.List;
@Component @Component
public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRepTradesReport> { public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRepTradesReport> {
private final DateTimeFormatter ddMMyyyyFormatter = DateTimeFormatter.ofPattern("ddMMyyyy");
private final Imdg<ExecutionDeposit> executionDepositImdg; private final Imdg<ExecutionDeposit> executionDepositImdg;
private final Imdg<ExecutionFond> executionFondImdg; private final Imdg<ExecutionFond> executionFondImdg;
private final Imdg<Session> sessionImdg; private final Imdg<Session> sessionImdg;
private final Imdg<Registry> registryImdg; private final Imdg<Registry> registryImdg;
private final Imdg<Market> marketImdg;
private final Imdg<Company> companyImdg; private final Imdg<Company> companyImdg;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg; private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<Account> accountImdg;
private final Imdg<AccountSymbols> accountSymbolsImdg;
private List<KSRepTradesReport> rows = null; private List<KSRepTradesReport> rows = null;
@ -47,8 +48,9 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class); registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, Market.class);
tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
accountSymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
} }
@Override @Override
@ -94,6 +96,49 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
executions.addAll(executionDeposits); executions.addAll(executionDeposits);
executions.addAll(executionFonds); executions.addAll(executionFonds);
Map<ExecutionKey, String> statusForExecution = new HashMap<>();
executions.forEach(execution -> {
if (Set.of("S", "SELL").contains(execution.getSide())) {
String status = null;
if (execution.getCoverageStatus() != null) {
Long groupId = execution.getExchangeExecutionId();
String coverageStatus = execution.getCoverageStatus().toUpperCase();
CoverageStatus coverage = IEnumKey.getEnumByKey(CoverageStatus.class, coverageStatus);
// Есть 2 пары Execution, SELL и BUY, статус определяем заранее по SELL и проставляем в BUY
if (coverage == CoverageStatus.DEND) {
if (execution instanceof ExecutionFond) {
ImdgPredicateBuilder pbRegistry = registryImdg.predicateBuilder();
String registryPredicateStr = RegistryCodeSqlBuilder.getInstance(RegistryTradingParams._S_T).build();
Collection<Registry> registryCollection = registryImdg.getCollectionObjectsByPredicate(
pbRegistry.and(
pbRegistry.equals("groupId", groupId),
pbRegistry.equals("companyId", execution.getCompanyId()),
pbRegistry.in("registryStatus",
RegistryStatus.NACC.getKey(),
RegistryStatus.NACK.getKey(),
RegistryStatus.FAIL.getKey(),
RegistryStatus.UNCV.getKey()),
pbRegistry.sql(registryPredicateStr)
)
);
if (registryCollection.isEmpty()) {
status = null;
} else {
Registry registry = registryCollection.iterator().next();
RegistryStatus registryStatus = IEnumKey.getEnumByKey(RegistryStatus.class, registry.getRegistryStatus());
if (registryStatus == RegistryStatus.NACK || registryStatus == RegistryStatus.UNCV) {
status = "3";
} else if (registryStatus == RegistryStatus.NACC || registryStatus == RegistryStatus.FAIL) {
status = "2";
}
}
}
statusForExecution.put(new ExecutionKey(groupId, execution.getSessionId()), status);
}
}
}
});
rows = new ArrayList<>(executions.size()); rows = new ArrayList<>(executions.size());
for (ExecutionCommon execution : executions) { for (ExecutionCommon execution : executions) {
try { try {
@ -111,6 +156,23 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
ksRepTradesReport.setTkr(tkr.getCode()); ksRepTradesReport.setTkr(tkr.getCode());
String account = null;
if (tkr.getMoneyAccountId() != null) {
Account moneyAccountFromImdg = accountImdg.getSingleObjectByID(tkr.getMoneyAccountId());
if (moneyAccountFromImdg != null) {
if (AccountType.Info.equalsByKey(moneyAccountFromImdg.getAccountType())) {
moneyAccountFromImdg = accountImdg.getFirstObjectByFieldValues(Map.of(
"companyId", 1L,
"accountType", AccountType.Anlt.getKey()
));
}
account = moneyAccountFromImdg.getAccount();
}
}
ksRepTradesReport.setAccount(account);
if (execution.getCompanyId() != null) { if (execution.getCompanyId() != null) {
Company company = companyImdg.getSingleObjectByID(execution.getCompanyId()); Company company = companyImdg.getSingleObjectByID(execution.getCompanyId());
ksRepTradesReport.setFirmId(company != null ? company.getTradingCode() : null); ksRepTradesReport.setFirmId(company != null ? company.getTradingCode() : null);
@ -128,7 +190,10 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
continue; continue;
} }
String depoAccount = null;
String agreementNumber = null;
if (execution instanceof ExecutionDeposit executionDeposit) { if (execution instanceof ExecutionDeposit executionDeposit) {
agreementNumber = executionDeposit.getContract();
BigDecimal firstLegAmount = executionDeposit.getFirstLegAmount() != null ? executionDeposit.getFirstLegAmount() : BigDecimal.ZERO; BigDecimal firstLegAmount = executionDeposit.getFirstLegAmount() != null ? executionDeposit.getFirstLegAmount() : BigDecimal.ZERO;
String sideStr = executionDeposit.getSide(); String sideStr = executionDeposit.getSide();
Side side = IEnumKey.getEnumByKey(Side.class, sideStr); Side side = IEnumKey.getEnumByKey(Side.class, sideStr);
@ -144,23 +209,60 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
} }
ksRepTradesReport.setCashLiability(firstLegAmount); ksRepTradesReport.setCashLiability(firstLegAmount);
ksRepTradesReport.setDepoLiability(BigDecimal.ZERO); ksRepTradesReport.setDepoLiability(BigDecimal.ZERO);
ksRepTradesReport.setRepaymDate(executionDeposit.getSecondLegSettlementDate());
} else if (execution instanceof ExecutionFond executionFond) { } else if (execution instanceof ExecutionFond executionFond) {
if (tkr.getDepoAccountId() != null) {
AccountSymbols accountSymbols = accountSymbolsImdg.getFirstObjectByFieldValues(Map.of(
"accountId", tkr.getDepoAccountId()
));
if (accountSymbols != null) {
depoAccount = accountSymbols.getAccountSymbolValue();
} else {
Account depoAccountFromImdg = accountImdg.getSingleObjectByID(tkr.getDepoAccountId());
if (depoAccountFromImdg != null) depoAccount = depoAccountFromImdg.getAccount();
}
}
Company company = null;
BigDecimal settlementAmount = executionFond.getSettlementAmount() != null ? executionFond.getSettlementAmount() : BigDecimal.ZERO; BigDecimal settlementAmount = executionFond.getSettlementAmount() != null ? executionFond.getSettlementAmount() : BigDecimal.ZERO;
if (Arrays.asList(Side.BUY.getKey(), "B","BUY").contains(executionFond.getSide())) { if (Arrays.asList(Side.BUY.getKey(), "B","BUY").contains(executionFond.getSide())) {
settlementAmount = settlementAmount.negate(); settlementAmount = settlementAmount.negate();
ksRepTradesReport.setCashLiability(settlementAmount); ksRepTradesReport.setCashLiability(settlementAmount);
if (executionFond.getCompanyId() != null)
company = companyImdg.getSingleObjectByID(executionFond.getCompanyId());
} else if (Arrays.asList(Side.SELL.getKey(), "S","SELL").contains(executionFond.getSide())) { } else if (Arrays.asList(Side.SELL.getKey(), "S","SELL").contains(executionFond.getSide())) {
ksRepTradesReport.setCashLiability(settlementAmount); ksRepTradesReport.setCashLiability(settlementAmount);
if (executionFond.getCounterPartyId() != null)
company = companyImdg.getSingleObjectByID(executionFond.getCounterPartyId());
} else { } else {
log.warn("Execution id={} has unknown side={}", executionFond.getId(), executionFond.getSide()); log.warn("Execution id={} has unknown side={}", executionFond.getId(), executionFond.getSide());
continue; continue;
} }
if (
executionFond.getSecuritySymbol() == null || company == null ||
company.getTradingCode() == null || executionFond.getExchangeExecutionId() == null
) {
log.warn("Can't format agreement number for execution id={}, security_symbol={}, " +
"executionFond.trading_date={}, company.trading_code={}, " +
"executionFond.exchange_execution_id={}",
execution.getId(),
executionFond.getSecuritySymbol(),
ddMMyyyyFormatter.format(executionFond.getTradingDate()),
company != null ? company.getTradingCode() : null,
executionFond.getExchangeExecutionId());
continue;
}
BigDecimal quantity = executionFond.getQuantity() != null ? executionFond.getQuantity() : BigDecimal.ZERO; BigDecimal quantity = executionFond.getQuantity() != null ? executionFond.getQuantity() : BigDecimal.ZERO;
if (Arrays.asList(Side.SELL.getKey(), "S", "SELL").contains((executionFond.getSide()))) if (Arrays.asList(Side.SELL.getKey(), "S", "SELL").contains((executionFond.getSide())))
quantity = quantity.negate(); quantity = quantity.negate();
ksRepTradesReport.setDepoLiability(quantity); ksRepTradesReport.setDepoLiability(quantity);
} }
ksRepTradesReport.setDepoAccount(depoAccount);
ksRepTradesReport.setAgreementNumber(agreementNumber);
ksRepTradesReport.setTradeNum(execution.getExchangeExecutionId()); ksRepTradesReport.setTradeNum(execution.getExchangeExecutionId());
ksRepTradesReport.setClassCode(execution.getMarket()); ksRepTradesReport.setClassCode(execution.getMarket());
@ -177,73 +279,34 @@ public class KSRepTradesReportBuilder extends CSVReportBuilder<EmptyParams, KSRe
status = "1"; status = "1";
} else if (coverage == CoverageStatus.DEND) { } else if (coverage == CoverageStatus.DEND) {
if (execution instanceof ExecutionDeposit) { if (execution instanceof ExecutionDeposit) {
ksRepTradesReport.setStatus("2"); status = "2";
} else { } else {
ImdgPredicate registryPredicate = RegistryCodeSqlBuilder.getInstance(
RegistryTradingParams.OS_T,
RegistryTradingParams.TS_T,
RegistryTradingParams.OM_T,
RegistryTradingParams.TM_T
).buildPredicate(pbExecutionFond);
Long groupId = execution.getExchangeExecutionId(); Long groupId = execution.getExchangeExecutionId();
Collection<Registry> registryCollection = registryImdg.getCollectionObjectsByPredicate( status = statusForExecution.get(new ExecutionKey(groupId, execution.getSessionId()));
pbExecutionFond.and( if (status == null) {
registryPredicate, pbExecutionFond.equals("groupId", groupId)
)
);
if (registryCollection.isEmpty()) {
log.warn( log.warn(
"Broken execution (empty registries). Registry for groupId = {} not found. Execution (id = {}) skipped", "Broken execution (can't define status). Registry for groupId = {}, companyId = {} not found. Execution (id = {}) skipped",
groupId, groupId,
execution.getCompanyId(),
execution.getId() execution.getId()
); );
continue; continue;
} }
boolean allOk = checkRegistryStatus(
registryCollection,
List.of(RegistryStatus.NACK, RegistryStatus.NACC, RegistryStatus.FAIL, RegistryStatus.UNCV)
);
if (allOk) {
for (Registry registry : registryCollection) {
RegistryInstrumentType registryInstrumentType = IEnumKey.getEnumByKey(RegistryInstrumentType.class, registry.getRegistryInstrumentType());
if (registryInstrumentType == RegistryInstrumentType.M) {
ksRepTradesReport.setStatus("2");
break;
}
if (registryInstrumentType == RegistryInstrumentType.S) {
ksRepTradesReport.setStatus("3");
break;
}
}
}
} }
} }
} }
ksRepTradesReport.setStatus(status); ksRepTradesReport.setStatus(status);
rows.add(ksRepTradesReport); rows.add(ksRepTradesReport);
} catch (Throwable e) { } catch (Throwable e) {
log.error("Can't create report row for execution_%s (id = %d), skipped".formatted(execution instanceof ExecutionFond ? "fond" : "deposit", execution.getId()), e); log.error("Can't create report row for execution_%s (id = %d), skipped".formatted(
execution instanceof ExecutionFond ? "fond" : "deposit",
execution.getId()), e
);
} }
} }
} }
private boolean checkRegistryStatus(Collection<Registry> registries, Collection<RegistryStatus> registryStatuses) { private record ExecutionKey(Long groupId, Long sessionId) {
for (Registry registry : registries) {
RegistryStatus registryStatus = IEnumKey.getEnumByKey(RegistryStatus.class, registry.getRegistryStatus());
if (registryStatuses.contains(registryStatus)) continue;
return false;
}
return true;
}
private boolean checkRegistryInstrumentType(Collection<Registry> registries, Collection<RegistryInstrumentType> RegistryInstrumentTypes) {
for (Registry registry : registries) {
RegistryInstrumentType RegistryInstrumentType = IEnumKey.getEnumByKey(RegistryInstrumentType.class, registry.getRegistryInstrumentType());
if (RegistryInstrumentTypes.contains(RegistryInstrumentType)) continue;
return false;
}
return true;
} }
} }

View file

@ -419,7 +419,7 @@ public class ReportServiceTest_BP {
File outFile = outFolder.listFiles()[0]; File outFile = outFolder.listFiles()[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX65_DEALS_expected.csv").getFile()); File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/bp/KS_BR_PFX65_DEALS_expected.csv").getFile());
compareCSVFiles(expectedFile, outFile, Arrays.asList("TRADEDATE")); compareCSVFiles(expectedFile, outFile, List.of("TRADEDATE"));
testExecutionFond.setSessionId(oldExecutionFondSessionId); testExecutionFond.setSessionId(oldExecutionFondSessionId);
testExecutionFond.setCoverageStatus(oldExecutionFondCoverageStatus); testExecutionFond.setCoverageStatus(oldExecutionFondCoverageStatus);

View file

@ -192,6 +192,7 @@ public class ReportServiceTest_KS {
cmtRegistry_1.setAccount("ACCOUNT"); cmtRegistry_1.setAccount("ACCOUNT");
cmtRegistry_1.setRegistryStatus(RegistryStatus.CLRD.getKey()); cmtRegistry_1.setRegistryStatus(RegistryStatus.CLRD.getKey());
cmtRegistry_1.setBalance(BigDecimal.valueOf(111L)); cmtRegistry_1.setBalance(BigDecimal.valueOf(111L));
cmtRegistry_1.setContract("CONTRACT_1");
registryImdg.insert(cmtRegistry_1); registryImdg.insert(cmtRegistry_1);
Registry cmtRegistry_2 = new Registry(); Registry cmtRegistry_2 = new Registry();
@ -205,6 +206,7 @@ public class ReportServiceTest_KS {
cmtRegistry_2.setAccount("ACCOUNT"); cmtRegistry_2.setAccount("ACCOUNT");
cmtRegistry_2.setRegistryStatus(RegistryStatus.CLRD.getKey()); cmtRegistry_2.setRegistryStatus(RegistryStatus.CLRD.getKey());
cmtRegistry_2.setBalance(BigDecimal.valueOf(111L)); cmtRegistry_2.setBalance(BigDecimal.valueOf(111L));
cmtRegistry_2.setContract("CONTRACT_2");
registryImdg.insert(cmtRegistry_2); registryImdg.insert(cmtRegistry_2);
Registry cmtRegistry_3 = new Registry(); Registry cmtRegistry_3 = new Registry();
@ -259,6 +261,34 @@ public class ReportServiceTest_KS {
lmtRegistry_3.setBalance(BigDecimal.valueOf(11L)); lmtRegistry_3.setBalance(BigDecimal.valueOf(11L));
registryImdg.insert(lmtRegistry_3); registryImdg.insert(lmtRegistry_3);
Registry dmxRegistry_1 = new Registry();
dmxRegistry_1.setRegistryCode("DM_X");
dmxRegistry_1.setRegistryDesignation(RegistryDesignation.D.getKey());
dmxRegistry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
dmxRegistry_1.setRegistryUnit(RegistryUnit.X.getKey());
dmxRegistry_1.setSessionId(SESSION_ID_FOR_DAY);
dmxRegistry_1.setTradingCode("TRADING_CODE");
dmxRegistry_1.setCompanyId(COMPANY_ID);
dmxRegistry_1.setAccount("ACCOUNT");
dmxRegistry_1.setContract("CONTRACT_1");
dmxRegistry_1.setRegistryStatus(RegistryStatus.OK.getKey());
dmxRegistry_1.setBalance(BigDecimal.valueOf(11L));
registryImdg.insert(dmxRegistry_1);
Registry dmxRegistry_2 = new Registry();
dmxRegistry_2.setRegistryCode("DM_X");
dmxRegistry_2.setRegistryDesignation(RegistryDesignation.D.getKey());
dmxRegistry_2.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
dmxRegistry_2.setRegistryUnit(RegistryUnit.X.getKey());
dmxRegistry_2.setSessionId(SESSION_ID_FOR_DAY);
dmxRegistry_2.setTradingCode("TRADING_CODE");
dmxRegistry_2.setCompanyId(COMPANY_ID);
dmxRegistry_2.setAccount("ACCOUNT");
dmxRegistry_2.setContract("CONTRACT_2");
dmxRegistry_2.setRegistryStatus(RegistryStatus.OK.getKey());
dmxRegistry_2.setBalance(BigDecimal.valueOf(11L));
registryImdg.insert(dmxRegistry_2);
Registry addWithdrawRegistry_1 = new Registry(); Registry addWithdrawRegistry_1 = new Registry();
addWithdrawRegistry_1.setCompanyId(COMPANY_ID); addWithdrawRegistry_1.setCompanyId(COMPANY_ID);
@ -325,6 +355,8 @@ public class ReportServiceTest_KS {
registryImdg.delete(lmtRegistry_1); registryImdg.delete(lmtRegistry_1);
registryImdg.delete(lmtRegistry_2); registryImdg.delete(lmtRegistry_2);
registryImdg.delete(lmtRegistry_3); registryImdg.delete(lmtRegistry_3);
registryImdg.delete(dmxRegistry_1);
registryImdg.delete(dmxRegistry_2);
sessionImdg.delete(sessionForDay); sessionImdg.delete(sessionForDay);
accountImdg.delete(account); accountImdg.delete(account);
} }
@ -586,8 +618,23 @@ public class ReportServiceTest_KS {
TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry(); TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry();
tradingClearingRegistry.setCode("TKR"); tradingClearingRegistry.setCode("TKR");
tradingClearingRegistry.setDepoAccountId(777L);
Long tkrId = tradingClearingRegistryImdg.insert(tradingClearingRegistry); Long tkrId = tradingClearingRegistryImdg.insert(tradingClearingRegistry);
Account account = new Account();
account.setAccount("ACCOUNT");
Long accountId = accountImdg.insert(account);
TradingClearingRegistry tradingClearingRegistry_1 = new TradingClearingRegistry();
tradingClearingRegistry_1.setCode("TKR");
tradingClearingRegistry_1.setDepoAccountId(accountId);
Long tkrId_1 = tradingClearingRegistryImdg.insert(tradingClearingRegistry_1);
AccountSymbols accountSymbols = new AccountSymbols();
accountSymbols.setAccountId(777L);
accountSymbols.setAccountSymbolValue("ACC_SYMBOL_VALUE");
accountSymbolsImdg.insert(accountSymbols);
Session session_1 = new Session(); Session session_1 = new Session();
session_1.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2023, 6, 30, 0, 0, 0).toEpochSecond(ZoneOffset.UTC))); session_1.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2023, 6, 30, 0, 0, 0).toEpochSecond(ZoneOffset.UTC)));
Long sessionId_1 = sessionImdg.insert(session_1); Long sessionId_1 = sessionImdg.insert(session_1);
@ -596,9 +643,44 @@ public class ReportServiceTest_KS {
session_2.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2022, 6, 30, 0, 0, 0).toEpochSecond(ZoneOffset.UTC))); session_2.setCreated(Instant.ofEpochMilli(LocalDateTime.of(2022, 6, 30, 0, 0, 0).toEpochSecond(ZoneOffset.UTC)));
Long sessionId_2 = sessionImdg.insert(session_2); Long sessionId_2 = sessionImdg.insert(session_2);
ExecutionFond executionFond_2 = new ExecutionFond();
executionFond_2.setSecuritySymbol("SEC_SYM");
executionFond_2.setExchangeExecutionId(666L);
executionFond_2.setMarket("3333");
executionFond_2.setCompanyId(COMPANY_ID);
executionFond_2.setTradingDate(LocalDate.now());
executionFond_2.setSide(MoneyFlowSide.BUY.getKey());
executionFond_2.setSessionId(sessionId_1);
executionFond_2.setTradingClearingRegistryId(tkrId_1);
executionFond_2.setSettlementAmount(BigDecimal.valueOf(8888.888888));
executionFond_2.setQuantity(BigDecimal.valueOf(123.456789));
executionFond_2.setExchangeExecutionId(222L);
executionFond_2.setExchangeExecutionTime(Instant.ofEpochMilli(LocalDateTime.of(2022, 1, 1, 1, 1, 1).toEpochSecond(ZoneOffset.UTC)));
executionFond_2.setCoverageStatus(CoverageStatus.ALWD.getKey());
executionFondImdg.insert(executionFond_2);
ExecutionFond executionFond_3 = new ExecutionFond();
executionFond_3.setSecuritySymbol("SEC_SYM");
executionFond_3.setExchangeExecutionId(666L);
executionFond_3.setMarket("3333");
executionFond_3.setCompanyId(COMPANY_ID);
executionFond_3.setTradingDate(LocalDate.now());
executionFond_3.setSide(MoneyFlowSide.BUY.getKey());
executionFond_3.setSessionId(sessionId_1);
executionFond_3.setTradingClearingRegistryId(tkrId);
executionFond_3.setSettlementAmount(BigDecimal.valueOf(8888.888888));
executionFond_3.setQuantity(BigDecimal.valueOf(123.456789));
executionFond_3.setExchangeExecutionId(222L);
executionFond_3.setExchangeExecutionTime(Instant.ofEpochMilli(LocalDateTime.of(2022, 1, 1, 1, 1, 1).toEpochSecond(ZoneOffset.UTC)));
executionFond_3.setCoverageStatus(CoverageStatus.DEND.getKey());
executionFondImdg.insert(executionFond_3);
ExecutionFond executionFond = new ExecutionFond(); ExecutionFond executionFond = new ExecutionFond();
executionFond.setExchangeExecutionId(888L);
executionFond.setSecuritySymbol("SEC_SYM");
executionFond.setMarket("3333"); executionFond.setMarket("3333");
executionFond.setCompanyId(COMPANY_ID); executionFond.setCompanyId(COMPANY_ID);
executionFond.setCounterPartyId(COMPANY_ID);
executionFond.setTradingDate(LocalDate.now()); executionFond.setTradingDate(LocalDate.now());
executionFond.setSide(MoneyFlowSide.SELL.getKey()); executionFond.setSide(MoneyFlowSide.SELL.getKey());
executionFond.setSessionId(sessionId_1); executionFond.setSessionId(sessionId_1);
@ -607,7 +689,7 @@ public class ReportServiceTest_KS {
executionFond.setQuantity(BigDecimal.valueOf(123.456789)); executionFond.setQuantity(BigDecimal.valueOf(123.456789));
executionFond.setExchangeExecutionId(222L); executionFond.setExchangeExecutionId(222L);
executionFond.setExchangeExecutionTime(Instant.ofEpochMilli(LocalDateTime.of(2022, 1, 1, 1, 1, 1).toEpochSecond(ZoneOffset.UTC))); executionFond.setExchangeExecutionTime(Instant.ofEpochMilli(LocalDateTime.of(2022, 1, 1, 1, 1, 1).toEpochSecond(ZoneOffset.UTC)));
executionFond.setCoverageStatus(CoverageStatus.ALWD.getKey()); executionFond.setCoverageStatus(CoverageStatus.DEND.getKey());
executionFondImdg.insert(executionFond); executionFondImdg.insert(executionFond);
Market market = new Market(); Market market = new Market();
@ -616,18 +698,29 @@ public class ReportServiceTest_KS {
Registry registry = new Registry(); Registry registry = new Registry();
registry.setSessionId(sessionId_2); registry.setSessionId(sessionId_2);
registry.setRegistryCode("OM_T"); registry.setCompanyId(COMPANY_ID);
registry.setRegistryDesignation(RegistryDesignation.O.getKey()); registry.setRegistryCode("_S_T");
registry.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
registry.setRegistryUnit(RegistryUnit.T.getKey()); registry.setRegistryUnit(RegistryUnit.T.getKey());
registry.setGroupId(Long.parseLong("%s%d%d".formatted(dateFormatter_yyyyMMdd.format(LocalDate.now()), 222, marketId))); registry.setGroupId(222L);
registry.setRegistryStatus(RegistryStatus.FAIL.getKey()); registry.setRegistryStatus(RegistryStatus.FAIL.getKey());
registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey()); registry.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
registryImdg.insert(registry); registryImdg.insert(registry);
Registry registry_2 = new Registry();
registry_2.setSessionId(sessionId_2);
registry_2.setCompanyId(COMPANY_ID);
registry_2.setRegistryCode("_S_T");
registry_2.setRegistryInstrumentType(RegistryInstrumentType.S.getKey());
registry_2.setRegistryUnit(RegistryUnit.T.getKey());
registry_2.setGroupId(executionFond_3.getExchangeExecutionId());
registry_2.setRegistryStatus(RegistryStatus.FAIL.getKey());
registryImdg.insert(registry_2);
ExecutionDeposit executionDeposit = new ExecutionDeposit(); ExecutionDeposit executionDeposit = new ExecutionDeposit();
executionDeposit.setMarket("3333"); executionDeposit.setMarket("3333");
executionDeposit.setCompanyId(COMPANY_ID); executionDeposit.setCompanyId(COMPANY_ID);
executionDeposit.setContract("CONTRACT");
executionDeposit.setTradingDate(LocalDate.now()); executionDeposit.setTradingDate(LocalDate.now());
executionDeposit.setSide(Side.BUY.getKey()); executionDeposit.setSide(Side.BUY.getKey());
executionDeposit.setSessionId(sessionId_2); executionDeposit.setSessionId(sessionId_2);
@ -636,6 +729,7 @@ public class ReportServiceTest_KS {
executionDeposit.setExchangeExecutionId(222L); executionDeposit.setExchangeExecutionId(222L);
executionDeposit.setExchangeExecutionTime(Instant.ofEpochMilli(LocalDateTime.of(2022, 1, 1, 1, 1, 1).toEpochSecond(ZoneOffset.UTC))); executionDeposit.setExchangeExecutionTime(Instant.ofEpochMilli(LocalDateTime.of(2022, 1, 1, 1, 1, 1).toEpochSecond(ZoneOffset.UTC)));
executionDeposit.setCoverageStatus(CoverageStatus.DEND.getKey()); executionDeposit.setCoverageStatus(CoverageStatus.DEND.getKey());
executionDeposit.setSecondLegSettlementDate(LocalDate.of(2000, 1, 1));
executionDepositImdg.insert(executionDeposit); executionDepositImdg.insert(executionDeposit);
String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L); String jsonString = TestUtils.getJsonStringForSystem(reportRequest, 0L);
@ -654,10 +748,15 @@ public class ReportServiceTest_KS {
executionDepositImdg.delete(executionDeposit); executionDepositImdg.delete(executionDeposit);
executionFondImdg.delete(executionFond); executionFondImdg.delete(executionFond);
executionFondImdg.delete(executionFond_2);
executionFondImdg.delete(executionFond_3);
sessionImdg.delete(session_1); sessionImdg.delete(session_1);
sessionImdg.delete(session_2); sessionImdg.delete(session_2);
registryImdg.delete(registry); registryImdg.delete(registry);
registryImdg.delete(registry_2);
tradingClearingRegistryImdg.delete(tradingClearingRegistry); tradingClearingRegistryImdg.delete(tradingClearingRegistry);
accountSymbolsImdg.delete(accountSymbols);
accountImdg.delete(account);
} }
@Test @Test
@ -680,6 +779,7 @@ public class ReportServiceTest_KS {
registry_1.setClearingDate(LocalDate.now()); registry_1.setClearingDate(LocalDate.now());
registry_1.setRegistryCode("LM_T"); registry_1.setRegistryCode("LM_T");
registry_1.setTradingClearingRegistry("TKR"); registry_1.setTradingClearingRegistry("TKR");
registry_1.setSessionType(SessionType.IPO0.getKey());
registry_1.setRegistryStatus(RegistryStatus.PROC.getKey()); registry_1.setRegistryStatus(RegistryStatus.PROC.getKey());
registry_1.setRegistryDesignation(RegistryDesignation.L.getKey()); registry_1.setRegistryDesignation(RegistryDesignation.L.getKey());
registry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey()); registry_1.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
@ -695,6 +795,7 @@ public class ReportServiceTest_KS {
registry_2.setSettlementDate(LocalDate.now()); registry_2.setSettlementDate(LocalDate.now());
registry_2.setGroupId(Long.MAX_VALUE); registry_2.setGroupId(Long.MAX_VALUE);
registry_2.setClearingDate(LocalDate.now()); registry_2.setClearingDate(LocalDate.now());
registry_2.setSessionType(SessionType.IPO0.getKey());
registry_2.setRegistryCode("CM_T"); registry_2.setRegistryCode("CM_T");
registry_2.setTradingClearingRegistry("TKR"); registry_2.setTradingClearingRegistry("TKR");
registry_2.setRegistryStatus(RegistryStatus.PROC.getKey()); registry_2.setRegistryStatus(RegistryStatus.PROC.getKey());
@ -719,6 +820,7 @@ public class ReportServiceTest_KS {
registry_3.setGroupId(Long.MAX_VALUE); registry_3.setGroupId(Long.MAX_VALUE);
registry_3.setClearingDate(LocalDate.now()); registry_3.setClearingDate(LocalDate.now());
registry_3.setRegistryCode("LM_T"); registry_3.setRegistryCode("LM_T");
registry_3.setSessionType(SessionType.FINL.getKey());
registry_3.setTradingClearingRegistry("TKR"); registry_3.setTradingClearingRegistry("TKR");
registry_3.setRegistryStatus(RegistryStatus.PROC.getKey()); registry_3.setRegistryStatus(RegistryStatus.PROC.getKey());
registry_3.setRegistryDesignation(RegistryDesignation.L.getKey()); registry_3.setRegistryDesignation(RegistryDesignation.L.getKey());
@ -734,6 +836,7 @@ public class ReportServiceTest_KS {
registry_4.setTradingCode("TRADING_CODE"); registry_4.setTradingCode("TRADING_CODE");
registry_4.setSettlementDate(LocalDate.now()); registry_4.setSettlementDate(LocalDate.now());
registry_4.setGroupId(Long.MAX_VALUE); registry_4.setGroupId(Long.MAX_VALUE);
registry_4.setSessionType(SessionType.FINL.getKey());
registry_4.setClearingDate(LocalDate.now()); registry_4.setClearingDate(LocalDate.now());
registry_4.setRegistryCode("CM_T"); registry_4.setRegistryCode("CM_T");
registry_4.setTradingClearingRegistry("TKR"); registry_4.setTradingClearingRegistry("TKR");
@ -961,6 +1064,10 @@ public class ReportServiceTest_KS {
companySymbols.setCompanySymbolValue("COMPANY_SYMBOL_VALUE"); companySymbols.setCompanySymbolValue("COMPANY_SYMBOL_VALUE");
companySymbolsImdg.insert(companySymbols); companySymbolsImdg.insert(companySymbols);
Session session = new Session();
session.setCreated(LocalDateTime.of(2000, 1, 1, 0, 0).toInstant(ZoneOffset.UTC));
Long sessionId = sessionImdg.insert(session);
Registry registry = new Registry(); Registry registry = new Registry();
registry.setRegistryStatus(RegistryStatus.CLRD.getKey()); registry.setRegistryStatus(RegistryStatus.CLRD.getKey());
registry.setCompanyId(COMPANY_ID); registry.setCompanyId(COMPANY_ID);
@ -979,6 +1086,11 @@ public class ReportServiceTest_KS {
registry.setGroupId(23071812300L); registry.setGroupId(23071812300L);
registry.setSessionType(SessionType.XDEP.getKey()); registry.setSessionType(SessionType.XDEP.getKey());
registry.setValueDate(LocalDate.now().minusDays(10)); registry.setValueDate(LocalDate.now().minusDays(10));
registry.setSettlementDate(LocalDate.of(2022, 1, 2));
registry.setTradingClearingRegistry("TRADING_CLEARING_REGISTRY");
registry.setAccountType(AccountType.Clrn.getKey());
registry.setAccount("ACCOUNT");
registry.setSessionId(sessionId);
registryImdg.insert(registry); registryImdg.insert(registry);
Registry omtRegistry = new Registry(); Registry omtRegistry = new Registry();
@ -990,6 +1102,18 @@ public class ReportServiceTest_KS {
omtRegistry.setGroupId(23071812300L); omtRegistry.setGroupId(23071812300L);
registryImdg.insert(omtRegistry); registryImdg.insert(omtRegistry);
Registry tmtRegistry = new Registry();
tmtRegistry.setRegistryCode("TM_T");
tmtRegistry.setAccount("TMT_ACCOUNT");
tmtRegistry.setAccountType(AccountType.Clrn.getKey());
tmtRegistry.setRegistryDesignation(RegistryDesignation.T.getKey());
tmtRegistry.setRegistryInstrumentType(RegistryInstrumentType.M.getKey());
tmtRegistry.setRegistryUnit(RegistryUnit.T.getKey());
tmtRegistry.setCounterPartyId(COMPANY_ID);
tmtRegistry.setTradingClearingRegistry("TKR_TMT");
tmtRegistry.setGroupId(23071812300L);
registryImdg.insert(tmtRegistry);
ExecutionDeposit executionDeposit = new ExecutionDeposit(); ExecutionDeposit executionDeposit = new ExecutionDeposit();
executionDeposit.setExchangeExecutionId(registry.getGroupId()); executionDeposit.setExchangeExecutionId(registry.getGroupId());
executionDeposit.setMarket("market"); executionDeposit.setMarket("market");
@ -1007,10 +1131,12 @@ public class ReportServiceTest_KS {
File outFile = outFolder.listFiles()[0]; File outFile = outFolder.listFiles()[0];
File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_COMMISSION_TRADES_expected.csv").getFile()); File expectedFile = new File(getClass().getClassLoader().getResource("expected_reports_csv/ks/KS_COMMISSION_TRADES_expected.csv").getFile());
compareCSVFiles(expectedFile, outFile, Arrays.asList("REPAYM_DATE")); compareCSVFiles(expectedFile, outFile, Arrays.asList("AGREEMENT_SETTLEMENT_DATE", "REPAYM_DATE", "SESSION_ID"));
registryImdg.delete(registry); registryImdg.delete(registry);
registryImdg.delete(omtRegistry); registryImdg.delete(omtRegistry);
registryImdg.delete(tmtRegistry);
sessionImdg.delete(session);
companySymbolsImdg.delete(companySymbols); companySymbolsImdg.delete(companySymbols);
executionDepositImdg.delete(executionDeposit); executionDepositImdg.delete(executionDeposit);
} }
@ -1071,7 +1197,21 @@ public class ReportServiceTest_KS {
} }
} }
if (findEqual) continue; if (findEqual) continue;
Assertions.fail("For actual line '%s' not found expected line".formatted(String.join(",", actualLine))); Assertions.fail("For actual line '%s' not found expected line".formatted(String.join(", ", actualLine)));
}
List<String> errors = new ArrayList<>();
for (int idx = 0; idx < expectedHeaders.length; idx++) {
if (!Objects.equals(expectedHeaders[idx], actualHeaders[idx])) {
errors.add("expected header (%s) for idx = %d not equal actual header (%s)".formatted(
expectedHeaders[idx],
idx,
actualHeaders[idx])
);
}
}
if (!errors.isEmpty()) {
Assertions.fail("Files equal, but header sequence broken, cause: %s".formatted(String.join(",", errors)));
} }
expectedCSVReader.close(); expectedCSVReader.close();

View file

@ -1,2 +1,2 @@
"SECURITYID","TRADENO","TRADEDATE","SETTLECODE" "SECURITYID","TRADENO","TRADEDATE","SETTLECODE","VALUE"
"test-security-symbol-1","777","22.07.2023","test-settlement-code" "test-security-symbol-1","777","2023-10-29","test-settlement-code","7777777.00"

1 SECURITYID TRADENO TRADEDATE SETTLECODE VALUE
2 test-security-symbol-1 777 22.07.2023 2023-10-29 test-settlement-code 7777777.00

View file

@ -1,2 +1,2 @@
"FIRM_ID","FIRM_ID_INITIATOR","SECCODE","CLASS_CODE","AGREEMENT_NUMBER","AGREEMENT_NUMBER_POSTFIX","AGREEMENT_DATE","SUM","REPAYM_DATE","EXEC_STATUS" "FIRM_ID","FIRM_ID_INITIATOR","SECCODE","CLASS_CODE","AGREEMENT_NUMBER","AGREEMENT_NUMBER_POSTFIX","AGREEMENT_DATE","AGREEMENT_SETTLEMENT_DATE","SUM","REPAYM_DATE","EXEC_STATUS","TR_ID","TKR","ACCOUNT","SESSION_ID","SESSION_DATE","TKR_INITIATOR","ACCOUNT_INITIATOR"
"CLEARING_CODE","TRADING_CODE","CONT~RACT","market","CONT","CONT~RACT","01.01.1991","-77.78","05.09.2023","Исполнено" "CLEARING_CODE","TRADING_CODE","CONT~RACT","market","CONT","CONT~RACT","01.01.1991","28.11.2023","-77.78","08.12.2023","Исполнен","23071812300","TRADING_CLEARING_REGISTRY","ACCOUNT","3","01.01.2000T03:00:00","TKR_TMT","TMT_ACCOUNT"

1 FIRM_ID FIRM_ID_INITIATOR SECCODE CLASS_CODE AGREEMENT_NUMBER AGREEMENT_NUMBER_POSTFIX AGREEMENT_DATE AGREEMENT_SETTLEMENT_DATE SUM REPAYM_DATE EXEC_STATUS TR_ID TKR ACCOUNT SESSION_ID SESSION_DATE TKR_INITIATOR ACCOUNT_INITIATOR
2 CLEARING_CODE TRADING_CODE CONT~RACT market CONT CONT~RACT 01.01.1991 28.11.2023 -77.78 05.09.2023 08.12.2023 Исполнено Исполнен 23071812300 TRADING_CLEARING_REGISTRY ACCOUNT 3 01.01.2000T03:00:00 TKR_TMT TMT_ACCOUNT

View file

@ -1,3 +1,3 @@
"FIRMID","SESSION_ID","SESSION_DATE","ACCOUNT","TKR","VALUE","DATE" "FIRMID","SESSION_ID","SESSION_DATE","ACCOUNT","TKR","VALUE","DATE","OBL_VALUE","REQ_VALUE"
"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","TKR","22.22","01.11.2023" "TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT","TKR","22.22","16.11.2023","",""
"TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT_FROM_ACCOUNT","TKR","22.22","01.11.2023" "TRADING_CODE","2","20.01.1970T02:49:58","ACCOUNT_FROM_ACCOUNT","TKR","","16.11.2023","22.22","44.44"
1 FIRMID SESSION_ID SESSION_DATE ACCOUNT TKR VALUE DATE OBL_VALUE REQ_VALUE
2 TRADING_CODE 2 20.01.1970T02:49:58 ACCOUNT TKR 22.22 01.11.2023 16.11.2023
3 TRADING_CODE 2 20.01.1970T02:49:58 ACCOUNT_FROM_ACCOUNT TKR 22.22 01.11.2023 16.11.2023 22.22 44.44

View file

@ -1,3 +1,3 @@
"FIRMID","ACCOUNT","TKR","DATE","REGISTER_CODE","REGISTER_NAME","OPEN_BALANCE","CHANGE_BALANCE","ADD_WITHDRAW","CLOSE_BALANCE","REMARKS","TRADE_NUM" "FIRMID","ACCOUNT","TKR","DATE","REGISTER_CODE","REGISTER_NAME","OPEN_BALANCE","CHANGE_BALANCE","ADD_WITHDRAW","CLOSE_BALANCE","REMARKS","TRADE_NUM"
"TRADING_CODE","ACCOUNT_FROM_ACCOUNT","TRADING_CLEARING_REGISTRY","01.11.2023","AM_T","AM_T_NAME","77.78","300.00","111.00","488.78","","" "TRADING_CODE","ACCOUNT_FROM_ACCOUNT","TRADING_CLEARING_REGISTRY","01.11.2023","AM_T","AM_T_NAME","77.78",278.00,"111.00","466.78","",""
"TRADING_CODE","ACCOUNT","TRADING_CLEARING_REGISTRY","01.11.2023","AM_T","AM_T_NAME","77.78","300.00","111.00","488.78","","" "TRADING_CODE","ACCOUNT","TRADING_CLEARING_REGISTRY","01.11.2023","AM_T","AM_T_NAME","77.78",278.00,"111.00",466.78,"",""

1 FIRMID ACCOUNT TKR DATE REGISTER_CODE REGISTER_NAME OPEN_BALANCE CHANGE_BALANCE ADD_WITHDRAW CLOSE_BALANCE REMARKS TRADE_NUM
2 TRADING_CODE ACCOUNT_FROM_ACCOUNT TRADING_CLEARING_REGISTRY 01.11.2023 AM_T AM_T_NAME 77.78 300.00 278.00 111.00 488.78 466.78
3 TRADING_CODE ACCOUNT TRADING_CLEARING_REGISTRY 01.11.2023 AM_T AM_T_NAME 77.78 300.00 278.00 111.00 488.78 466.78

View file

@ -1,3 +1,5 @@
"SESSION_ID","SESSION_DATE","TR_ID","FIRM_ID","TKR","CASH_LIABILITY","DEPO_LIABILITY","TRADE_NUM","CLASS_CODE","TRADE_DATE","STATUS" "SESSION_ID","SESSION_DATE","TR_ID","AGREEMENT_NUMBER","FIRM_ID","TKR","ACCOUNT","DEPO_ACCOUNT","CASH_LIABILITY","DEPO_LIABILITY","TRADE_NUM","CLASS_CODE","TRADE_DATE","STATUS","REPAYM_DATE"
"4","20.01.1970T07:09:07","8","TRADING_CODE","TKR","8888.89","0","222",3333,"20.01.1970T02:49:58","0" "7","20.01.1970T07:09:07","222","CONTRACT","TRADING_CODE","TKR",,,"8888.89","0","222","3333","20.01.1970T02:49:58","2","01.01.2000"
"3","20.01.1970T15:54:43","5","TRADING_CODE","TKR","8888.89","-123","222",3333,"20.01.1970T02:49:58","1" "6","20.01.1970T15:54:43","222",,"TRADING_CODE","TKR",,"ACCOUNT","-8888.89","123","222","3333","20.01.1970T02:49:58","1",
"6","20.01.1970T15:54:43","222",,"TRADING_CODE","TKR",,"ACC_SYMBOL_VALUE","8888.89","-123","222","3333","20.01.1970T02:49:58","2",
"6","20.01.1970T15:54:43","222",,"TRADING_CODE","TKR",,"ACC_SYMBOL_VALUE","-8888.89","123","222","3333","20.01.1970T02:49:58","2",

1 SESSION_ID SESSION_DATE TR_ID AGREEMENT_NUMBER FIRM_ID TKR ACCOUNT DEPO_ACCOUNT CASH_LIABILITY DEPO_LIABILITY TRADE_NUM CLASS_CODE TRADE_DATE STATUS REPAYM_DATE
2 4 7 20.01.1970T07:09:07 8 222 CONTRACT TRADING_CODE TKR 8888.89 0 222 3333 20.01.1970T02:49:58 0 2 01.01.2000
3 3 6 20.01.1970T15:54:43 5 222 TRADING_CODE TKR ACCOUNT 8888.89 -8888.89 -123 123 222 3333 20.01.1970T02:49:58 1
4 6 20.01.1970T15:54:43 222 TRADING_CODE TKR ACC_SYMBOL_VALUE 8888.89 -123 222 3333 20.01.1970T02:49:58 2
5 6 20.01.1970T15:54:43 222 TRADING_CODE TKR ACC_SYMBOL_VALUE -8888.89 123 222 3333 20.01.1970T02:49:58 2

View file

@ -36,7 +36,7 @@ import java.util.Collection;
import java.util.Map; import java.util.Map;
import java.util.function.Function; import java.util.function.Function;
import static ru.spcex.clearing.scheduler.ISchedulerChecker.isValidWorkday; import static ru.spcex.clearing.scheduler.ISchedulerChecker.isWorkDayByTradingCalendar;
import static ru.spcex.clearing.scheduler.config.PlannerQueueConfig.addToPlannerQueue; import static ru.spcex.clearing.scheduler.config.PlannerQueueConfig.addToPlannerQueue;
@Service @Service
@ -150,7 +150,7 @@ public class ClearingCalendarService extends QueueConsumer implements Initializi
if (clearingCalendar.getClearingDate() == null || !clearingCalendar.getClearingDate().equals(currentDate)) if (clearingCalendar.getClearingDate() == null || !clearingCalendar.getClearingDate().equals(currentDate))
return; return;
boolean isWeekend = Arrays.asList(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY).contains(currentDate.getDayOfWeek()); boolean isWeekend = Arrays.asList(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY).contains(currentDate.getDayOfWeek());
if (isValidWorkday(clearingCalendar, isWeekend)) { if (isWorkDayByTradingCalendar(clearingCalendar, isWeekend)) {
for (PlannerTemplate plannerTemplate : plannerTemplateMap.getAllValues()) { for (PlannerTemplate plannerTemplate : plannerTemplateMap.getAllValues()) {
PlannerAllToday plannerAllToday = plannerAllTodayMap.getFirstObjectBySQL(String.format("parentId = %s", plannerTemplate.getId())); PlannerAllToday plannerAllToday = plannerAllTodayMap.getFirstObjectBySQL(String.format("parentId = %s", plannerTemplate.getId()));
if (plannerAllToday == null) { if (plannerAllToday == null) {
@ -172,7 +172,7 @@ public class ClearingCalendarService extends QueueConsumer implements Initializi
for (ClearingCalendar calendar : clearingCalendars) { for (ClearingCalendar calendar : clearingCalendars) {
//если будет хоть один валидные ClearingCalendar на сегодня на основании которого(и plannerTemplate -ов) могли быть созданы PlannerAllToday //если будет хоть один валидные ClearingCalendar на сегодня на основании которого(и plannerTemplate -ов) могли быть созданы PlannerAllToday
//ничего проверять\удалять дальше не будем //ничего проверять\удалять дальше не будем
if (isValidWorkday(calendar, isWeekend)) return; if (isWorkDayByTradingCalendar(calendar, isWeekend)) return;
} }
} }
//удалим все PlannerAllToday созданные на основании plannerTemplate кроме созданных на основании planner //удалим все PlannerAllToday созданные на основании plannerTemplate кроме созданных на основании planner

View file

@ -12,7 +12,6 @@ import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.scheduler.Launcher; import ru.clearing.classes.statics.data.scheduler.Launcher;
import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.payment.PIClearingOutbondActionNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.payment.PIClearingOutbondActionNewRequest;
@ -45,7 +44,7 @@ public class LauncherService extends QueueConsumer implements InitializingBean {
public LauncherService(Consumer<String, Object> kafkaQueue, Producer<String, Object> kafkaProducer, public LauncherService(Consumer<String, Object> kafkaQueue, Producer<String, Object> kafkaProducer,
@Qualifier("userRoleVerificationBean") UserRoleVerification userRoleVerification, @Qualifier("userRoleVerificationBean") UserRoleVerification userRoleVerification,
ImdgProvider imdgProvider) { ImdgProvider imdgProvider) {
super(kafkaQueue, null); super(kafkaQueue, kafkaProducer);
this.kafkaProducer = kafkaProducer; this.kafkaProducer = kafkaProducer;
this.userRoleVerification = userRoleVerification; this.userRoleVerification = userRoleVerification;
this.launcherMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Launcher, Launcher.class); this.launcherMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Launcher, Launcher.class);

Some files were not shown because too many files have changed in this diff Show more