Compare commits

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

2556 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
etreschenkov
9c827763de http://jira.mfd.msk:8088/browse/CLS-523 2023-11-06 17:13:38 +03:00
etreschenkov
59d0b000d1 http://jira.mfd.msk:8088/browse/CLS-481 2023-11-06 16:26:27 +03:00
etreshenkov
60e7c6ac39 http://jira.mfd.msk:8088/browse/CLS-522 2023-11-03 13:16:28 +03:00
AKurakin
9b26fb2290 backend-api update meta 3.9.0.65 (fix shortname) 2023-11-02 12:53:44 +03:00
AKurakin
81c4c9fa99 db-scripts обавлен GRANT ALL PRIVILEGES ON TABLE * TO clearing; теперь так в апдейтах также надо писать 2023-11-02 12:03:41 +03:00
AKurakin
9ac71532f7 backend-api update meta 3.9.0.65 2023-11-02 11:44:45 +03:00
AKurakin
79eaffbda6 db-scripts http://jira.mfd.msk:8088/browse/CLS-581 2023-11-01 17:33:51 +03:00
akulikov
8deebfafbb http://jira.mfd.msk:8088/browse/CLS-497 2023-11-01 16:02:44 +03:00
AKurakin
31de64e5bb account-service http://jira.mfd.msk:8088/browse/CLS-577 улучшил текст валидации 2023-11-01 13:57:02 +03:00
AKurakin
afeede8baa backend-api http://jira.mfd.msk:8088/browse/CLS-576 meta 2023-11-01 12:39:48 +03:00
AKurakin
286b3ace2c account-service http://jira.mfd.msk:8088/browse/CLS-577 DATA.sql добавил ошибку 5025 2023-11-01 12:30:50 +03:00
akulikov
2f54dcaccf http://jira.mfd.msk:8088/browse/CLS-497 2023-11-01 12:08:42 +03:00
AKurakin
bcb4307acd account-service http://jira.mfd.msk:8088/browse/CLS-576 улучшил валидацию 2023-11-01 10:31:48 +03:00
AKurakin
0bc0f9461f backend-api http://jira.mfd.msk:8088/browse/CLS-576 добавил тест 2023-10-31 19:01:49 +03:00
AKurakin
681e612bbd backend-api http://jira.mfd.msk:8088/browse/CLS-580 добавил log-warning при отсутствии настроек 2023-10-31 19:01:49 +03:00
akulikov
b5b204bf5f http://jira.mfd.msk:8088/browse/CLS-497 2023-10-31 18:56:12 +03:00
AKurakin
a2dcd21867 account-service http://jira.mfd.msk:8088/browse/CLS-577, imdg http://jira.mfd.msk:8088/browse/CLS-575 добавил AccountSymbolsUpdate в UpdateMapService.java 2023-10-31 17:30:15 +03:00
akulikov
9eff119ff2 http://jira.mfd.msk:8088/browse/CLS-497 part 2 2023-10-31 16:45:14 +03:00
etreshenkov
2a61062eb9 http://jira.mfd.msk:8088/browse/CLS-523 2023-10-31 15:39:41 +03:00
AKurakin
fba4a07513 backend-api http://jira.mfd.msk:8088/browse/CLS-577 AccountSymbols 2023-10-31 14:43:37 +03:00
AKurakin
7b24b1d6ab IMDG DDL http://jira.mfd.msk:8088/browse/CLS-575 DDL 3.9 2023-10-31 14:39:25 +03:00
akulikov
e7c48f17e6 http://jira.mfd.msk:8088/browse/CLS-497 part 1 2023-10-31 10:55:48 +03:00
psemenkov
520233356b add logs 2023-10-30 15:44:06 +03:00
etreschenkov
68a1a4d9d9 http://jira.mfd.msk:8088/browse/CLS-523 2023-10-25 17:26:38 +03:00
psemenkov
3437106728 Поправил тесты. Скопировал реализацию недостающих методов для транзакционного ImdgTransactionalHazelcast из ImdgHazelcast. 2023-10-25 10:54:46 +03:00
AKurakin
a3d2726b23 IMDG http://jira.mfd.msk:8088/browse/CLS-572 добавил настройку backup-count 2023-10-24 11:41:57 +03:00
AKurakin
269a74960b test-api-clearing http://git.mfd.msk/mfd/clearing/-/issues/31 Перенёс в отдельный git-репо 2023-10-21 16:58:37 +03:00
AKurakin
0befdfab92 imdg log info чтобы знать состояние кластера: Initialized new cluster connection between... Members {size:2, ver:2} ... 2023-10-19 17:23:41 +03:00
etreschenkov
90aba79ded http://jira.mfd.msk:8088/browse/CLS-562 2023-10-18 15:07:31 +03:00
etreschenkov
02c768d273 Merge branch 'imdg_hist' into dev 2023-10-18 13:39:41 +03:00
etreschenkov
657a3e79eb http://jira.mfd.msk:8088/browse/CLS-522 2023-10-18 13:37:43 +03:00
etreschenkov
41ce70416c http://jira.mfd.msk:8088/browse/CLS-522 2023-10-18 12:04:27 +03:00
ialbert
63d0a12f55 http://jira.mfd.msk:8088/browse/CLS-523 conditions fix 2023-10-17 16:04:00 +03:00
ialbert
488f7f999b http://jira.mfd.msk:8088/browse/CLS-523 2023-10-17 15:13:09 +03:00
ialbert
d0a359a97e http://jira.mfd.msk:8088/browse/CLS-523 removed unnecessary methods 2023-10-17 15:09:17 +03:00
ialbert
5023e922cf http://jira.mfd.msk:8088/browse/CLS-523 2023-10-17 13:48:37 +03:00
ialbert
205386d78a http://jira.mfd.msk:8088/browse/CLS-523 imdg-hist 2023-10-17 11:43:33 +03:00
etreshenkov
a048a46bf6 add search mapstores 2023-10-16 18:22:02 +03:00
AKurakin
55c8486507 registry-service http://jira.mfd.msk:8088/browse/CLS-280 2023-10-16 10:34:54 +03:00
ialbert
6887b627c7 imdg-hist example 2 2023-10-13 19:30:04 +03:00
etreschenkov
1d36a64dd5 add history mapstores 2023-10-13 16:57:56 +03:00
ialbert
86a76a4488 history example controller 2023-10-13 16:44:28 +03:00
ialbert
039f1f8510 imdg-hist example 2023-10-13 16:35:11 +03:00
AKurakin
e8895ebd84 registry-service http://jira.mfd.msk:8088/browse/CLS-280 2023-10-13 15:05:51 +03:00
AKurakin
39b1b25c80 registry-service http://jira.mfd.msk:8088/browse/CLS-280 2023-10-13 13:41:13 +03:00
AKurakin
e7ac9a8784 registry-service http://jira.mfd.msk:8088/browse/CLS-280 2023-10-12 17:42:49 +03:00
AKurakin
f4f313a1ce data fix tradingClearingRegistryType 2023-10-12 15:15:23 +03:00
aalehin
e4c362db00 http://jira.mfd.msk:8088/browse/CLS-280
---
ExecutionRegisterServiceTest fix up related to new technical requirement
2023-10-12 13:19:35 +03:00
aalehin
846a364164 http://jira.mfd.msk:8088/browse/CLS-280
---
MoneyPaymentInstructionRegisterServiceTest fix up related to new technical requirement
2023-10-12 12:00:38 +03:00
aalehin
6dece4c19f http://jira.mfd.msk:8088/browse/CLS-280
---
DepoPaymentInstructionRegisterServiceTest fix up related to new technical requirement
2023-10-12 11:54:32 +03:00
aalehin
113d0e0d65 http://jira.mfd.msk:8088/browse/CLS-280
---
registry service unit tests
2023-10-12 11:46:31 +03:00
AKurakin
03eb67f82e company-service http://jira.mfd.msk:8088/browse/CLS-538 2023-10-12 10:38:00 +03:00
etreschenkov
7b422acc4a add history mapstores 2023-10-11 21:44:02 +03:00
ialbert
4006c1f233 registry update by created TCR 2023-10-11 18:52:51 +03:00
akulikov
789f18181a fix KSRepCashRegistersReportBuilder, KSRepDepoRegistersReportBuilder 2023-10-11 16:19:41 +03:00
AKurakin
50ebdbacb9 registry-service http://jira.mfd.msk:8088/browse/CLS-280, поправил unit-тест 2023-10-11 13:23:55 +03:00
etreschenkov
ba438187e5 add history mapstores 2023-10-11 12:48:54 +03:00
AKurakin
894408354b test-api-clearing http://10.200.200.183:8701/ последние улучшение тестового модуля 2023-10-11 11:22:39 +03:00
AKurakin
3eaa2a9ac6 account-service, db-scripts http://jira.mfd.msk:8088/browse/CLS-569 2023-10-10 20:00:58 +03:00
ialbert
dc3ea5d48a http://jira.mfd.msk:8088/browse/CLS-311 2023-10-10 16:03:20 +03:00
akulikov
391384fab2 http://jira.mfd.msk:8088/browse/CLS-497 ksRepCashRegisters and ksRepDepoRegisters remove condition updatedAt == currentDay 2023-10-10 13:49:53 +03:00
ialbert
0b4c277ea0 http://jira.mfd.msk:8088/browse/CLS-568 2023-10-10 12:52:42 +03:00
AKurakin
98a2cf46d2 lim-exporter CLS-262 поправил 2 из 3 тестов 2023-10-09 16:28:08 +03:00
AKurakin
38dab80e99 lim-exporter http://jira.mfd.msk:8088/browse/CLS-262 2023-10-09 15:23:35 +03:00
AKurakin
aa1e5f7ac1 test-api-clearing issues/31 поправил перезагрузку данных с битыми MapStore 2023-10-09 13:07:31 +03:00
etreschenkov
6f04b15527 http://jira.mfd.msk:8088/browse/CLS-262 2023-10-06 17:57:12 +03:00
etreschenkov
0522b3a562 http://jira.mfd.msk:8088/browse/CLS-262 2023-10-06 14:26:50 +03:00
aalehin
76a1b74c4b http://jira.mfd.msk:8088/browse/CLS-280
---
1 and 2 bullet points
2023-10-06 11:31:07 +03:00
etreschenkov
53810fd4f1 http://jira.mfd.msk:8088/browse/CLS-280 [5] 2023-10-06 11:27:37 +03:00
etreshenkov
723f177c25 http://jira.mfd.msk:8088/browse/CLS-562 2023-10-05 19:31:54 +03:00
etreshenkov
5fd85852bb http://jira.mfd.msk:8088/browse/CLS-565 2023-10-05 18:26:23 +03:00
etreshenkov
1af852e09c http://jira.mfd.msk:8088/browse/CLS-566 2023-10-05 18:26:22 +03:00
ialbert
7e2e9dcd51 NotificationSender objectType
Sdf57/Sdf01 revise notification comment & objectType
PaymentStateMarkService valueDate/settlementDate conditions
AnltSearcher comment TCR 12 symbols
planBalance revise notification comment
session step 7 fix
session step 5 gateway request only for OK groups
session step 5 deposit return A**B change on receiver side
clearingDate today on POOL
PaymentInstruction paymentPurpose fix
2023-10-05 17:40:26 +03:00
ialbert
7a359c1d98 Merge branch 'dev_release_04_10_2023' into dev 2023-10-05 17:33:19 +03:00
ialbert
ffe2134dfd return deposit contract condition
SettlementDate/ValueDate/RefundDate clone
2023-10-05 17:32:44 +03:00
ialbert
f905772251 execution fond status denied 2023-10-05 17:32:44 +03:00
ialbert
93951a3bf5 return deposit contract condition
SettlementDate/ValueDate/RefundDate clone
2023-10-05 14:41:35 +03:00
etreshenkov
0744364924 http://jira.mfd.msk:8088/browse/CLS-561 2023-10-05 12:12:13 +03:00
etreshenkov
64c174e806 http://jira.mfd.msk:8088/browse/CLS-566 2023-10-05 12:09:13 +03:00
etreshenkov
a4c4fe8c71 http://jira.mfd.msk:8088/browse/CLS-563 [2] 2023-10-05 11:55:43 +03:00
etreshenkov
98922dac8c http://jira.mfd.msk:8088/browse/CLS-559 // http://jira.mfd.msk:8088/browse/CLS-563 [1] 2023-10-05 11:54:57 +03:00
ialbert
815631d5d2 execution fond status denied 2023-10-04 19:16:04 +03:00
akulikov
98523cf528 http://jira.mfd.msk:8088/browse/CLS-497 rename property 2023-10-04 18:37:41 +03:00
akulikov
a9ef98f4da http://jira.mfd.msk:8088/browse/CLS-497 2023-10-04 18:11:48 +03:00
akulikov
c10e41b29e http://jira.mfd.msk:8088/browse/CLS-497 rename package 2023-10-04 18:11:47 +03:00
etreschenkov
1da3af6b7a http://jira.mfd.msk:8088/browse/CLS-559 2023-10-04 10:35:02 +03:00
ialbert
9e009307f4 SDF57 xdep time check -> restriction only for auto launch
сессия шаг 7 по возврату депозитов
2023-10-03 18:57:04 +03:00
akulikov
934b9babd3 http://jira.mfd.msk:8088/browse/CLS-497 2023-10-03 17:28:05 +03:00
AKurakin
b15334d8ac Merge branch 'dev' into tmp_testutil 2023-10-02 20:39:22 +03:00
AKurakin
d78105c3b7 test-api-clearing issues/31 интеграция тестового модуля к hazelcast как клиента (были ограничения), тестирование тестового модуля 2023-10-02 20:38:54 +03:00
akurakin
2b3571ec85 issues/31 подключил тестовые контроллеры к простому http api 2023-10-02 19:08:54 +03:00
akulikov
afdfa0d6d6 http://jira.mfd.msk:8088/browse/CLS-280 npe possible fix 2023-10-02 18:44:34 +03:00
ialbert
6d5e5fd00e split deposit contract index and parentId 2023-10-02 18:10:41 +03:00
akulikov
d2cf49b7c8 http://jira.mfd.msk:8088/browse/CLS-497 2023-10-02 17:09:48 +03:00
akulikov
e99311b582 http://jira.mfd.msk:8088/browse/CLS-497 2023-10-02 15:11:00 +03:00
ialbert
4da67d145d Merge branch 'dev_release' into dev 2023-10-02 14:11:13 +03:00
ialbert
5aca4dc82f SDF57 gateway request only when A**T.TradingClearingRegistry not empty 2023-10-02 12:56:17 +03:00
ialbert
49119bcabd IdentificationFundsValidationRule TCR search status 2023-10-02 11:22:05 +03:00
ialbert
e8bb442588 when account is ANLT TCR search fix status condition 2023-10-02 11:22:05 +03:00
ialbert
93080c76c9 IdentificationFundsValidationRule TCR search status 2023-10-02 11:17:24 +03:00
ialbert
553d829b4f when account is ANLT TCR search fix status condition 2023-10-02 11:13:31 +03:00
AKurakin
f36286e14b account-service http://jira.mfd.msk:8088/browse/CLS-553 account с типом INFO 2023-09-29 20:02:44 +03:00
ialbert
4f2daf06d8 Merge branch 'dev_release' into dev 2023-09-29 18:55:14 +03:00
ialbert
afc8fb0b54 session step 2 sort execution 2023-09-29 18:46:26 +03:00
ialbert
9382c6bb2c Merge remote-tracking branch 'origin/dev' into dev 2023-09-29 18:26:54 +03:00
ialbert
dd4cd2a314 AssetTBFProcessing verbose log
session 5 step return removed gateway request
2023-09-29 18:26:32 +03:00
akulikov
40978a0017 http://jira.mfd.msk:8088/browse/CLS-280 2023-09-29 18:18:16 +03:00
akulikov
9ed6a75fe5 http://jira.mfd.msk:8088/browse/CLS-280 2023-09-29 16:59:12 +03:00
ialbert
ef317a07a5 Merge branch 'dev_release' into dev 2023-09-29 16:23:07 +03:00
ialbert
6ec042bd30 фикс с обновлением dm*x
фикс с поиском ассетов и инструментом
и ipob отключение проверки planbalance
2023-09-29 16:22:41 +03:00
AKurakin
646c8c7e77 backend-api http://jira.mfd.msk:8088/browse/CLS-553 meta и обновление DATA.sql 2023-09-29 16:15:33 +03:00
AKurakin
ef972a593d registry-service http://jira.mfd.msk:8088/browse/CLS-280 сверка с ТЗ 2023-09-29 16:05:05 +03:00
AKurakin
e278bc1bb8 registry-service http://jira.mfd.msk:8088/browse/CLS-280 предварительная очистка мап перед вставкой; улучшил логи 2023-09-29 12:25:27 +03:00
AKurakin
36b0381294 registry-service todo описание 2023-09-28 19:11:41 +03:00
ialbert
5adeeec3f7 Merge remote-tracking branch 'origin/dev' into dev 2023-09-28 18:46:50 +03:00
AKurakin
a743de0dd1 company-service http://jira.mfd.msk:8088/browse/CLS-347 поправил валидацию 2023-09-28 18:45:20 +03:00
ialbert
7fa35d108d Merge branch 'plan_balance_dmx_dmt' into dev_try_merge
# Conflicts:
#	clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/RegistryService.java
2023-09-28 18:12:25 +03:00
ialbert
11f6ea0b84 После зачисления с DMAU должно быть обращение в ТС
При DM_V поменять направление, затем закоментировать отправку в ТС.
2023-09-28 17:59:05 +03:00
ialbert
bd7f6ad460 Merge branch 'dev' into plan_balance_dmx_dmt 2023-09-28 17:26:38 +03:00
ialbert
caeece00f3 SDF06 active session error 4 -> 1 2023-09-28 17:26:17 +03:00
ialbert
43911cbb58 TCR registry update, AM*F/AM*T/AM*B creation 2023-09-28 17:25:04 +03:00
AKurakin
252b89652d registry-service правки заполнения регистров 2023-09-28 17:04:36 +03:00
akulikov
4b089a91ae http://jira.mfd.msk:8088/browse/CLS-497 fix 2023-09-28 16:55:32 +03:00
AKurakin
c66df265d9 company-service http://jira.mfd.msk:8088/browse/CLS-347 bug fix, правки поиска 2023-09-28 16:05:04 +03:00
ialbert
90a2b858bb Merge branch 'dev' into plan_balance_dmx_dmt 2023-09-28 15:17:14 +03:00
ialbert
c93e59c814 XDEP time interval
RequirementsAndObligationCreation execution match bugfix
2023-09-28 15:16:46 +03:00
mfd
1be10820a3 Added task SDEP - EDEP and errorCode for cancel XDEP 2023-09-28 14:36:51 +03:00
AKurakin
2ee26a3d68 company-service gateway-api http://jira.mfd.msk:8088/browse/CLS-347 bug fix, правки поиска 2023-09-28 14:22:32 +03:00
etreschenkov
fae7a37424 http://jira.mfd.msk:8088/browse/CLS-522 2023-09-28 14:19:26 +03:00
ialbert
96b5e90ebf Merge branch 'dev' into plan_balance_dmx_dmt 2023-09-28 13:37:57 +03:00
AKurakin
8a2855e32b platform-messaging http://jira.mfd.msk:8088/browse/CLS-280 переделки, временно отключил проверку на дубликаты, т.к. надо добавить новое поле. 2023-09-28 13:21:29 +03:00
AKurakin
03aa29413c http://jira.mfd.msk:8088/browse/CLS-550 обратная совместимость 2023-09-28 11:41:49 +03:00
AKurakin
83ff343c92 http://jira.mfd.msk:8088/browse/CLS-550 улучшил лог. 2023-09-28 11:29:32 +03:00
akurakin
bf3ba4e6aa issues/31 перенос тестовых контроллеров в отдельный модуль (т.к. опасные функции) 2023-09-28 11:02:32 +03:00
AKurakin
4951559891 http://jira.mfd.msk:8088/browse/CLS-550 не доверять пользователю указывать свой userId, проставляется на бэкенде. 2023-09-28 10:28:09 +03:00
ialbert
4df7131630 DM*V creation for MEDM session 2023-09-27 18:39:35 +03:00
ialbert
e16767c15a Merge branch 'dev' into plan_balance_dmx_dmt 2023-09-27 15:15:06 +03:00
AKurakin
1c9de78f5e http://jira.mfd.msk:8088/browse/CLS-500 изменена ошибка 5426 2023-09-27 15:13:22 +03:00
AKurakin
60cff01fe2 backend-api utility-service http://jira.mfd.msk:8088/browse/CLS-550 2023-09-27 13:14:05 +03:00
AKurakin
81456f3d2e dbf-exporter оставлять временные файлы (в папке export-dbf-service.store.local-temp-dir) 2023-09-27 11:06:52 +03:00
ialbert
f467b1062b PaymentInstructionOutboundService + search for anlt by contract
sdf57 session continue event fix
2023-09-26 19:13:24 +03:00
AKurakin
b9b3013b2d clearing-validation http://git.mfd.msk/mfd/clearing/-/issues/12 IMDGMessageResolver поправил при работе с некорректными текстами ошибок (когда кол-во аргументов не совпадает, выдаёт более человекочитаемый текст + warn 2023-09-26 16:00:09 +03:00
ialbert
b749839963 return deposit dm*x/dm*t 2023-09-26 15:06:22 +03:00
akulikov
0761de4b7e http://jira.mfd.msk:8088/browse/CLS-497 fix test 2023-09-26 13:57:35 +03:00
akulikov
f9c09aa792 http://jira.mfd.msk:8088/browse/CLS-497 fix 2023-09-26 13:54:24 +03:00
ialbert
9a074addcf Merge branch 'dev' into plan_balance_dmx_dmt 2023-09-26 13:34:03 +03:00
ialbert
c201e850ce FINL/XDEP removed planned balance checked 2023-09-26 13:33:31 +03:00
ialbert
0961748a2a sdf57 session autostart fix awaiting sdfs
sdf57 dmau logic only for InOutDirection.in
identificationFunds dmau.debit/am_t.credit
2023-09-26 13:21:47 +03:00
ialbert
c940316494 RegistryService#returnDeposit validator imdg bugfix 2023-09-26 13:15:18 +03:00
ialbert
a80742af7d Merge branch 'dev' into plan_balance_dmx_dmt 2023-09-26 11:45:47 +03:00
ialbert
1a0601ba56 sdf57 bugfix contract not empty check 2023-09-26 11:45:00 +03:00
AKurakin
5cf9f6476e db-scripts обновил справочник sessionType id = 3 (code = XDEP) 2023-09-26 10:59:40 +03:00
AKurakin
0000a31942 db-scripts обновил справочник MARKET id = 82 (code = BBVC) 2023-09-25 17:54:43 +03:00
ialbert
fa45f6335b bugfix обновление регистров при создании ТКР
SDF57 specif -> contractr учитываются регистры со статусом MNG
2023-09-25 17:45:17 +03:00
ialbert
e40a8dc724 1. planBalance проставляется для 5 шага возврата депозитов
2. проверки, создание(обновление) dm_x -> dm_x/dm_t
2023-09-25 17:43:43 +03:00
AKurakin
155b899e5d account-service backend-api http://jira.mfd.msk:8088/browse/CLS-548 information-account-new теперь не нужен, вместо него используется account-new 2023-09-25 16:16:07 +03:00
akulikov
80fcb32abe http://jira.mfd.msk:8088/browse/CLS-497 2023-09-25 15:48:26 +03:00
AKurakin
db00bb906f account-service http://jira.mfd.msk:8088/browse/CLS-548 2023-09-25 12:15:48 +03:00
akulikov
f595f0f251 http://jira.mfd.msk:8088/browse/CLS-497 2023-09-25 12:04:39 +03:00
AKurakin
be311962cb imdg http://git.mfd.msk/mfd/clearing/-/issues/22 debug reload 2023-09-23 20:21:42 +03:00
AKurakin
91cc82f154 data добавил значение в словарь 2023-09-22 19:29:25 +03:00
AKurakin
5a4a1cbf56 imdg http://git.mfd.msk/mfd/clearing/-/issues/22 debug reload 2023-09-22 19:20:49 +03:00
AKurakin
248156c45d reports-service http://jira.mfd.msk:8088/browse/CLS-497 KSCommissionTradesReportBuilder 2023-09-22 19:09:09 +03:00
ialbert
0f5feb3c7e identification funds
refund date
sessions error after revision
2023-09-22 19:04:22 +03:00
AKurakin
633f34ee51 reports-service http://jira.mfd.msk:8088/browse/CLS-497 правки 2023-09-22 17:54:32 +03:00
AKurakin
ea0b8a74dd reports-service http://jira.mfd.msk:8088/browse/CLS-497 правки 2023-09-22 17:26:40 +03:00
AKurakin
53b71431ea reports-service http://jira.mfd.msk:8088/browse/CLS-497 KSRepCashRegisterSumsReportBuilder поправил парсинг человекочитаемого формата данных 2023-09-22 15:45:54 +03:00
AKurakin
57bbce07da reports-service http://jira.mfd.msk:8088/browse/CLS-497 улучшил логирование 2023-09-22 15:19:30 +03:00
AKurakin
bef57e096b reports-service http://jira.mfd.msk:8088/browse/CLS-497 ksCommisonTrades, ещё логов trace 2023-09-22 14:22:02 +03:00
AKurakin
0db32aac36 reports-service http://jira.mfd.msk:8088/browse/CLS-497 ksRepCashRegisterSums fix 2023-09-22 13:54:29 +03:00
mfd
2d7a1f452e Added error code to stop session when planningBalance do not equals balance 2023-09-22 13:50:32 +03:00
mfd
fa0b95ba5a Added error code to deny refund date changement 2023-09-22 13:34:30 +03:00
AKurakin
5b85844e5e reports-service http://jira.mfd.msk:8088/browse/CLS-497 ksRepCashRegisterSums 2023-09-22 12:39:56 +03:00
ialbert
334e01d02d SDF57 statement.contract 2023-09-21 18:57:35 +03:00
ialbert
e366b647cc registries/identificationFunds 2023-09-21 18:56:07 +03:00
AKurakin
69aa7aa047 platform-imdg-api-hazelcast-impl рефакторинг ожидания дожидания http://git.mfd.msk/mfd/clearing/-/issues/29 небольшое улучшение 2023-09-21 13:53:44 +03:00
AKurakin
565eb70988 platform-imdg-api-hazelcast-impl рефакторинг ожидания дожидания http://git.mfd.msk/mfd/clearing/-/issues/29 и в backend-api дожидание готовности перед работой RequestInfoAccepter 2023-09-21 13:31:17 +03:00
AKurakin
8c7c88c84f backend-api meta self-validation исключения без стектрейса & warning->info 2023-09-21 13:08:40 +03:00
AKurakin
06efab761d account-service company-service securities-service поправил валидацию словарей DictionaryPresentRule 2023-09-21 12:22:13 +03:00
AKurakin
3ba0611852 backend-api http://jira.mfd.msk:8088/browse/CLS-544 2023-09-21 10:57:40 +03:00
akulikov
488adfa605 http://jira.mfd.msk:8088/browse/CLS-497 2023-09-20 18:05:59 +03:00
ialbert
d9e2796185 SDF57 DM*T/DM*X запускают сессию по возвратам депозитов
перерасчет ассетов при проставлении ОК DM*V
2023-09-20 16:39:47 +03:00
ialbert
091dc2dc1d RegistryService#changeStatusExtract 2023-09-20 15:11:57 +03:00
mfd
7fe717be2b Added ERRORCODES 2023-09-20 13:20:45 +03:00
AKurakin
3756b73c34 z-distr поправил путь к meta.json 2023-09-20 13:03:05 +03:00
AKurakin
2a82fcc4ae account-service http://jira.mfd.msk:8088/browse/CLS-527 добавил логов 2023-09-20 12:50:34 +03:00
AKurakin
6a9867f477 account-service http://jira.mfd.msk:8088/browse/CLS-527 правки 2023-09-20 11:39:45 +03:00
AKurakin
6b7c41705c data, meta 3.8.0.54 2023-09-20 11:06:13 +03:00
ialbert
93ffe36ea6 SDF54/SDF55/SDF57 - D**I регистры 2023-09-19 18:17:31 +03:00
AKurakin
b19912f430 account-service http://jira.mfd.msk:8088/browse/CLS-527 обработка SDF52 2023-09-19 17:52:59 +03:00
AKurakin
a16fe442fa company-service http://jira.mfd.msk:8088/browse/CLS-538 CompanyRoleSet 2023-09-19 15:24:00 +03:00
AKurakin
e19cb6876e account-service http://jira.mfd.msk:8088/browse/CLS-527 2023-09-19 13:28:50 +03:00
AKurakin
f09b02b693 backend-api http://jira.mfd.msk:8088/browse/CLS-537 2023-09-19 11:26:03 +03:00
AKurakin
70e0c499ed backend-api http://jira.mfd.msk:8088/browse/CLS-540 up meta 3.8.0.52 2023-09-18 18:38:53 +03:00
AKurakin
195d6ac55b account-service http://jira.mfd.msk:8088/browse/CLS-509 поправил опечатки в валидаторе 2023-09-18 18:20:14 +03:00
AKurakin
9a97006dcb account-service utility-service http://jira.mfd.msk:8088/browse/CLS-527 DF52 ожидание акцепта пользователя через notification'sы 2023-09-18 17:45:56 +03:00
ialbert
eef8e8499a SDF55/PaymentInstructionOutboundService 2023-09-18 17:41:29 +03:00
ialbert
1deb4337cb InspectionObligations 5й шаг 2023-09-18 17:41:29 +03:00
ialbert
5b82083596 http://jira.mfd.msk:8088/browse/CLS-536 + InspectionObligations assets 2023-09-18 17:41:28 +03:00
akulikov
2db5bbc7c0 http://jira.mfd.msk:8088/browse/CLS-497?focusedCommentId=56715&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-56715 2023-09-18 14:43:14 +03:00
AKurakin
45008556ab account-service http://jira.mfd.msk:8088/browse/CLS-509 http://jira.mfd.msk:8088/browse/CLS-542 имя счетов уникальное между всеми типами (поправил для создания по sdf01-sdf08) 2023-09-18 12:46:04 +03:00
AKurakin
561ddd3b2d account-service http://jira.mfd.msk:8088/browse/CLS-509 http://jira.mfd.msk:8088/browse/CLS-542 валидация счетов 2023-09-18 12:23:22 +03:00
AKurakin
89b6567beb company-service http://jira.mfd.msk:8088/browse/CLS-541 зменил лог trace 2023-09-15 11:54:42 +03:00
AKurakin
bb0f836d3c company-service http://jira.mfd.msk:8088/browse/CLS-541 с пробелами тоже не пускать 2023-09-15 11:12:32 +03:00
AKurakin
29ecbb8956 company-service http://jira.mfd.msk:8088/browse/CLS-541 (bug fix 9dc45f2165) 2023-09-15 10:22:34 +03:00
etreschenkov
4d4e536154 fix gateway-api 2023-09-14 18:01:26 +03:00
AKurakin
425d5c4e13 imdg добавил индекс на Account 2023-09-14 17:00:13 +03:00
AKurakin
38333d5b95 account-service http://jira.mfd.msk:8088/browse/CLS-509 InformationAccount - их может быть много 2023-09-14 16:59:51 +03:00
AKurakin
4c287bfed8 backend-api http://jira.mfd.msk:8088/browse/CLS-534 meta 2023-09-14 16:19:21 +03:00
AKurakin
da22a11afe company-service http://jira.mfd.msk:8088/browse/CLS-509 редактирование CompanySymbol (частично rollback и исправил) 2023-09-14 13:51:26 +03:00
AKurakin
8b35c7d6c5 company-service http://jira.mfd.msk:8088/browse/CLS-509 редактирование CompanySymbol 2023-09-14 13:18:18 +03:00
AKurakin
9fb5303754 account-service http://jira.mfd.msk:8088/browse/CLS-509 validator bug fix 2023-09-14 13:02:30 +03:00
AKurakin
eccfb27efe account-service CLS-533 разрешение редактировать все счета (потому что только статус меняется) 2023-09-14 12:52:24 +03:00
AKurakin
9dc45f2165 company-service http://jira.mfd.msk:8088/browse/CLS-259 companyInfo реквест редактирует shortName/fullName 2023-09-14 10:46:30 +03:00
AKurakin
b7c7e8b358 backend-api http://jira.mfd.msk:8088/browse/CLS-534 2023-09-13 19:28:23 +03:00
etreschenkov
161d16e749 fix gateway-api 2023-09-13 18:35:56 +03:00
AKurakin
8fb0dd63f6 backend-api http://jira.mfd.msk:8088/browse/CLS-531 http://jira.mfd.msk:8088/browse/CLS-534 meta 2023-09-13 18:34:30 +03:00
ialbert
9c559b5c80 D**V registries 2023-09-13 17:35:55 +03:00
AKurakin
41d66b9e96 company-service securities-service http://jira.mfd.msk:8088/browse/CLS-454 поправил выдачу ошибок 2023-09-13 15:27:05 +03:00
AKurakin
2d08c7d589 dbf-exporter http://jira.mfd.msk:8088/browse/CLS-529 S_DF54 формат 2023-09-13 14:03:35 +03:00
ialbert
e2740347ba http://jira.mfd.msk:8088/browse/CLS-530 2023-09-13 13:46:23 +03:00
AKurakin
c5398c7a1d securities-service http://jira.mfd.msk:8088/browse/CLS-516 уникальность FixedIncomeCashFlow 2023-09-12 17:47:59 +03:00
AKurakin
9f32cd93a4 swt-importer fix test 2023-09-12 17:46:34 +03:00
AKurakin
9507dc10be swt-importer улучшил логи, добавил юнит тест 2023-09-12 17:32:21 +03:00
ialbert
21ec74df69 session not launched notification 2023-09-12 15:22:39 +03:00
ialbert
08271d7e36 GatewayRequester 5 шаг сессий 2023-09-12 14:01:52 +03:00
AKurakin
8cd1bda1ed backend-api http://jira.mfd.msk:8088/browse/CLS-512 meta порядок... снова... 2023-09-12 13:34:10 +03:00
AKurakin
d6e462f84f gateway-api securities-service http://jira.mfd.msk:8088/browse/CLS-516 2023-09-12 13:15:17 +03:00
AKurakin
a3ac454cb3 scheduler-service LauncherSender поправил передачу дополнительных параметров CLS-293 2023-09-12 11:20:06 +03:00
ialbert
b2d0d0c742 GatewayRequester 2023-09-11 20:04:28 +03:00
ialbert
6aa252f801 GatewayRequester 2023-09-11 20:04:28 +03:00
ialbert
71cb78b72c Sdf10Executor опечатка в логе
GatewayRequester исключение
2023-09-11 20:04:28 +03:00
ialbert
c4c2afe72c InspectionObligations GatewayRequester 2023-09-11 20:04:28 +03:00
AKurakin
66ab0cad31 backend-api http://jira.mfd.msk:8088/browse/CLS-525 meta счета... 2023-09-11 19:29:16 +03:00
AKurakin
2da6edd976 Revert "backend-api http://jira.mfd.msk:8088/browse/CLS-525 выдача некоторых Account по meta (составное поле)"
This reverts commit 8e73a2eced.
2023-09-11 19:04:01 +03:00
AKurakin
d4b9ee6ec5 backend-api http://jira.mfd.msk:8088/browse/CLS-525 meta fix GALB 2023-09-11 18:55:42 +03:00
etreshenkov
26f6c081f4 asset operation fields [gateway] 2023-09-11 17:04:27 +03:00
AKurakin
d95f22662d account-service http://jira.mfd.msk:8088/browse/CLS-489 SDF52 переделал поиск счетов 2023-09-11 16:58:34 +03:00
ialbert
4226df3e5c asset operation fields 2023-09-11 16:49:52 +03:00
AKurakin
14f6d5656b account-service http://jira.mfd.msk:8088/browse/CLS-509 InformationAccount 2023-09-11 16:11:55 +03:00
AKurakin
4ee335efd5 backend-api http://jira.mfd.msk:8088/browse/CLS-519 meta fix 2023-09-11 14:27:57 +03:00
AKurakin
44880a2b4b backend-api http://jira.mfd.msk:8088/browse/CLS-519 meta fix (поправил регистр атрибута shortname) 2023-09-11 13:30:26 +03:00
AKurakin
f0a090b00c gateway-api securities-service http://jira.mfd.msk:8088/browse/CLS-516 2023-09-11 12:55:57 +03:00
AKurakin
8e73a2eced backend-api http://jira.mfd.msk:8088/browse/CLS-525 выдача некоторых Account по meta (составное поле) 2023-09-08 19:12:20 +03:00
ialbert
d1b368d0b5 SDF20 inDocument NONREF fix, registries copying clearing_date/trading_date/created fix 2023-09-08 19:07:39 +03:00
AKurakin
174ee519d3 backend-api http://jira.mfd.msk:8088/browse/CLS-525 meta 2023-09-08 17:31:01 +03:00
AKurakin
c6df499058 backend-api http://jira.mfd.msk:8088/browse/CLS-510 meta InformationAccountNewRequest 2023-09-08 17:20:22 +03:00
ialbert
7a7468b9f2 SDF13 assets fix, SDF06 DM*T search status conditions 2023-09-08 17:14:16 +03:00
AKurakin
d06be93bc0 gateway-api и др. http://jira.mfd.msk:8088/browse/CLS-506 (отменчет правку по CLS-496) 2023-09-08 15:52:24 +03:00
etreschenkov
5c0c900f6b http://jira.mfd.msk:8088/browse/CLS-521 2023-09-08 15:39:25 +03:00
AKurakin
773e7133f3 backend-api http://jira.mfd.msk:8088/browse/CLS-524 http://jira.mfd.msk:8088/browse/CLS-519 поправил meta 3.8.0.48 2023-09-08 14:41:32 +03:00
AKurakin
065a1179ef account-service http://jira.mfd.msk:8088/browse/CLS-489 sdf52 2023-09-08 13:13:14 +03:00
AKurakin
ccdd38ad1a imdg http://jira.mfd.msk:8088/browse/CLS-520 RegistryMapStore 2023-09-08 12:14:52 +03:00
akulikov
5135ddcd99 http://jira.mfd.msk:8088/browse/CLS-497 2023-09-08 12:08:19 +03:00
ialbert
2a1dfad01b финальная МКР сессия фикс по блокировкам и проверке обязательств 2023-09-08 12:02:47 +03:00
ialbert
285f9b5188 sessions fix 2023-09-07 20:19:10 +03:00
ialbert
99e98f6a28 IPO0, FINL, MEDM 2023-09-07 19:36:23 +03:00
AKurakin
0e19218728 imdg http://jira.mfd.msk:8088/browse/CLS-517 ExecutionDepositMapStore 2023-09-07 18:06:29 +03:00
AKurakin
db06a05eda reports-service UnfulfilledDealReport поправил securityId (поправил тест) 2023-09-07 16:52:29 +03:00
AKurakin
b0dc6e6aa9 imdg http://jira.mfd.msk:8088/browse/CLS-517 ExecutionDepositMapStore 2023-09-07 16:49:26 +03:00
AKurakin
75233d560f reports-service UnfulfilledDealReport поправил securityId 2023-09-07 16:42:08 +03:00
AKurakin
13a45ff83a securities-service http://jira.mfd.msk:8088/browse/CLS-516 api-gateway 2023-09-07 16:06:11 +03:00
AKurakin
6ebc2dc2c6 gateway-api http://jira.mfd.msk:8088/browse/CLS-464 игнор без обязательных полей, вывод в log debug проигноренных 2023-09-07 16:05:05 +03:00
akulikov
54d2183b45 http://jira.mfd.msk:8088/browse/CLS-497 zone id fix 2023-09-07 13:57:13 +03:00
AKurakin
37885e9879 reports-service http://jira.mfd.msk:8088/browse/CLS-497 поправил временные зоны 2023-09-07 13:28:18 +03:00
akulikov
796f247fec http://jira.mfd.msk:8088/browse/CLS-497 time fixes, rename session_date, executionDealReport fixes 2023-09-07 12:22:28 +03:00
ialbert
1ee7c5a985 D**I 2023-09-07 11:12:51 +03:00
AKurakin
bb4fe2abe5 account-service http://jira.mfd.msk:8088/browse/CLS-489 sdf53 заполнение date 2023-09-07 10:06:52 +03:00
akulikov
f86accfa44 http://jira.mfd.msk:8088/browse/CLS-497 fix 2023-09-06 22:40:25 +03:00
akulikov
e93baadd04 http://jira.mfd.msk:8088/browse/CLS-497 fix log 2023-09-06 22:00:19 +03:00
akulikov
3ce2db798c http://jira.mfd.msk:8088/browse/CLS-497 some fixes 2023-09-06 21:22:14 +03:00
AKurakin
e1df8110a7 account-service http://jira.mfd.msk:8088/browse/CLS-489 sdf53 заполнение result 2023-09-06 19:44:56 +03:00
AKurakin
b8df4ad882 imdg http://jira.mfd.msk:8088/browse/CLS-502 DDL 3.8 bugfix MoneyMarketSecurityMapStore 2023-09-06 19:05:11 +03:00
AKurakin
b048c84bee account-service http://jira.mfd.msk:8088/browse/CLS-489 sdf52 2023-09-06 17:55:22 +03:00
AKurakin
d69bbc09b5 backend-api KafkaConfig scope - prototype (должно было и раньше работать, т.к. там больше очередей нет) 2023-09-06 17:25:44 +03:00
AKurakin
da5f351c54 http://jira.mfd.msk:8088/browse/CLS-502 DDL 3.8.1 2023-09-06 17:04:15 +03:00
etreschenkov
7a520e49d6 build distr 2023-09-06 16:30:50 +03:00
AKurakin
4eb265d2f0 dbf-exporter http://jira.mfd.msk:8088/browse/CLS-515 S_DF53 2023-09-06 16:18:43 +03:00
AKurakin
2954c33821 http://jira.mfd.msk:8088/browse/CLS-502 DDL 3.8 backend-api imdg classes db-scripts 2023-09-06 15:36:24 +03:00
etreschenkov
1ea2c551ee build distr 2023-09-06 14:50:52 +03:00
etreschenkov
e24b580ca6 build distr 2023-09-06 14:15:47 +03:00
etreschenkov
a8b4293225 build distr 2023-09-06 14:15:47 +03:00
AKurakin
b40d8a959a http://jira.mfd.msk:8088/browse/CLS-465 обновил DATA.sql 2023-09-06 13:18:49 +03:00
AKurakin
59496d97b0 backend-api http://jira.mfd.msk:8088/browse/CLS-512 meta 2023-09-06 12:49:35 +03:00
ialbert
f75b262c75 http://jira.mfd.msk:8088/browse/CLS-488 Sdf11#outDocument 2023-09-06 12:30:19 +03:00
AKurakin
de16808e25 clearing-service http://jira.mfd.msk:8088/browse/CLS-311 доделки Sdf54 2023-09-06 12:14:43 +03:00
AKurakin
534e1d8cfe securities-service http://jira.mfd.msk:8088/browse/CLS-516 2023-09-06 11:58:14 +03:00
akulikov
e4c8fc8278 http://jira.mfd.msk:8088/browse/CLS-497 some big decimal fixes 2023-09-06 11:47:06 +03:00
ialbert
21df705094 SDF группы для сессий
избавился от StatementService.java
2023-09-05 19:14:17 +03:00
akulikov
0eadc2f7e3 http://jira.mfd.msk:8088/browse/CLS-497 some big decimal fixes 2023-09-05 14:18:49 +03:00
ialbert
8840d89bb0 SdfGroup unit test 2023-09-05 14:00:08 +03:00
ialbert
b92475b272 http://jira.mfd.msk:8088/browse/CLS-465 data.xml добавил новую ошибку в клиринг 2023-09-05 13:52:01 +03:00
ialbert
7ed3e267db SdfGroup added Session sdf groups 2023-09-05 13:50:06 +03:00
ialbert
d68220bf41 http://jira.mfd.msk:8088/browse/CLS-465 2023-09-05 13:48:27 +03:00
AKurakin
4b021a5bdf Merge remote-tracking branch 'origin/tmp_cls' into dev 2023-09-05 12:54:42 +03:00
AKurakin
8fbee21a95 clearing-service http://jira.mfd.msk:8088/browse/CLS-311 поправил заполнение Sdf54 2023-09-05 12:42:46 +03:00
ialbert
04f35dcdaa TaskType revise key fix 2023-09-05 12:03:09 +03:00
ialbert
25d8915647 rollback SdfGroup 2023-09-05 11:40:01 +03:00
ialbert
2b4e189a54 StatementServiceV2 move to package 2023-09-05 11:38:49 +03:00
AKurakin
881c66dc1b Merge branch 'tmp_cls' into dev 2023-09-05 11:09:04 +03:00
akulikov
4a08f72d40 http://jira.mfd.msk:8088/browse/CLS-497 KSCommissionTradesReportBuilder fix 2023-09-05 11:04:26 +03:00
AKurakin
67d851b5b6 clearing-service http://jira.mfd.msk:8088/browse/CLS-504 + добавил новую ошибку 2023-09-04 18:05:31 +03:00
AKurakin
b9f924aa8d clearing-service http://jira.mfd.msk:8088/browse/CLS-513 2023-09-04 16:06:54 +03:00
AKurakin
ede6699a56 clearing-service http://jira.mfd.msk:8088/browse/CLS-504 2023-09-04 13:36:28 +03:00
AKurakin
9564202df6 clearing-service http://jira.mfd.msk:8088/browse/CLS-500 поправил код ошибки 5004 2023-09-04 12:44:49 +03:00
AKurakin
5d7772d45e clearing-service http://jira.mfd.msk:8088/browse/CLS-500 2023-09-04 12:33:07 +03:00
AKurakin
afb21eb2ba clearing-service BalanceRevise ревизии 3 стадии AgainRevise, вынес стадию 1. 2023-09-04 11:23:45 +03:00
akulikov
199d9b3c58 http://jira.mfd.msk:8088/browse/CLS-497 2023-09-01 18:33:36 +03:00
AKurakin
ecb92d024f clearing-service fix ExecutionDepositComponent 2023-09-01 18:22:55 +03:00
AKurakin
210b855cb2 clearing-service BalanceRevise ревизии 3 стадии AgainRevise. 2023-09-01 18:11:30 +03:00
AKurakin
ef217e8ff7 clearing-service FinishingSession статусы для Execution. imdg добавил индексы 2023-09-01 12:38:39 +03:00
akulikov
3ec26e9d91 http://jira.mfd.msk:8088/browse/CLS-497 2023-09-01 12:04:16 +03:00
AKurakin
76ba3463cf clearing-service статусы в InspectionObligationsDepositReturn при неполном покрытии amount для/до финальной стадии 2023-08-31 14:39:00 +03:00
AKurakin
cd67d0b113 clearing-service SDF_01 поправил сверку баланса для инфосчетов 2023-08-31 14:39:00 +03:00
akulikov
317b24748c http://jira.mfd.msk:8088/browse/CLS-497 change predicate 2023-08-31 12:13:43 +03:00
AKurakin
f35e4bce23 clearing-service http://jira.mfd.msk:8088/browse/CLS-508 Sdf13 fix status 2023-08-30 19:21:57 +03:00
AKurakin
27ed787013 meta update 30.08.2023 2023-08-30 19:10:26 +03:00
AKurakin
835f9932d9 clearing-service http://jira.mfd.msk:8088/browse/CLS-508 Sdf04 / Sdf13 ожидание полностью готовой группы в SessionMonitor 2023-08-30 18:01:37 +03:00
AKurakin
f5d5c8acfb clearing-service Sdf13 ожидание полностью готовой группы в SessionMonitor 2023-08-30 17:53:52 +03:00
AKurakin
47d0830e9e clearing-service Sdf04 ожидание полностью готовой группы в SessionMonitor 2023-08-30 17:39:50 +03:00
AKurakin
546359752b clearing-service Sdf04 ожидание полностью готовой группы в SessionMonitor 2023-08-30 16:58:25 +03:00
AKurakin
960ed3f0c8 gateway-api http://jira.mfd.msk:8088/browse/CLS-347 bug fix 2023-08-30 16:07:18 +03:00
AKurakin
228b290570 gateway-api http://jira.mfd.msk:8088/browse/CLS-347 bug fix 2023-08-30 15:27:38 +03:00
AKurakin
38916cdeb1 clearing-service http://jira.mfd.msk:8088/browse/CLS-307 SPLT улучшил валидацию 2023-08-30 15:18:05 +03:00
AKurakin
a448a78415 clearing-service Sdf04 ожидание полностью готовой группы в SessionMonitor 2023-08-30 14:28:25 +03:00
AKurakin
fe61ca6e02 db-scripts DATA.sql обновил 2023-08-30 13:22:09 +03:00
akulikov
75fe7a9593 http://jira.mfd.msk:8088/browse/CLS-497 date format fixes 2023-08-29 21:40:38 +03:00
AKurakin
5cdf12a323 clearing-service http://jira.mfd.msk:8088/browse/CLS-307 SPLT bug fix 2023-08-29 17:05:54 +03:00
AKurakin
6237f534f2 clearing-service http://jira.mfd.msk:8088/browse/CLS-307 SPLT default direction 2023-08-29 14:18:43 +03:00
AKurakin
f720d2a945 clearing-service http://jira.mfd.msk:8088/browse/CLS-307 SPLT рефакторинг 2023-08-29 13:38:21 +03:00
AKurakin
99e83b8bf9 clearing-service http://jira.mfd.msk:8088/browse/CLS-307 SPLT todo уточнить ТЗ 2023-08-28 16:16:15 +03:00
AKurakin
94831710e4 up meta version 2023-08-28 12:33:39 +03:00
akulikov
4dc73661d8 http://jira.mfd.msk:8088/browse/CLS-497 add TRADE_NUM 2023-08-28 11:43:30 +03:00
ialbert
9f046ae383 возврат депозитов шаг 5: DM*X/DM*T 2023-08-25 19:08:52 +03:00
ialbert
cca5991bd6 sdf20 запрос в gateway только при зачислении 2023-08-25 18:15:00 +03:00
AKurakin
b4397a25a8 dbf-importer рефакторинг, юниттесты 2023-08-25 18:09:38 +03:00
AKurakin
e9de1c87a7 gateway-api company-service http://jira.mfd.msk:8088/browse/CLS-347 2023-08-25 18:05:08 +03:00
ialbert
d81c4b7040 sdf20, sdf21 2023-08-25 17:45:57 +03:00
ialbert
8b54b86ae9 SDF20 поиск DS*T 2023-08-25 17:26:53 +03:00
psemenkov
adc20ee46b http://jira.mfd.msk:8088/browse/CLS-467
Исправил TransactionNumber в ДФ-20.
2023-08-25 16:12:55 +03:00
ialbert
316a5bb6aa sdf06 TCR validation log fix 2023-08-25 15:25:43 +03:00
ialbert
cfda9a6eba sdf06 TCR validation log fix 2023-08-25 15:23:26 +03:00
ialbert
d6a790cec7 sdf06 missing TCR
при ожидание ответа gateway новые sdf06 запросы добавляются в очередь
2023-08-25 15:09:49 +03:00
AKurakin
4763724315 securities-service http://jira.mfd.msk:8088/browse/CLS-420 GatewaySecurityService будет пытаться делать, несмотря на ошибки. 2023-08-25 10:55:54 +03:00
etreshenkov
f5831500c8 Revert "backend-api update meta поправил поле в ChangeRefundDateActionNew.java в соответствии с метой"
This reverts commit e053ff652d.
2023-08-24 20:04:11 +03:00
etreshenkov
3c22c99e51 Revert "backend-api update meta поправил поле в ChangeRefundDateActionNew.java в соответствии с метой (fix)"
This reverts commit d7f0860726.
2023-08-24 20:04:10 +03:00
ialbert
9a84b80c83 первичная B0 сессия условие на выбор сделок 2023-08-24 17:12:39 +03:00
AKurakin
d7f0860726 backend-api update meta поправил поле в ChangeRefundDateActionNew.java в соответствии с метой (fix) 2023-08-24 16:20:02 +03:00
AKurakin
e053ff652d backend-api update meta поправил поле в ChangeRefundDateActionNew.java в соответствии с метой 2023-08-24 15:27:34 +03:00
AKurakin
49b920c6e9 backend-api update meta (3.7.0.43 24.08.2023 http://jira.mfd.msk:8088/browse/CLS-405) 2023-08-24 15:10:06 +03:00
ialbert
1eb2b029e1 промежуточная сессия МКР inclusion to POOL value date condition 2023-08-24 14:45:50 +03:00
AKurakin
f95f1f241d account-service http://jira.mfd.msk:8088/browse/CLS-489 продолжение обработки до SDF_53, добавил имя входного файла для запроса генерации квитанций DF-53 2023-08-24 11:33:31 +03:00
AKurakin
f54efc6b2b dbf-exporter http://jira.mfd.msk:8088/browse/CLS-489 добавил логи 2023-08-23 20:18:17 +03:00
AKurakin
622ea90e81 dbf-exporter http://jira.mfd.msk:8088/browse/CLS-489 добавил логи 2023-08-23 19:36:22 +03:00
ialbert
79a6cc846f clearing-service refund date change for registries 2023-08-23 18:38:45 +03:00
ialbert
d14b49ce85 http://jira.mfd.msk:8088/browse/CLS-498 backend-api 2023-08-23 17:57:30 +03:00
akulikov
d1082874cb http://jira.mfd.msk:8088/browse/CLS-497 2023-08-23 17:41:41 +03:00
AKurakin
f253caf3d2 account-service http://jira.mfd.msk:8088/browse/CLS-489 продолжение обработки до SDF_53. 2023-08-23 17:06:44 +03:00
ialbert
523d5b4bc1 CLRD статус регистров для всех сессий 2023-08-23 17:04:25 +03:00
ialbert
bdc4f3fb67 FormingPaymentInstructionSecurities добавил условие sessionId для сделок по деньгам 2023-08-23 14:50:46 +03:00
ialbert
582472b951 Первичная T0 сессия фикс маркет кодов 2023-08-23 14:36:43 +03:00
ialbert
7ee4e14126 промежуточная МКР сессия MEDM: убрал возврат депозитов (5 и 7 шаги) 2023-08-23 14:32:48 +03:00
ialbert
dd272858f8 проверка sdf21 на наличие DS*T transactionNumber 2023-08-23 14:18:44 +03:00
AKurakin
5c4b7adf31 swt-importer добавил юниттест 2023-08-23 14:09:00 +03:00
ialbert
54b209a5ab swt-importer sdf21 учитывается направление при проверке на выгруженность 2023-08-23 14:04:52 +03:00
ialbert
d41edf57ff DM*I поиск по TCR#id 2023-08-23 14:04:51 +03:00
psemenkov
2f0d91574c http://jira.mfd.msk:8088/browse/CLS-467
Добавил новые поля в ДФ-20.
2023-08-23 13:44:32 +03:00
AKurakin
5c49e4e624 swt-importer комментарий 2023-08-23 13:34:19 +03:00
ialbert
866849dc8f добавил условие на sessionId: сессии TRDT, финальная/промежуточная МКР, возврат депозитов 2023-08-23 12:12:08 +03:00
psemenkov
7164442752 http://jira.mfd.msk:8088/browse/CLS-453
Сделал проверку на уникальность security.securitysymbol регистронезависимой.
2023-08-23 11:50:13 +03:00
ialbert
0ad02d573b SDF06, SDF57 DM*I 2023-08-23 11:01:43 +03:00
AKurakin
c4476c89a9 swt-exporter clearing-service DF11Exporter result OK убрал возможный ! 2023-08-23 10:47:44 +03:00
AKurakin
82e2b08df1 swt-exporter DF11Exporter result OK убрал возможный ! 2023-08-23 10:26:23 +03:00
ialbert
7e0eda6fe3 FormingPaymentInstructionSecurities bugfix 2023-08-22 18:37:06 +03:00
psemenkov
e9636e8723 http://jira.mfd.msk:8088/browse/CLS-262
Обновил выгрузку денег.
2023-08-22 17:41:15 +03:00
ialbert
0933657ea3 D**I 2023-08-22 16:03:25 +03:00
akulikov
017f54a559 http://jira.mfd.msk:8088/browse/CLS-358 2023-08-22 15:17:51 +03:00
ialbert
ce8c397fca moved RegistryManager to separate package
added TradingTimeService
added RegistryUnit.I
2023-08-22 14:34:18 +03:00
psemenkov
8e57cd810e http://jira.mfd.msk:8088/browse/CLS-262
Обновил выгрузку ценных бумаг DEPO
2023-08-22 13:44:32 +03:00
AKurakin
bc101f6cb4 imdg http://jira.mfd.msk:8088/browse/CLS-473 поправил ограничение по дате на ExecutionFondMapStore, рефакторинг 2023-08-22 10:50:22 +03:00
ialbert
91d31132be SDF20 2023-08-21 19:46:34 +03:00
ialbert
944d402c8d SDF10/SDF20 2023-08-21 18:45:29 +03:00
psemenkov
79d52d96ab Удалил поиск по clearingDate потому что старые PlannerAllToday не будут сохраняться. 2023-08-21 17:22:16 +03:00
ialbert
ae3abdb638 SDF20
SDF21
SDF10
2023-08-21 17:20:54 +03:00
AKurakin
bd65726668 account-service dbf-importer http://jira.mfd.msk:8088/browse/CLS-489 изменение статусов клиринговых счетов по S_DF52 2023-08-21 17:18:33 +03:00
ialbert
8d864e8aca SDF20 bugfix 2023-08-21 12:00:32 +03:00
psemenkov
661c5916db http://jira.mfd.msk:8088/browse/CLS-464
Исправил ошибку.
2023-08-21 11:57:35 +03:00
AKurakin
2ea1c4332e imdg поправил Map_TradingClearingRegistryHistory (баг в 2527755afc), CLS-473 alt+ctrl+L SimpleObjectMapStore 2023-08-21 11:29:50 +03:00
AKurakin
63eab63c48 imdg http://jira.mfd.msk:8088/browse/CLS-473 ExecutionFondMapStore выгрузка по SETTLEMENT_DATE 2023-08-21 11:15:37 +03:00
ialbert
31fee0e8f3 SDF20 validation fix 2023-08-18 19:39:51 +03:00
ialbert
334a91fb81 SDF20
SDF55
SDF10 в DS*T#contract кладется sdf10.outDocument а не sdf11.outDocument
блокировки в PaymentInstructionOutboundService
imdg SDf20/SDf21/SDf57 выгружаются за все дни
2023-08-18 19:33:46 +03:00
AKurakin
64e6f932bc scheduler-service fix NullPointerException в backend-api.RequestInfoAccepter: улучшил редирект сообщения (временный статус) 2023-08-18 16:40:03 +03:00
psemenkov
e9e93ece7e http://jira.mfd.msk:8088/browse/CLS-496
Теперь, вместо nominal_value будет приходить nominal_for_date и его необходимо записывать в поле fixedIncomeSecurity.nominalValue.
2023-08-18 16:14:30 +03:00
AKurakin
50494d87c0 scheduler-service fix NullPointerException в backend-api.RequestInfoAccepter: userRequest.id и userId пробрасывается также. 2023-08-18 16:02:58 +03:00
AKurakin
51ccc27090 backend-api fix NullPointerException в RequestInfoAccepter (теперь только warn) 2023-08-18 13:51:21 +03:00
psemenkov
d6cefd3902 http://jira.mfd.msk:8088/browse/CLS-51
Bag fixing.
2023-08-18 13:16:50 +03:00
ialbert
745a13a8f8 PaymentInstruction Outbound
SDf06
2023-08-17 19:27:36 +03:00
AKurakin
848c26d69a scheduler-service OUTV шедулер редиректит его в очередь PAYMENT_INSTRUCTION_CLEARING_OUTBOUND_ACTION 2023-08-17 17:49:44 +03:00
psemenkov
25c2be5c52 http://jira.mfd.msk:8088/browse/CLS-51
Bag fixing.
2023-08-17 17:10:33 +03:00
psemenkov
1abbc5f734 http://jira.mfd.msk:8088/browse/CLS-51
Поправил обработку PlannerAllToday.
2023-08-17 16:12:43 +03:00
AKurakin
fd22d89ecb backend-api OUTV разрешил для /launchers/specific 2023-08-17 11:13:10 +03:00
ialbert
19579ec0b0 SDF10
* добавил ограничение на активную сессию
* tradingTime
2023-08-16 19:47:52 +03:00
ialbert
0e2adf5807 SDF10 статусы 2023-08-16 16:47:02 +03:00
ialbert
af70ae6392 правки валидации sdf10
определение запрос для sdf06/sdf10 - Sdf10Executor и Sdf06Executor
правки запроса к gateway (поле section)
2023-08-16 15:59:18 +03:00
psemenkov
cef5460726 http://jira.mfd.msk:8088/browse/CLS-487
Поправил вывод ДФ-11.
2023-08-16 15:26:17 +03:00
AKurakin
818fda3058 meta.xml OUTV fix field 2023-08-16 11:53:09 +03:00
ialbert
2900a17f7a ExecutionFond/ExecutionDeposit#CounterPartyTradingClearingRegistry 2023-08-15 20:50:47 +03:00
ialbert
4ad1ee7df7 ExecutionDeposit map store counter_party_trading_clearing_registry_id 2023-08-15 20:35:05 +03:00
ialbert
bd253e7f4a ExecutionDeposit STrades counter 2023-08-15 20:26:51 +03:00
ialbert
8baedb31ea ExecutionDeposit STrades counter 2023-08-15 20:23:02 +03:00
ialbert
eeb8e4dc5f ExecutionDeposit заполнение поля CounterPartyTradingClearingRegistryId
SDF10
2023-08-15 19:33:03 +03:00
AKurakin
00090857a8 DDL http://jira.mfd.msk:8088/browse/CLS-405 meta 3.7 (up json) 2023-08-15 17:31:28 +03:00
AKurakin
a98e791824 DDL http://jira.mfd.msk:8088/browse/CLS-405 meta 3.7 2023-08-15 17:28:51 +03:00
ialbert
a3551bbc88 sdf06 error "3" for unsatisfied balances 2023-08-15 16:57:56 +03:00
ialbert
0b81edefbb SDF06 поиск по ANLT account
вынес поиск ТКР в валидацию
2023-08-15 15:11:40 +03:00
psemenkov
38a0c7c0f8 http://jira.mfd.msk:8088/browse/CLS-486
При передаче amount домножаем передаваемое значение *100.
2023-08-15 14:24:53 +03:00
psemenkov
7960e05d55 http://jira.mfd.msk:8088/browse/CLS-483
Simple fixing.
2023-08-15 12:19:46 +03:00
AKurakin
7c0b2d9215 backend-api platform-messaging scheduler-service meta add field to Launcher OUTV 2023-08-15 12:12:06 +03:00
ialbert
6907d648d3 LS*T grouping bugfix 2023-08-14 18:53:11 +03:00
AKurakin
988344ee1a reports-service http://jira.mfd.msk:8088/browse/CLS-358 refactoring predicate todo 2023-08-14 17:40:39 +03:00
AKurakin
f06308bcad reports-service оправил имя лог-файла для единообразия 2023-08-14 17:37:03 +03:00
AKurakin
679a7ebd23 reports-service http://jira.mfd.msk:8088/browse/CLS-358 refactoring predicate 2023-08-14 17:30:07 +03:00
akulikov
5863500e51 http://jira.mfd.msk:8088/browse/CLS-358 fixes 2023-08-14 17:00:47 +03:00
ialbert
0e4e3c91a8 FormingPaymentInstructions output types 2023-08-14 16:33:36 +03:00
psemenkov
8681cb4db4 http://jira.mfd.msk:8088/browse/CLS-310
Добавил очередь для отправки ДФ-55.
2023-08-14 16:28:36 +03:00
ialbert
122e5f9d26 forming payment instructions by money AM*B registers 2023-08-14 16:21:30 +03:00
ialbert
0c0bc7d910 IPOT 7 шаг по формированию PaymentInstruction по бумагам 2023-08-11 19:49:02 +03:00
psemenkov
6b3eaa1e24 http://jira.mfd.msk:8088/browse/CLS-314
Исправил вывод поля RESULT добавил ACC_NAME.
2023-08-11 17:18:03 +03:00
ialbert
c1516d207a clearing-service sessions SDF05 PR 2023-08-11 15:46:57 +03:00
ialbert
d45b64b53f removed fatal from log... 2023-08-11 15:32:34 +03:00
ialbert
f1267387a3 clearing-service SDF01 filename 2023-08-11 15:31:01 +03:00
ialbert
c01cc429a0 swt-importer SDF21 transactionNumber 2023-08-11 12:01:42 +03:00
psemenkov
c2a1f4a20a http://jira.mfd.msk:8088/browse/CLS-454
Поправил вывод сообщений об ошибках валидации.
2023-08-11 11:30:22 +03:00
ialbert
6769f5cd20 clearing-service SDF12 fix 2023-08-11 11:23:15 +03:00
ialbert
c1a519dc86 clearing-service sdf14 fix 2023-08-11 11:07:02 +03:00
AKurakin
9aad5d1553 swt-exporter DF09 header fix, поправил имена файлов 2023-08-10 19:33:30 +03:00
AKurakin
6daf7c0227 trade-importer улучшил лог 2023-08-10 19:32:47 +03:00
ialbert
d0ca401ab1 SDF21 пропуск operationDate не сегодня 2023-08-10 19:03:07 +03:00
ialbert
6666c63fa5 SDF14 exporter removed unnecessary imdg 2023-08-10 18:53:08 +03:00
ialbert
b5a3e7289e SDF12 в swt-exporter используется sessionId для определения имени файла 2023-08-10 18:51:27 +03:00
AKurakin
51949a281a dbf-exporter http://jira.mfd.msk:8088/browse/CLS-474 2023-08-10 17:54:01 +03:00
ialbert
1c1b134edf SDF01 SDF06 fileName пробрасывается для экспортера 2023-08-10 17:48:38 +03:00
ialbert
06c809f48f dbf-exporter ExportToFileRequest добавил fileName 2023-08-10 17:38:53 +03:00
ialbert
5ed3f63e91 DF-14 2023-08-10 16:18:42 +03:00
AKurakin
0e4acc54fa classes http://jira.mfd.msk:8088/browse/CLS-405 ConstSerializable up version 2023-08-10 14:17:01 +03:00
AKurakin
4463f9479f imdg classes http://jira.mfd.msk:8088/browse/CLS-405 ddl и классы. 2023-08-10 14:05:12 +03:00
AKurakin
bcd0f1a85a dbf-exporter S_DF07_Converter поля... Ограничение 254 у javadbf-1.13.1.jar 2023-08-10 13:21:51 +03:00
AKurakin
807dffdc92 dbf-exporter http://jira.mfd.msk:8088/browse/CLS-474 начало 2023-08-10 12:53:45 +03:00
AKurakin
5ccf3ed734 dbf-exporter S_DF07_Converter поля... 2023-08-10 12:50:46 +03:00
AKurakin
d2539e5819 dbf-exporter S_DF07_Converter SUM 2023-08-10 12:38:36 +03:00
ialbert
fbfe589ea3 statement services fixes 2023-08-09 21:41:22 +03:00
ialbert
3f3c59cc00 http://jira.mfd.msk:8088/browse/CLS-475 2023-08-09 19:02:36 +03:00
AKurakin
02ee4b461e swt-exporter DF12Exporter fix header 20 вообще-то это как минимум WARN, если не ошибка. Они все должны быть одинаковы. 2023-08-09 16:35:06 +03:00
AKurakin
2e25c733ba swt-exporter DF12Exporter fix header 20 2023-08-09 16:08:29 +03:00
psemenkov
d4142e3b03 http://jira.mfd.msk:8088/browse/CLS-467
Добавил загрузку файлов ДФ-20.
2023-08-09 16:03:24 +03:00
AKurakin
2c65f7ab92 dbf-exporter S_DF07_Converter временно INN,BIC as string 2023-08-09 14:29:12 +03:00
ialbert
a181c0981a SDF07 spec 2023-08-09 14:16:36 +03:00
ialbert
6b3d68320e SDF08 update AS*T fix 2023-08-09 13:49:42 +03:00
ialbert
817166005f SDF21 проверка на существование инструмента, убрал дубликат sql в поиске 2023-08-09 13:13:52 +03:00
AKurakin
f39991a559 swt-exporter http://jira.mfd.msk:8088/browse/CLS-478 S_DF09 2023-08-09 11:55:08 +03:00
psemenkov
acb9b5a674 http://jira.mfd.msk:8088/browse/CLS-469
Исправил ошибки
2023-08-09 11:14:36 +03:00
AKurakin
31e8a7af86 swt-exporter http://jira.mfd.msk:8088/browse/CLS-478 windows rn line separator 2023-08-09 10:56:40 +03:00
ialbert
475c3f99ac SDF21 добавил условие на поиск регистра по securityId
swt-importer фикс поля 35B/83D
2023-08-08 21:43:11 +03:00
ialbert
f00cf0ee3b SDF07 SUM/CLIENTN/INN/BIC/SPEC/NUMBER/RESULT
swt-exporter Charset.forName("windows-1251")
2023-08-08 21:26:51 +03:00
ialbert
4316830043 session sdf04/sdf13 2023-08-08 20:46:06 +03:00
AKurakin
e57ee9a72e db-scripts http://jira.mfd.msk:8088/browse/CLS-405 ddl (часть) 2023-08-08 18:09:58 +03:00
ialbert
39a3504c02 swt-exporter request groupId fix 2023-08-08 17:59:29 +03:00
ialbert
18b5e7232d Sdf21 operationDate format 2023-08-08 17:53:45 +03:00
ialbert
08f498f774 sdf21 validation company search tradingCode strip leading zeroes 2023-08-08 17:25:14 +03:00
ialbert
835beb55cc SDF56 dbf-exporter time format length 2023-08-08 17:04:30 +03:00
ialbert
add4335677 stmtService log + swt-importer sdf21 message 2023-08-08 16:51:26 +03:00
ialbert
8c80c30958 Merge branch 'ReturnDepositSessionFix' into dev
# Conflicts:
#	clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/StatementService.java
2023-08-08 16:27:59 +03:00
ialbert
0383068815 sdf08 sdf21 2023-08-08 16:25:38 +03:00
ialbert
6740c4ed23 StatementService SDF types restriction 2023-08-08 16:25:13 +03:00
AKurakin
fb0b57bffc dbf-exporter поправил формат S_DF07_Converter TYPE 2023-08-08 16:11:54 +03:00
ialbert
8fd329c129 LauncherCommandReceiver removed error log 2023-08-08 13:42:16 +03:00
ialbert
34d860b749 Merge branch 'ReturnDepositSessionFix' into dev 2023-08-08 13:14:02 +03:00
ialbert
33e75e6e81 sdf07 groupId bug 2023-08-08 12:59:55 +03:00
ialbert
68a7aec74c Merge branch 'ReturnDepositSessionFix' into dev 2023-08-08 12:22:17 +03:00
ialbert
8ecb0b7c9e SDF06 поиск компании по deal 2023-08-08 12:13:41 +03:00
ialbert
7279fdf743 Sdf07/Sdf09 fix 2023-08-08 11:53:38 +03:00
ialbert
92db7d5f1e Merge branch 'dev' into CLNRWORM 2023-08-07 19:21:00 +03:00
ialbert
7caa78edef added session monitor for sdf04/sdf13/sdf01/sdf57 2023-08-07 19:20:15 +03:00
ialbert
55f66994b3 Merge branch 'ReturnDepositSessionFix' into CLNRWORM 2023-08-07 19:16:48 +03:00
ialbert
9f9b260a4f sdf01/sdf02 bug fix sdf02 groupid 2023-08-07 17:52:24 +03:00
psemenkov
d71a7187fa http://jira.mfd.msk:8088/browse/CLS-469
Добавил загрузку документа DF-21.
2023-08-07 13:43:56 +03:00
akulikov
98335c8b2e http://jira.mfd.msk:8088/browse/CLS-358 refactor 2023-08-04 18:35:55 +03:00
ialbert
edb00e4608 SDF01 проверка curr_code RUR/RUB 2023-08-04 16:26:07 +03:00
akulikov
1e713c1292 http://jira.mfd.msk:8088/browse/CLS-358 fix logger names 2023-08-04 13:37:35 +03:00
akulikov
117e94ef2e http://jira.mfd.msk:8088/browse/CLS-358 company not found fixes 2023-08-04 13:33:27 +03:00
ialbert
8ea1ba2e79 Merge branch 'ReturnDepositSessionFix' into CLNRWORM 2023-08-04 13:03:33 +03:00
ialbert
b10d6bb0c3 Inclusion to pool fix 2023-08-04 12:58:17 +03:00
AKurakin
9ba69c188f dbf-importer SDf06Table поправил формат - тримлю числа, пустые как null 2023-08-04 11:40:07 +03:00
AKurakin
d8ad75dce9 dbf-importer SDf06Table поправил формат - тримлю числа 2023-08-04 11:17:24 +03:00
ialbert
7fa4b6aec5 Sdf21Executor.java 2023-08-03 21:13:23 +03:00
ialbert
5dd85d742f правки по D*** регистрам 2023-08-03 21:12:16 +03:00
ialbert
050c742313 SDF08/SDF21 2023-08-03 19:14:41 +03:00
ialbert
b1db92425e Merge branch 'dev' into CLNRWORM 2023-08-03 18:00:03 +03:00
psemenkov
7d51561c71 http://jira.mfd.msk:8088/browse/CLS-317
Привел конце документа ДФ-12
2023-08-03 17:42:47 +03:00
psemenkov
9208483045 http://jira.mfd.msk:8088/browse/CLS-462
Привел выгрузку поля 35A к виду ":35A:SHS10000,"
2023-08-03 12:12:08 +03:00
AKurakin
4522aec93f dbf-importer SDf06Table поправил формат inn, bic 2023-08-03 11:23:24 +03:00
ialbert
aa755cbd89 промежуточная сессия
заполнение баланса для регистра по облигациям в ExecutionFond
2023-08-02 21:46:48 +03:00
ialbert
c8fa6e052e правка 7 шага для МКР и промежуточной сессии 2023-08-02 19:18:13 +03:00
ialbert
7174024333 вынесены рассчет блокировок 2023-08-02 19:17:42 +03:00
akulikov
94af268598 http://jira.mfd.msk:8088/browse/CLS-358?focusedCommentId=55653&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-55653 2023-08-02 13:34:45 +03:00
ialbert
06c37e11be securitySymbol 2023-08-01 20:59:37 +03:00
ialbert
6ea0cf3e38 убрал исключение для нечетного количества сделок в 2 шаге сессий 2023-08-01 16:54:55 +03:00
ialbert
b6e19b9f8d SDF08 executor skip error sdf08 2023-08-01 16:53:32 +03:00
ialbert
d0eef0b15f IMDG log improved on 'More than one element found...' 2023-08-01 16:43:56 +03:00
akulikov
24eb6f9446 http://jira.mfd.msk:8088/browse/CLS-358 some fixes 2023-08-01 16:06:59 +03:00
ialbert
241f88199d выпилил из шага с PaymentInstruction блокировку активов 2023-08-01 14:49:10 +03:00
ialbert
89e8f2dae7 CLNRWORM hot fix session 2023-08-01 13:07:03 +03:00
ialbert
206ff77b97 update registries by new TCR bugfix 2023-08-01 11:46:02 +03:00
ialbert
63b72f0f67 swt-exporter SFTP 2023-07-31 20:21:38 +03:00
ialbert
67a80c7475 swt-exporter SFTP 2023-07-31 20:19:17 +03:00
etreschenkov
5343be3b58 обработка sdf04/sdf13 и изменения balance для регистров 2023-07-31 18:03:27 +03:00
etreschenkov
e8232caf2b обработка sdf04/sdf13 и изменения balance для регистров 2023-07-31 18:03:27 +03:00
akulikov
49c836cbde http://jira.mfd.msk:8088/browse/CLS-358 sftp fix after review 2023-07-31 16:07:52 +03:00
etreschenkov
79b65e0023 обработка sdf04 и изменения balance для регистров 2023-07-31 15:39:07 +03:00
etreschenkov
a5bb906eea шаг 7 для SecondaryAuctionT0 сессии: создание paymentInstruction по ASB/AMB регистрам 2023-07-31 15:39:07 +03:00
akulikov
b58895da59 http://jira.mfd.msk:8088/browse/CLS-358 sftp 2023-07-31 15:28:48 +03:00
akulikov
2c0ed58c2a http://jira.mfd.msk:8088/browse/CLS-358 sftp 2023-07-31 15:24:47 +03:00
akulikov
626d8d3206 http://jira.mfd.msk:8088/browse/CLS-358 sftp 2023-07-31 15:22:21 +03:00
etreschenkov
cec22d06f8 шаг 7 для SecondaryAuctionT0 сессии: создание paymentInstruction по ASB/AMB регистрам 2023-07-31 13:20:52 +03:00
etreschenkov
a9c9f1d47f пересчет F = T-B при снятии блокировок 2023-07-31 11:06:55 +03:00
etreschenkov
6883496845 пересчет F = T-B при обработке sdf08 2023-07-31 11:06:55 +03:00
etreschenkov
72d9896fca блокировка средств на активах, дополнительная логика для FOND секций 2023-07-31 11:06:55 +03:00
etreschenkov
218c67bbf6 созданние B и F регистров по sdf08 2023-07-31 11:06:55 +03:00
akulikov
cb0d720ae0 http://jira.mfd.msk:8088/browse/CLS-358 hot fix 2023-07-28 18:51:04 +03:00
ialbert
2d559f9bf1 registry#groupId и 2 шаг сессий 2023-07-27 19:04:23 +03:00
ialbert
cf1db1b604 STrades validation: проверка security для Fond 2023-07-27 17:56:53 +03:00
ialbert
6fbf4efa1c data.xml 2023-07-27 12:36:38 +03:00
aalehin
e50abf16cd http://jira.mfd.msk:8088/browse/CLS-280
---
fix up
2023-07-27 12:32:30 +03:00
aalehin
a6c2851bd2 http://jira.mfd.msk:8088/browse/CLS-280
---
addded validation
2023-07-27 12:31:56 +03:00
ialbert
c646bfe866 meta.xml 3.5.0.41 2023-07-27 12:30:12 +03:00
ialbert
158a9db90c SDF57 обработка пишет ошибку если DM** со статусом OK 2023-07-27 12:12:35 +03:00
ialbert
c92dc63fa8 http://jira.mfd.msk:8088/browse/CLS-444
http://jira.mfd.msk:8088/browse/CLS-445
2023-07-27 11:54:24 +03:00
aalehin
9518c7130a http://jira.mfd.msk:8088/browse/CLS-280
---
рефакторинг
2023-07-26 18:22:46 +03:00
ialbert
98db18e687 http://jira.mfd.msk:8088/browse/CLS-439 2023-07-26 18:06:31 +03:00
ialbert
f7cb4855aa http://jira.mfd.msk:8088/browse/CLS-444
http://jira.mfd.msk:8088/browse/CLS-445
backend-api/clearing-service return deposit request
2023-07-26 17:36:18 +03:00
aalehin
dac9c80c6f http://jira.mfd.msk:8088/browse/CLS-280
---
правки по ревью
2023-07-26 15:42:07 +03:00
ialbert
87c114370c http://jira.mfd.msk:8088/browse/CLS-439 обновлять STrades только по команде (не по шкедулеру).
команда на клиринг сервис отправляется только в случае если было обновление или создание strades
2023-07-26 12:22:45 +03:00
ialbert
b36ea99b28 вынес настройки удаленной SFTP папки с файлами в отдельный класс
теперь модуль можно запустить без SFTP (при отсутствии соответствующих настроек)
2023-07-25 19:33:30 +03:00
ialbert
a0d5baef17 swt-importer SFTP включен только при наличии настройки import-swt-service.store.sftp-src-dir 2023-07-25 19:00:11 +03:00
ialbert
ccb669ca75 added SFTP to swt-importer 2023-07-25 18:29:58 +03:00
aalehin
39e1d9dd65 http://jira.mfd.msk:8088/browse/CLS-280
---
fix up
2023-07-25 16:28:36 +03:00
ialbert
39ccef91a5 http://jira.mfd.msk:8088/browse/CLS-437 2023-07-25 16:05:34 +03:00
ialbert
b569062294 http://jira.mfd.msk:8088/browse/CLS-437 2023-07-25 15:49:13 +03:00
aalehin
478b711dee http://jira.mfd.msk:8088/browse/CLS-280
---
добавил (обновление или добавление) registerExecution по итогам сделки
ввел проверку на дубликат при генерации всего реестра
2023-07-25 14:42:36 +03:00
ialbert
26145a7587 http://jira.mfd.msk:8088/browse/CLS-437 2023-07-25 13:22:10 +03:00
aalehin
168b50bdfc http://jira.mfd.msk:8088/browse/CLS-280
---
Исправил заполнение depoPaymentInstructionRegister. Поля tradingClearingRegistryType и tradingClearingRegistry.
2023-07-24 19:10:43 +03:00
ialbert
112fee67e4 session#updated/created
dm** registries sessionId/sessionType
dm** registryStatus update
2023-07-24 12:48:00 +03:00
ialbert
6dc5133d10 сортировка регистров на 5 шаге 2023-07-24 10:59:47 +03:00
ialbert
79e1867e7f обработка SDF57 проставление баланса при создании DMAU
проставление SessionType на шаге включения в пул
апдейт статуса DM*T(clnr) в fail/manage
2023-07-21 19:06:21 +03:00
ialbert
cb03a62265 http://jira.mfd.msk:8088/browse/CLS-435 2023-07-21 15:19:33 +03:00
ialbert
62b847fcef http://jira.mfd.msk:8088/browse/CLS-436 2023-07-20 19:26:10 +03:00
ialbert
e1d565522b 5 шаг сессии по возврату: поиск DM*T(clnr) условие на контракт 2023-07-20 16:22:14 +03:00
ialbert
cba1772bf6 сессия шаг 5 контроль обязательств по возвратам: поиск DM*X и DM*T(info) 2023-07-20 13:39:13 +03:00
ialbert
a14ee21fd6 SdDf57Executor: фикс поисков регистров B и F в случае инфо счета 2023-07-20 11:48:21 +03:00
ialbert
f5d7a7b127 dbf-importer фикс чтобы забирал с SFTP без фильтрации 2023-07-19 18:58:07 +03:00
ialbert
828ba91ba0 5 шаг по сессиям 2023-07-19 18:10:29 +03:00
ialbert
7660f88387 промежуточная сессия МКР: removed fail status для второй части сделки 2023-07-19 15:25:58 +03:00
ialbert
5018e8a4be заполнение Sd06#sum ожидает string/bigdecimal [2] 2023-07-19 15:02:33 +03:00
ialbert
5c1bcc3b1b Промежуточная сессия МКР: 5 шаг сессий по сегодняшним сделкам, статусы FAIL/UNCV -> MNG 2023-07-19 14:45:22 +03:00
ialbert
315d1e43ec http://jira.mfd.msk:8088/browse/CLS-424 issuerId для instrument_type = RATE 2023-07-19 14:32:05 +03:00
ialbert
2a109ed496 заполнение Sd06#sum ожидает string/bigdecimal 2023-07-19 14:25:39 +03:00
ialbert
9382a8be8a промежуточная сессия МКР 5 шаг пропускать проверки для бумаг 2023-07-19 12:51:13 +03:00
ialbert
4c69d38069 http://jira.mfd.msk:8088/browse/CLS-424 заполнение SecurityFondGatewayRequest#Uuid 2023-07-19 12:32:57 +03:00
ialbert
bfca0aadf5 заполнение registry#securitySymbol при обработке SDF01/57 2023-07-19 11:31:21 +03:00
ialbert
aea33dcd13 http://jira.mfd.msk:8088/browse/CLS-428 dbf-importer SFTP support 2023-07-18 18:24:13 +03:00
ialbert
c4416f2034 session (step 2) registry#capacity fix 2023-07-18 18:19:55 +03:00
akulikov
96c8441307 http://jira.mfd.msk:8088/browse/CLS-358 fix after review 2023-07-18 15:56:16 +03:00
akulikov
a8fb21f599 http://jira.mfd.msk:8088/browse/CLS-358 KSCommissionTrades 2023-07-18 15:37:48 +03:00
ialbert
2399cfd8cc убрал yyyyMMdd из groupId регистров по ExecutionDeposit/ExecutionFond 2023-07-18 13:48:10 +03:00
ialbert
7cc1097c69 http://jira.mfd.msk:8088/browse/CLS-425 2023-07-17 19:22:10 +03:00
akulikov
95ff52de20 http://jira.mfd.msk:8088/browse/CLS-358 2023-07-17 18:55:51 +03:00
ialbert
07293ff3eb http://jira.mfd.msk:8088/browse/CLS-427 реализация методов в transactional Imdg 2023-07-17 18:20:36 +03:00
ialbert
658810cc85 http://jira.mfd.msk:8088/browse/CLS-423 2023-07-17 17:21:15 +03:00
ialbert
18a2c6705d sdf08 не создавать registry если не найден security
правки по промежуточной сессии
2023-07-17 12:57:07 +03:00
etreschenkov
aa49f28d69 Merge remote-tracking branch 'origin/gateway' into dev 2023-07-14 18:37:11 +03:00
ialbert
fb45dda0f5 http://jira.mfd.msk:8088/browse/CLS-421 6 symbols -> 7 symbols 2023-07-14 18:31:45 +03:00
etreschenkov
14b29edf84 Merge branch 'gateway' into dev 2023-07-14 18:18:04 +03:00
etreschenkov
60da507f71 http://jira.mfd.msk:8088/browse/CLS-420 2023-07-14 18:17:51 +03:00
ialbert
da566c4c81 http://jira.mfd.msk:8088/browse/CLS-421 2023-07-14 18:14:05 +03:00
ialbert
7f8e2dd027 http://jira.mfd.msk:8088/browse/CLS-422 2023-07-14 18:11:28 +03:00
ialbert
56a89b7e6d Merge remote-tracking branch 'origin/dev' into dev 2023-07-14 14:31:30 +03:00
akulikov
2b1606c113 http://jira.mfd.msk:8088/browse/CLS-358 KSListSessionReport 2023-07-13 20:44:49 +03:00
akulikov
c01f499648 http://jira.mfd.msk:8088/browse/CLS-358 fix KSRepTrades and logs for KSRepDepoNetto 2023-07-13 20:44:48 +03:00
akulikov
3b30b34a34 http://jira.mfd.msk:8088/browse/CLS-358 fix SessionIdParam reports 2023-07-13 20:44:48 +03:00
ialbert
67149d08fe Merge branch 'gateway' into dev
# Conflicts:
#	clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/ClearingAccountService.java
#	clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/DepoAccountService.java
2023-07-13 17:52:46 +03:00
ialbert
85a4cc95fe cherry-pick fix 2023-07-13 17:42:47 +03:00
ialbert
b3c58b0442 ограничение на создание счетов по sdf01/sdf08 2023-07-13 17:39:37 +03:00
ialbert
43c15d193b strades import operation=купля/продажа -> B/S 2023-07-13 16:40:47 +03:00
AKurakin
7f400066b9 backend-api поправил стук при анонимном пользователе 2023-07-13 15:31:31 +03:00
AKurakin
d9e0a4ada2 backend-api поправил стук при анонимном заходе 2023-07-13 14:52:38 +03:00
ialbert
7612126b9e ограничение на создание счетов по sdf01/sdf08 2023-07-13 14:08:35 +03:00
etreschenkov
997118ceb8 поправлены баги при создании инструментов 2023-07-12 19:29:20 +03:00
etreschenkov
d5b083dcfe Merge branch 'gateway' into dev 2023-07-12 18:57:02 +03:00
etreschenkov
97322f6e0f поправлены баги при создании инструментов 2023-07-12 18:56:46 +03:00
etreschenkov
343277caa3 поправлены баги при создании компаний и инструментов 2023-07-12 18:48:16 +03:00
ialbert
2d37a2ec95 forming payment instruction refactoring: common registry searches 2023-07-12 16:17:23 +03:00
ialbert
e184c68be2 refactor IMDG getSingle* -> getFirst* 2023-07-12 14:22:44 +03:00
etreschenkov
8da9583854 поправил баг в gateway 2023-07-12 13:52:11 +03:00
etreschenkov
656920e1ac убрал из загрузки trades некоторые поля 2023-07-12 13:51:55 +03:00
ialbert
c3b967dddc http://jira.mfd.msk:8088/browse/CLS-396 2023-07-10 18:13:26 +03:00
ialbert
86469d6ff7 В финальной МКР часть про возврат депозитов скопированна из сесси по возвратам депозитов 2023-07-10 15:30:24 +03:00
etreschenkov
1dce1a2fe7 http://jira.mfd.msk:8088/browse/CLS-411 // http://jira.mfd.msk:8088/browse/CLS-410 2023-07-10 14:26:32 +03:00
etreschenkov
e9f3d9ba4a http://jira.mfd.msk:8088/browse/CLS-411 // http://jira.mfd.msk:8088/browse/CLS-410 2023-07-10 13:42:11 +03:00
etreschenkov
87349837f3 http://jira.mfd.msk:8088/browse/CLS-411 // http://jira.mfd.msk:8088/browse/CLS-410 2023-07-10 13:31:43 +03:00
ialbert
53e248b674 сессия по возврату депозитов: формирование PaymentInstruction
1. Блокировка ассетов
2. фиксы полей PaymentInstruction
3. SDF03 подмена счетов если один из них INFO
2023-07-10 12:24:24 +03:00
etreschenkov
dde7c8eef2 http://jira.mfd.msk:8088/browse/CLS-367 2023-07-10 11:41:00 +03:00
ialbert
5c7218e7f0 сессия по возврату депозитов, DM*T 'CLNR' создание PaymentInstruction 2023-07-09 16:36:57 +03:00
ialbert
a63782a57b заполнение statement#contract 2023-07-09 15:21:05 +03:00
etreschenkov
d805a1d462 http://jira.mfd.msk:8088/browse/CLS-411 // http://jira.mfd.msk:8088/browse/CLS-410 2023-07-09 14:55:44 +03:00
etreschenkov
7522a8f899 http://jira.mfd.msk:8088/browse/CLS-411 // http://jira.mfd.msk:8088/browse/CLS-410 2023-07-09 14:24:11 +03:00
ialbert
cdd4c4069c sdf03 anlt account search bugfix 2023-07-09 14:19:03 +03:00
ialbert
667ca04eeb SDF03 создание подмена на ANLT номер счета для Info счетов
SDF04 обработка снятие блокировок для счетов при пришедшем ANLT счете
2023-07-09 13:52:55 +03:00
etreschenkov
7d30f24525 http://jira.mfd.msk:8088/browse/CLS-410 2023-07-09 13:44:40 +03:00
etreschenkov
1d4e1b4a3e http://jira.mfd.msk:8088/browse/CLS-410 2023-07-09 13:10:43 +03:00
etreschenkov
0668fa8b46 http://jira.mfd.msk:8088/browse/CLS-411 // http://jira.mfd.msk:8088/browse/CLS-410 2023-07-09 12:26:24 +03:00
ialbert
a82ab9b0ca SDF57 поиск счета по comment (в случае ANLT) 2023-07-09 12:23:35 +03:00
AKurakin
c4c12ccad7 meta xsl поправил авто-генерацию extends 2023-07-07 20:55:37 +03:00
akulikov
a4f2da37d4 http://jira.mfd.msk:8088/browse/CLS-358 refactor 2023-07-07 19:47:30 +03:00
etreschenkov
705b24910d http://jira.mfd.msk:8088/browse/CLS-410 2023-07-07 19:44:53 +03:00
AKurakin
03e3188b39 meta 3.5.0.40 2023-07-07 19:43:59 +03:00
ialbert
abdc6d69b8 session step 2 O/T creation capacity for accountType=info 2023-07-07 19:40:01 +03:00
ialbert
690ab4c35d PaymentInstruction#paymentPurpose расмещение "Размещение депозита ... по ТКР ..." 2023-07-07 19:32:09 +03:00
akulikov
ab46e96c28 http://jira.mfd.msk:8088/browse/CLS-358 refactor 2023-07-07 19:28:46 +03:00
ialbert
28102d34af SDF57 обработка
1. DMAU регистры
2. поиск счетов для кейса accountType=ANLT
2023-07-07 19:22:17 +03:00
akulikov
075591d2ea http://jira.mfd.msk:8088/browse/CLS-358 refactor 2023-07-07 19:21:23 +03:00
AKurakin
69c5e63158 http://jira.mfd.msk:8088/browse/CLS-410 SDf04 поправил в соответствии в мета 2023-07-07 18:19:03 +03:00
aalehin
d6de26963b http://jira.mfd.msk:8088/browse/CLS-280
---
fixup
2023-07-07 18:15:59 +03:00
aalehin
7a0bbb9bce http://jira.mfd.msk:8088/browse/CLS-280
---
fixup
2023-07-07 18:07:59 +03:00
etreschenkov
274e967888 исправлено поля TP для sdf05 2023-07-07 16:10:21 +03:00
aalehin
cd920fbdf8 http://jira.mfd.msk:8088/browse/CLS-280
---
fixup
2023-07-07 16:00:34 +03:00
etreschenkov
a0de1d0afc http://jira.mfd.msk:8088/browse/CLS-409 2023-07-07 15:47:11 +03:00
AKurakin
a998f75ed9 account-service http://jira.mfd.msk:8088/browse/CLS-271 поправил валидацию. 2023-07-07 14:20:56 +03:00
etreschenkov
ac10bc4fb2 http://jira.mfd.msk:8088/browse/CLS-317 2023-07-07 14:07:10 +03:00
etreschenkov
02b870f95b http://jira.mfd.msk:8088/browse/CLS-367 2023-07-07 13:18:37 +03:00
etreschenkov
db8fd60495 refactoring: новый энут для определения типа отчета 2023-07-07 13:10:06 +03:00
etreschenkov
d1378a4cf4 refactoring: enum name 2023-07-07 13:07:58 +03:00
etreschenkov
93a3df9bfb http://jira.mfd.msk:8088/browse/CLS-367 2023-07-07 12:49:29 +03:00
etreschenkov
e59b718eab http://jira.mfd.msk:8088/browse/CLS-367 2023-07-07 12:40:46 +03:00
akulikov
7179c09c29 http://jira.mfd.msk:8088/browse/CLS-358 csv bean writer prototype 2023-07-07 12:38:55 +03:00
aalehin
6ff6d246a4 http://jira.mfd.msk:8088/browse/CLS-280
---
fixup
2023-07-07 10:47:12 +03:00
etreshenkov
2bdfb10743 http://jira.mfd.msk:8088/browse/CLS-406 2023-07-06 19:14:19 +03:00
ialbert
9f018d13c4 Sdf08Executor registry capacity: DepoAccount search fix 2023-07-06 19:04:30 +03:00
etreshenkov
b469c162b2 http://jira.mfd.msk:8088/browse/CLS-408 2023-07-06 19:03:20 +03:00
ialbert
73e93a4c46 sdf57 уловия поиска регистров B и F +accountId = statement.accountId 2023-07-06 15:56:59 +03:00
ialbert
6c1ec5380e account-service TCR validation bugfix
clearing-service поменял местами SDF01Executor и SDF57Executor
разнес нотификацию сверки и Sdf01Executor
2023-07-06 14:52:56 +03:00
AKurakin
30349030dd http://jira.mfd.msk:8088/browse/CLS-404 (bug fix CLS-313) поправил поиск по файлам 2023-07-06 14:09:17 +03:00
akulikov
262166d470 http://jira.mfd.msk:8088/browse/CLS-358 some fixes 2023-07-05 21:48:36 +03:00
AKurakin
810ebc3f58 http://jira.mfd.msk:8088/browse/CLS-400 meta 3.5.0.39 2023-07-05 19:31:18 +03:00
akulikov
c8dc5cdbcc http://jira.mfd.msk:8088/browse/CLS-358 for review 2023-07-05 18:20:09 +03:00
AKurakin
05a42541de account-service http://jira.mfd.msk:8088/browse/CLS-271 убрано автосоздание ТКР, оставлено только для ClientCode 2023-07-05 17:43:47 +03:00
akulikov
109240166e http://jira.mfd.msk:8088/browse/CLS-358 send reports to gateway 2023-07-05 15:17:24 +03:00
akulikov
20f84b8311 http://jira.mfd.msk:8088/browse/CLS-358 GREF and GRET processing 2023-07-05 14:03:42 +03:00
akulikov
d0d4c3a19f http://jira.mfd.msk:8088/browse/CLS-358 GREF 2023-07-05 13:25:37 +03:00
akulikov
a3a749f587 http://jira.mfd.msk:8088/browse/CLS-358 builders 2023-07-05 13:25:24 +03:00
ialbert
a529135daf http://jira.mfd.msk:8088/browse/CLS-398 2023-07-05 12:36:06 +03:00
ialbert
2ad79bb683 http://jira.mfd.msk:8088/browse/CLS-398
добавил отправку команды на clearing-service по событиям tcr new/tcr new auto
добавил поиск и обновление регистров на базе созданных ТКР
2023-07-04 19:23:24 +03:00
ialbert
be55af4c5f http://jira.mfd.msk:8088/browse/CLS-396 создание SDF05 по команде из кафки с pr="9" 2023-07-04 16:40:30 +03:00
ialbert
5b3fedfc0c logPrefix для валидации 2023-07-04 14:41:11 +03:00
AKurakin
dfe3e271d7 backend-api логирование 2023-07-04 14:22:32 +03:00
AKurakin
e25b8c771f backend-api http://jira.mfd.msk:8088/browse/CLS-390 s-df's controller 2023-07-04 14:01:13 +03:00
ialbert
9b2d5dbf3a http://jira.mfd.msk:8088/browse/CLS-383 imdg выгрузка данных за сегодня:
execution_deposit/execution_fond по trading_date
s_trades по trade_date
statement по clearing_date
notification по clearing_date
s_df по generation_time
2023-07-04 13:37:17 +03:00
ialbert
5944cf8208 http://jira.mfd.msk:8088/browse/CLS-363 2023-07-04 11:52:44 +03:00
akulikov
132a3e7096 http://jira.mfd.msk:8088/browse/CLS-313 fix send sftp 2023-07-03 20:20:44 +03:00
akulikov
d253f9e1ff http://jira.mfd.msk:8088/browse/CLS-313 todo issue 2023-07-03 20:08:07 +03:00
ialbert
8548c6a8f7 5 шаг InspectionObligations:
1. spring scope prototype fix
2. log fix
2023-07-03 19:18:08 +03:00
AKurakin
716e70b10a backend-api data 3.5.0.12 + meta 2023-07-03 19:01:15 +03:00
ialbert
df4802c856 dbf-exporter/clearing-service: изменил заполнение SDf05#TM и DBF тип DATE -> CHARACTER(8) 2023-07-03 18:48:01 +03:00
AKurakin
ccc6538225 backend-api http://jira.mfd.msk:8088/browse/CLS-390 + meta 2023-07-03 17:31:40 +03:00
aalehin
dc798c4d64 http://jira.mfd.msk:8088/browse/CLS-280
---
поправил стук и добавил логику для заполнения MoneyBalanceRegister
2023-07-03 14:09:49 +03:00
akulikov
717e861fe0 http://jira.mfd.msk:8088/browse/CLS-358 (report builders) 2023-06-30 20:29:28 +03:00
ialbert
7f9d8badec SDF57 executor balance из statement
финальная сессия МКР 5 шаг UNCV/FAIL
2023-06-30 19:05:47 +03:00
ialbert
61332c5b73 финальная сессия МКР шаг 7 2023-06-30 18:44:32 +03:00
ialbert
d91383b4e5 финальная сессия МКР часть 5 шага по сделкам 2023-06-30 18:04:35 +03:00
ialbert
679b5cc01b изменения по финальной МКР сессии 5/7 шаг bugfix 2023-06-30 17:20:15 +03:00
ialbert
84ccc444b8 изменения по финальной МКР сессии шаг 5 фикс поиска DM*X 2023-06-30 17:06:03 +03:00
ialbert
f90365a191 изменения по финальной МКР сессии:
1. шаг 5 поменял статус регистров MNG -> FAIL
1. шаг 7 добавлено условие на valueDate<settlementDate при отсеивании по DM*X
2023-06-30 16:44:38 +03:00
ialbert
19184c3a4a изменения по финальной МКР сессии:
1. перенесен шаг 5 из сессии по возврату депозитов. (отличие: при невыполнении условия на DM*X статус FAIL вместо MNG)
2. шаг 7 форм. PaymentInstruction: выпилил редактирование активов по обязательствам LM*T
3. шаг 7 форм. PaymentInstruction: пропускаем формирование если найден DM*X по обязательству
2023-06-30 15:45:26 +03:00
AKurakin
ef94bdc2fe http://jira.mfd.msk:8088/browse/CLS-362 META data 2023-06-30 11:35:43 +03:00
AKurakin
ad4e699bb6 clearing-service возвращение ответа в REQUEST_INFO_UPDATE 2023-06-30 11:08:20 +03:00
AKurakin
23fbf503c9 clearing-service fix NPE on fix reset-balance 6b036c8e91 2023-06-30 10:50:49 +03:00
etreshenkov
6b036c8e91 fix reset-balance 2023-06-30 09:28:09 +03:00
AKurakin
9146fb67b0 meta new 3.5.0.34 2023-06-29 18:21:35 +03:00
ialbert
0086bbf98b SDF01 executor определение статуса сделки bugfix
SDF57 executor trim all whitespaces from statement#contract
2023-06-29 16:41:07 +03:00
AKurakin
c85d82c2b7 company-service http://jira.mfd.msk:8088/browse/CLS-374 ClearingMemberCategory -> Relation не для всех категорий нужен 2023-06-29 15:47:56 +03:00
AKurakin
ac5cd3b842 db-scripts поправил апдейт скрипт 2023-06-29 15:04:32 +03:00
ialbert
b221f4d76f rollback сессия по возвратам кейс с созданными PaymentInstruction 2023-06-29 14:42:50 +03:00
ialbert
afc4669cad сессия по возвратам депозитов шаг 7 возвращать пустой результат 2023-06-29 14:32:27 +03:00
ialbert
d63d080023 Сессия по возвратам депозитов проверка средств (шаг 5) формирование PaymentInstruction (шаг 7) 2023-06-29 14:16:50 +03:00
AKurakin
27e9c75e78 account-service CLS-361 после ТКР отмена автоматического "сообщение на открытие клиринговых регистров" 2023-06-29 14:04:15 +03:00
AKurakin
fe0887b808 account-srvice http://jira.mfd.msk:8088/browse/CLS-361 CLS-271 дублирование ТКР поправил 2023-06-29 13:56:02 +03:00
ialbert
f5783dbdb6 SDF57 обработка создание DM*X по TM*T 2023-06-29 13:48:12 +03:00
AKurakin
c7f1b490ed account-srvice http://jira.mfd.msk:8088/browse/CLS-265 http://jira.mfd.msk:8088/browse/CLS-333 Info-account - поправил инкремент 2023-06-29 13:25:31 +03:00
AKurakin
5aa1de8b18 account-service http://jira.mfd.msk:8088/browse/CLS-361 TCR sequence 2023-06-29 13:01:36 +03:00
AKurakin
fa2cb814c8 utility-service поправил возвращение ответов при обработки Notification. 2023-06-29 11:55:44 +03:00
ialbert
55fa772b52 clearing-service поправил приоритет нотификаций при сверке: HIGH если не сошлось, LOW если ок 2023-06-29 11:14:46 +03:00
ialbert
8004353f37 SDF57 registry#tradingClearingRegistry/tradingClearingRegistryId поиск TradingClearingRegistry добавил условие status ACTV 2023-06-28 19:35:53 +03:00
etreschenkov
5e7e31066c http://jira.mfd.msk:8088/browse/CLS-373 2023-06-28 19:34:55 +03:00
etreschenkov
db24212cc6 http://jira.mfd.msk:8088/browse/CLS-373 2023-06-28 19:32:20 +03:00
AKurakin
563e7f47c4 account-service http://jira.mfd.msk:8088/browse/CLS-361 валидация 3.5 для ТКР нового 2023-06-28 19:04:27 +03:00
etreschenkov
0c1a02ba7f http://jira.mfd.msk:8088/browse/CLS-373 2023-06-28 18:52:36 +03:00
AKurakin
33c9fd87e0 account-service http://jira.mfd.msk:8088/browse/CLS-361 проставление в ТКР code 2023-06-28 18:47:15 +03:00
ialbert
b59cd10acc SDF57 поиск счетов c_acc_deb/c_acc_cred -> acc_deb/acc_kr 2023-06-28 18:44:49 +03:00
AKurakin
fda13da0fd db-script http://jira.mfd.msk:8088/browse/CLS-355 скрипт обновления базы 2023-06-28 18:42:33 +03:00
etreschenkov
577a4cc42d http://jira.mfd.msk:8088/browse/CLS-373 2023-06-28 17:39:18 +03:00
etreschenkov
6a91ce85e2 http://jira.mfd.msk:8088/browse/CLS-373 2023-06-28 17:39:00 +03:00
aalehin
d388d5a39e http://jira.mfd.msk:8088/browse/CLS-317
---
fix up
2023-06-28 17:06:18 +03:00
AKurakin
e9661f8ec6 clearing-service http://jira.mfd.msk:8088/browse/CLS-265 Sdf08Executor поправил определеление depo type 2023-06-28 14:21:43 +03:00
ialbert
2155c02a75 шаг 6 формирование L/C регистров условие регистров на sessionId 2023-06-28 13:55:00 +03:00
ialbert
92fcdb8bb4 SDF57 AM*T.diffBalance = AM*T.balance - AM*T.checkBalance 2023-06-28 13:25:33 +03:00
ialbert
b8cffb8f6a обновляем sessionId регистров при включении в сессионный пул 2023-06-28 11:41:26 +03:00
ialbert
cd35d5ba9c GVER теперь запускает сверку 2023-06-28 10:13:30 +03:00
ialbert
82cf75ac2d SDF57 опечатка в логе 2023-06-27 20:36:03 +03:00
ialbert
d52e335174 SDF57 обработка добавил логи 2023-06-27 17:56:42 +03:00
ialbert
864f64bba3 SDF01 обработка, логи 2023-06-27 17:32:43 +03:00
ialbert
6219add3c9 поправил все логи в trace для clearing-service 2023-06-27 17:06:24 +03:00
ialbert
7b6c6a4ad0 http://jira.mfd.msk:8088/browse/CLS-372 SDF57 создается DM*T по любым specif №.* 2023-06-27 16:53:06 +03:00
ialbert
91f1c9a5df обработка SDF01 отправка Notification по результатам сверки 2023-06-27 14:50:58 +03:00
ialbert
9ace5c276d логи по сессиям 2023-06-27 13:53:46 +03:00
ialbert
524d59eece http://jira.mfd.msk:8088/browse/CLS-357 SDF06 inOutDirection in не требует проверки через gateway 2023-06-27 12:02:59 +03:00
ialbert
7a9b9b6eff выгрузка сделок на шаге 1 для промежуточной сессии МКР аналогично финальной МКР (выгружаем все ExecutionDeposit) 2023-06-26 19:47:14 +03:00
ialbert
4fe117236f обновление workflowStatus при закрытии 2023-06-26 19:09:40 +03:00
ialbert
da10e2bd0d http://jira.mfd.msk:8088/browse/CLS-359 sdf03#sbanknam/rbanknam, sdf03#sum_deb, sdf12#quantity 2023-06-26 16:06:48 +03:00
AKurakin
4fa1cbf32a utility-service http://jira.mfd.msk:8088/browse/CLS-339 Notification priority enum 2023-06-26 15:55:46 +03:00
AKurakin
baa7492e99 utility-service http://jira.mfd.msk:8088/browse/CLS-339 Notification новые поля 2023-06-26 15:52:46 +03:00
psemenkov
5c69305e1f http://jira.mfd.msk:8088/browse/CLS-268
Поправил валидацию clearingCalendar.
2023-06-26 15:04:11 +03:00
psemenkov
f27b313044 http://jira.mfd.msk:8088/browse/CLS-268
Поправил ошибки и вывод в лог.
2023-06-26 15:04:11 +03:00
AKurakin
54cacc7e2e DDL meta http://jira.mfd.msk:8088/browse/CLS-355 Добавление полей comment и priority в notification, справочника priority 2023-06-26 14:35:56 +03:00
AKurakin
88fda6d2b9 securities-service http://jira.mfd.msk:8088/browse/CLS-258 очередные мелкие баги с валидацией поправил 2023-06-23 19:15:46 +03:00
ialbert
2acf7a1e24 инициирование сверки SDF56 по команде от scheduler-service 2023-06-23 15:48:35 +03:00
ialbert
168d54a040 SDF57 executor diffBalance/checkBalance for registry_unit B/F fix 2023-06-23 13:06:45 +03:00
AKurakin
c18d9d41aa swt-exporter http://jira.mfd.msk:8088/browse/CLS-317 поправил формат DF09, DF11, DF12, DF14 2023-06-22 19:08:28 +03:00
etreschenkov
385992cdb1 http://jira.mfd.msk:8088/browse/CLS-348 2023-06-22 18:50:23 +03:00
etreschenkov
d759e54f6d вводы/выводы - gateway 2023-06-22 16:05:00 +03:00
aalehin
4ac51b04ef http://jira.mfd.msk:8088/browse/CLS-280
---
refactor
2023-06-22 16:00:28 +03:00
etreschenkov
b18e047f84 вводы/выводы - gateway 2023-06-22 12:49:56 +03:00
etreschenkov
aa9081ccf3 вводы/выводы - gateway 2023-06-22 12:38:20 +03:00
etreschenkov
bf68d50b3e реформат реквеста для security-service 2023-06-22 10:52:24 +03:00
AKurakin
1d639b5b48 backend-api http://jira.mfd.msk:8088/browse/CLS-356 + убрал древние валидаторы из ActionValidationProvider 2023-06-21 18:42:59 +03:00
AKurakin
8467b8ef9d securities-service добавил обработку DESTINATION_GATEWAY_MONEY_MARKET_SECURITY 2023-06-21 18:05:46 +03:00
etreschenkov
43dde65830 отправить ответный запрос с gateway в клиринг сервис 2023-06-21 15:35:38 +03:00
AKurakin
11fbb281a6 company-service поправил текст ошибок для CompanySymbolNew (todo refactoring update) 2023-06-21 13:50:59 +03:00
AKurakin
e3cbd73807 company-service поправил текст ошибок для company-new/update 2023-06-21 13:38:51 +03:00
etreschenkov
28006c3a33 поправил заполнение id у запроса от gateway 2023-06-21 12:08:06 +03:00
AKurakin
fa17164d81 securities-service рефакторинг обработки запросов. 2023-06-21 11:46:07 +03:00
etreshenkov
058c5ec1b4 fix company-service 2023-06-21 11:17:12 +03:00
ialbert
b19ec97a5d http://jira.mfd.msk:8088/browse/CLS-357 SDF06 executor 2023-06-20 19:46:24 +03:00
etreshenkov
8f7bd69f4e fix bug 2023-06-20 19:07:11 +03:00
aalehin
7a685c8f0c http://jira.mfd.msk:8088/browse/CLS-280
---
refactor
2023-06-20 19:04:58 +03:00
AKurakin
4382cc5572 swt-exporter http://jira.mfd.msk:8088/browse/CLS-317 поправил формат 2023-06-20 18:36:07 +03:00
ialbert
8d4c38a9cb creating payment instruction session step 7 bugfix: transaction_number -> transactionNumber 2023-06-20 15:39:07 +03:00
AKurakin
40c2bdc64a account-service http://jira.mfd.msk:8088/browse/CLS-271 ТКР, часть, остальное см. company-service что присылает. 2023-06-20 14:40:47 +03:00
ialbert
f5acd1e0e5 marketCodes T0/B0 session bugfix 2023-06-20 14:31:09 +03:00
ialbert
e935b3c366 bugfix подготовка сделок для сессий первичные торги B0/T0 marketType -> market 2023-06-20 12:32:41 +03:00
ialbert
34faab9220 SDF06 executor bugfix 2023-06-19 19:07:21 +03:00
ialbert
ae7e03fda8 SDF57 executor NLP fix 2023-06-19 18:17:58 +03:00
ialbert
eae1e816da statement service bugfix 2023-06-19 18:10:23 +03:00
AKurakin
99d141bf41 account-service imdg - wait available 2023-06-19 17:51:53 +03:00
etreschenkov
142c534aa2 http://jira.mfd.msk:8088/browse/CLS-259 2023-06-19 17:00:20 +03:00
ialbert
b81559002f обработка SDF06 взаимодействие с gateway 2023-06-19 16:56:05 +03:00
AKurakin
c98087ccd6 securities-service api-gateway http://jira.mfd.msk:8088/browse/CLS-348 2023-06-19 16:46:21 +03:00
ialbert
699a40f157 обработка SDF06 клиринг сервисом 2023-06-19 12:41:21 +03:00
etreschenkov
4a4af8a442 проставлять securityType для запроса от gateway 2023-06-19 12:35:14 +03:00
ialbert
54307516ad clearing-service SDF06 amount, direction 2023-06-16 19:55:00 +03:00
etreschenkov
c676be8f0d http://jira.mfd.msk:8088/browse/CLS-357 2023-06-16 19:52:04 +03:00
etreschenkov
0865c8b1d7 http://jira.mfd.msk:8088/browse/CLS-357 2023-06-16 19:49:57 +03:00
AKurakin
98964a3f3e account-service http://jira.mfd.msk:8088/browse/CLS-265 поправил валидацию status 2023-06-16 19:41:34 +03:00
ialbert
2e7011921d убрал проверку на маркет U для SDF06 2023-06-16 19:25:02 +03:00
ialbert
a13b874b3e bugfix sdf06 validation 2023-06-16 19:09:13 +03:00
AKurakin
e5e7f774e5 backend-api http://jira.mfd.msk:8088/browse/CLS-64 UserSettingsController fix unit test (see ea561b9a85) 2023-06-16 19:01:54 +03:00
AKurakin
26e8dd200a backend-api db-scripts http://jira.mfd.msk:8088/browse/CLS-354 meta json update 2023-06-16 19:01:54 +03:00
ialbert
9690dd727e зависимость на модуль проверки прав для клиринг сервиса 2023-06-16 18:53:30 +03:00
ialbert
654b4f643c обработка SDF06 клиринг сервисом 2023-06-16 18:47:44 +03:00
etreschenkov
869315ce5a some refactroing gateway 2023-06-16 18:42:33 +03:00
etreschenkov
b399d238c3 rename class 2023-06-16 18:38:22 +03:00
etreschenkov
fa76c1fb35 fix logging 2023-06-16 18:35:17 +03:00
etreschenkov
3f8b24319c some refactroing gateway 2023-06-16 18:22:25 +03:00
etreschenkov
33c40cfa66 some refactroing gateway 2023-06-16 18:12:14 +03:00
etreschenkov
b6f94a4069 some refactroing gateway 2023-06-16 18:11:31 +03:00
etreschenkov
c15f3fba9d some refactroing gateway 2023-06-16 17:23:19 +03:00
etreschenkov
2d2a89264d some refactroing gateway 2023-06-16 16:21:52 +03:00
etreschenkov
9e095a1825 some refactroing gateway 2023-06-16 15:27:23 +03:00
etreschenkov
8d0f1faae8 http://jira.mfd.msk:8088/browse/CLS-357 2023-06-16 15:20:32 +03:00
etreschenkov
1c155e4804 http://jira.mfd.msk:8088/browse/CLS-357 2023-06-16 14:54:38 +03:00
etreshenkov
e704b8d70c изменил(упростил) логику gatewa 2023-06-16 14:22:47 +03:00
AKurakin
1cd52cd2c3 dbf-importer SDf57Table Ext_date теперь любой тип доступен :) 2023-06-15 18:35:26 +03:00
AKurakin
ea561b9a85 backend-api http://jira.mfd.msk:8088/browse/CLS-64 UserSettingsController.java 2023-06-15 18:26:21 +03:00
AKurakin
ef187881b2 dbf-importer SDf57Table unixtime Ext_date 2023-06-15 18:19:01 +03:00
ialbert
ca05eb96c0 пример переноса логики сессии первичных торгов Bn на Spring State Machine 2023-06-15 17:14:49 +03:00
AKurakin
f7cd2307a5 clearing-validation добавил валидацию на инициализацию валидатора 2023-06-15 17:09:37 +03:00
AKurakin
18b0c66920 account-service http://jira.mfd.msk:8088/browse/CLS-265 TradingClearingRegistry правки заполнения и валидации счетов 2023-06-15 17:06:57 +03:00
AKurakin
df5175b2a5 account-service http://jira.mfd.msk:8088/browse/CLS-265 TradingClearingRegistry правки заполнения и валидации счетов 2023-06-15 16:49:05 +03:00
AKurakin
3f35a92afd imdg оптимизация *AccountMapStore 2023-06-15 14:11:24 +03:00
etreschenkov
abaf107700 fix CompanyService 2023-06-14 18:46:38 +03:00
etreschenkov
acbd5c4b05 refactoring gateway 2023-06-14 18:46:38 +03:00
etreschenkov
a8dd8d78ef http://jira.mfd.msk:8088/browse/CLS-301 2023-06-14 18:46:38 +03:00
AKurakin
9292206208 clearing-service http://jira.mfd.msk:8088/browse/CLS-265 Sdf08Executor поправил тип счёта-депо (рефакторинг) 2023-06-14 18:35:48 +03:00
AKurakin
c211870d3f clearing-service http://jira.mfd.msk:8088/browse/CLS-265 Sdf08Executor поправил тип счёта-депо 2023-06-14 17:37:52 +03:00
ialbert
01db30a3bc добавил поднятие сессии из IMDG при старте clearing-service
пофиксил тип сессии для первичных торгов B0
2023-06-13 18:52:16 +03:00
etreshenkov
b1af5cc68f fix bug 2023-06-13 18:38:18 +03:00
etreshenkov
75bf1db1ab remove balance-service from build distr 2023-06-13 17:16:36 +03:00
etreshenkov
2b4c5fef77 fix bug 2023-06-13 17:09:40 +03:00
etreshenkov
0e225d7804 fix init messageResolver bean 2023-06-13 12:14:10 +03:00
etreshenkov
4f8e13ca3c add section to Limit request 2023-06-13 12:03:22 +03:00
psemenkov
d087b1caa7 http://jira.mfd.msk:8088/browse/CLS-316
Поправил заполнение s_df10.client_name.
2023-06-13 11:02:29 +03:00
psemenkov
fe5ff2a422 http://jira.mfd.msk:8088/browse/CLS-316
Поправил заполнение s_df10.client_name.
2023-06-13 10:25:48 +03:00
AKurakin
f1cb711326 securities-service http://jira.mfd.msk:8088/browse/CLS-348 часть 1/3 2023-06-09 20:52:19 +03:00
psemenkov
c94fe7d4db http://jira.mfd.msk:8088/browse/CLS-316
Поправил вывод в лог.
2023-06-09 18:58:07 +03:00
psemenkov
7d47af9e18 Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	clearing-parent/swt-importer/src/main/java/ru/spcex/clearing/swt/importer/logic/stages/ImportToDB.java
2023-06-09 18:51:28 +03:00
psemenkov
5dd546ae4f http://jira.mfd.msk:8088/browse/CLS-316
Поправил ошибку загрузки нескольких строк.
2023-06-09 18:47:33 +03:00
AKurakin
dd151e80d2 clearing-service sdf08 обработка автосоздания счетов. Оказалось что DEPO ужно делать (част 2/2). Поправил транзакции. 2023-06-09 18:23:47 +03:00
AKurakin
872b66984d clearing-service sdf08 обработка автосоздания счетов. Оказалось что DEPO ужно делать (част 1/2) 2023-06-09 17:35:10 +03:00
AKurakin
ad09a31171 clearing-service sdf08 обработка автосоздания счетов 2023-06-09 17:15:50 +03:00
AKurakin
f9fa84ad64 clearing-service sdf08 обработка автосоздания счетов 2023-06-09 16:50:12 +03:00
AKurakin
5cffd47463 company-service http://jira.mfd.msk:8088/browse/CLS-347 MultiCompanyService добавил обновления 2023-06-09 13:44:10 +03:00
AKurakin
79c56c4571 Больше логов SDF08... 2023-06-09 12:15:21 +03:00
psemenkov
8f7a64122c Merge remote-tracking branch 'origin/dev' into dev 2023-06-09 12:11:11 +03:00
psemenkov
b3f5ac1026 http://jira.mfd.msk:8088/browse/CLS-316
Поправил ошибку.
2023-06-09 12:11:04 +03:00
AKurakin
4e795ee832 . 2023-06-09 11:49:21 +03:00
ialbert
f21e7dea88 sdf04 fix 2023-06-09 10:58:58 +03:00
ialbert
e6b32c4943 фикс обработки SDF04 2023-06-09 10:56:31 +03:00
AKurakin
b85247dfaf account-service http://jira.mfd.msk:8088/browse/CLS-265 2023-06-09 10:39:00 +03:00
AKurakin
66cf85a688 account-service fix TCR validation; clearing-service swt-importer логи 2023-06-08 19:29:56 +03:00
AKurakin
12f9d024aa clearing-service sdf08 2023-06-08 18:23:58 +03:00
psemenkov
c62e99fd7d Merge remote-tracking branch 'origin/dev' into dev 2023-06-08 18:02:30 +03:00
psemenkov
754b915aed http://jira.mfd.msk:8088/browse/CLS-262
Поправил ошибку.
2023-06-08 18:02:21 +03:00
ialbert
f759ce4d56 создание PaymentInstruction при обработке сделок для итоговой сессии МКР - блокировка средств 2023-06-08 17:22:48 +03:00
AKurakin
af2c9fac0e account-service http://jira.mfd.msk:8088/browse/CLS-271 TCR правки 2023-06-08 16:44:11 +03:00
etreshenkov
9a1a878513 http://jira.mfd.msk:8088/browse/CLS-313 2023-06-08 16:36:32 +03:00
ialbert
fb77fb7603 создание PaymentInstruction при обработке сделок для итоговой сессии МКР SDF03 Sbanknam 2023-06-08 16:33:26 +03:00
ialbert
5d4005a087 создание PaymentInstruction при обработке сделок для итоговой сессии МКР payeeBic 2023-06-08 16:10:22 +03:00
AKurakin
f45ed7fa1f clearing-service account+sdf01... 2023-06-08 16:03:42 +03:00
AKurakin
7b6a74fd0a clearing-service account-service правки связей счетов и s_df 01, 08. 2023-06-08 16:00:17 +03:00
ialbert
29ecf18e2e создание PaymentInstruction при обработке сделок для итоговой сессии МКР создание SDF03 фикс 2023-06-08 16:00:00 +03:00
ialbert
9d2be448ee создание PaymentInstruction при обработке сделок для итоговой сессии МКР fix payeeBic 2023-06-08 15:56:30 +03:00
ialbert
2319f1a345 создание PaymentInstruction при обработке сделок для итоговой сессии МКР поля AdresseeBic/PayeeBic 2023-06-08 15:09:13 +03:00
ialbert
5ed749dbab создание PaymentInstruction при обработке сделок addresseId 2023-06-08 15:00:07 +03:00
AKurakin
768ba7c47f clearing-service account-service правки создания ClearingAccount 2023-06-08 14:46:02 +03:00
ialbert
f5a7842ab1 создание PaymentInstruction по возвратам для итоговой сессии МКР условия и поля 2023-06-08 14:42:37 +03:00
ialbert
4e283ff5e8 ialbert 3 minutes ago создание PaymentInstruction для итоговой МКР по сделкам bugfix 2023-06-08 14:32:50 +03:00
ialbert
62c92ea4b3 создание PaymentInstruction для итоговой МКР по сделкам bugfix 2023-06-08 14:29:47 +03:00
AKurakin
621069c933 account-service http://jira.mfd.msk:8088/browse/CLS-271 поправил зацикливание и создание счёта по SDF-01 2023-06-08 14:11:39 +03:00
ialbert
d8e519c838 итоговая МКР создание PaymentInstruction по сделкам bugfix 2023-06-08 14:00:04 +03:00
ialbert
e7d2b420d4 формирование PaymentInstruction для сделок итоговой МКР logs 2023-06-08 13:36:26 +03:00
ialbert
ef17c60c58 итоговая МКР добавил создание PaymentInstruction по возврату
поправил отправку SDF03
2023-06-08 13:33:02 +03:00
etreshenkov
14c4dc58f2 http://jira.mfd.msk:8088/browse/CLS-301 2023-06-08 12:43:39 +03:00
psemenkov
420bfca7d1 Merge remote-tracking branch 'origin/dev' into dev 2023-06-08 12:40:03 +03:00
psemenkov
04b5498542 http://jira.mfd.msk:8088/browse/CLS-321
Поправил ошибки.
2023-06-08 12:39:52 +03:00
ialbert
7abf031246 ReturnDepositSession убрал условие на sessionType при включении в пул 2023-06-07 17:11:20 +03:00
psemenkov
d3fc4ae105 http://jira.mfd.msk:8088/browse/CLS-321
Изменил директорию для уведомлений.
2023-06-07 17:00:39 +03:00
ialbert
7bda8ea334 итоговая МКР условия выборки регистров на шаге 4 2023-06-07 16:04:45 +03:00
psemenkov
2f2d99e7ce Merge remote-tracking branch 'origin/dev' into dev 2023-06-07 16:04:08 +03:00
psemenkov
e049752508 http://jira.mfd.msk:8088/browse/CLS-321
Реализовал формирование уведомлений newInfoAccount и newTradingClearingRegistry.
2023-06-07 16:02:13 +03:00
ialbert
c99fa30bbd создание PaymentInstruction при обработке сделок для итоговой сессии МКР 2023-06-07 15:10:11 +03:00
ialbert
56719d4d37 фикс D регистров при обработке Sdf57 2023-06-07 12:13:34 +03:00
etreshenkov
9a3cb66037 fix creating registryD by sdf57 2023-06-06 19:01:21 +03:00
AKurakin
c6d047a7ea gateway-api временно убрал валидацию GatewayController 2023-06-06 18:38:17 +03:00
AKurakin
7a01ffc6c0 company-service http://jira.mfd.msk:8088/browse/CLS-347 ... 2023-06-06 18:02:55 +03:00
AKurakin
865af17158 company-service http://jira.mfd.msk:8088/browse/CLS-347 ока только new заделал. Доделать update, transaction 2023-06-06 17:58:05 +03:00
etreshenkov
5129a05bb8 send one package with all info about company to company-service 2023-06-06 17:39:53 +03:00
AKurakin
5c2c600d46 gateway-api company-service MultiCompanyRequest Начало. 2023-06-06 16:26:11 +03:00
aalehin
333d935a26 http://jira.mfd.msk:8088/browse/CLS-339
---
refactor from code review
2023-06-06 16:23:14 +03:00
AKurakin
6bb00569d3 company-service relation удаление по ClearingMemberCategory (правильно понял ТЗ) 2023-06-06 13:04:16 +03:00
ialbert
41c414497d убрал для итоговой МКР провверку обязательств по бумагам в шаге 5
добавил обновление статусов регистров в FAIL по второму дню в шаге 5
2023-06-06 12:55:10 +03:00
etreshenkov
c7a752120d fix logging request 2023-06-06 12:37:47 +03:00
AKurakin
e99d83fb4f company-service http://jira.mfd.msk:8088/browse/CLS-259 часть правок (доделать relation) 2023-06-05 20:42:24 +03:00
AKurakin
3db1ef31b8 meta правки опечаток 2023-06-05 19:32:10 +03:00
AKurakin
bff41c81f9 securities-service . 2023-06-05 18:58:22 +03:00
AKurakin
a036261319 securities-service http://jira.mfd.msk:8088/browse/CLS-326 2023-06-05 18:53:43 +03:00
akulikov
2254f94de7 http://jira.mfd.msk:8088/browse/CLS-301 2023-06-05 18:15:57 +03:00
AKurakin
ae37e501f6 securities-service http://jira.mfd.msk:8088/browse/CLS-258 оправил заполнение поля 2023-06-05 18:12:33 +03:00
ialbert
c10dd23a38 убрал проверку account#relationId при валидации регистров на шаге сессии ObligationAdmission 2023-06-05 18:07:57 +03:00
aalehin
9c3e8737a0 http://jira.mfd.msk:8088/browse/CLS-339
---
NotificationService set up
2023-06-05 17:42:41 +03:00
ialbert
415d5697d8 session closing 2023-06-05 17:06:45 +03:00
etreshenkov
56e3507e26 fix registry builders 2023-06-05 14:00:34 +03:00
etreshenkov
c8f7f5212e fix registry builders 2023-06-05 13:09:17 +03:00
ialbert
e3352e6fdf privamr 2023-06-05 12:25:12 +03:00
etreshenkov
989dcdec73 fix registry builders 2023-06-05 12:24:23 +03:00
ialbert
629b8c63aa deposit/fond registry builder 2023-06-05 12:17:44 +03:00
etreshenkov
0f7a017a8d fix registry builders 2023-06-05 12:13:41 +03:00
ialbert
d26ee55b55 fond/deposit registry builder 2023-06-05 12:05:08 +03:00
etreshenkov
46d87a046e fix registry builders 2023-06-05 11:13:54 +03:00
akulikov
89c8dc7434 http://jira.mfd.msk:8088/browse/CLS-301 2023-06-04 14:27:12 +03:00
akulikov
501a160f14 http://jira.mfd.msk:8088/browse/CLS-301 2023-06-04 14:24:02 +03:00
AKurakin
46c6d73cd9 company-service account-service http://jira.mfd.msk:8088/browse/CLS-284 ACCOUNT_TERMINATION/ACCOUNT_TERMINATION_STEP2 2023-06-02 20:24:46 +03:00
etreschenkov
f046ffb3ab fix FinalMkrSession 2023-06-02 20:11:14 +03:00
etreschenkov
e2a0f33012 add payload to paymentInstructionForming for every session 2023-06-02 17:57:20 +03:00
AKurakin
e5dc6d4487 company-service http://jira.mfd.msk:8088/browse/CLS-284 rreellaattiioonn 2023-06-02 17:17:09 +03:00
ialbert
3310559df6 FormingPaymentInstructionDepositReturn.java 2023-06-02 16:25:31 +03:00
aalehin
21d959740f http://jira.mfd.msk:8088/browse/CLS-280
---
fix up
2023-06-02 15:33:06 +03:00
ialbert
6536852791 PaymentInstructions for deposit return session 2023-06-02 15:12:43 +03:00
aalehin
a57907dc9d http://jira.mfd.msk:8088/browse/CLS-280
---
refactoring
2023-06-02 15:10:26 +03:00
etreschenkov
6139772966 fix sdf-4 bugs 2023-06-02 14:02:53 +03:00
etreschenkov
2cab7c7b5a fix sdf-4 bugs 2023-06-02 13:49:44 +03:00
AKurakin
c564373382 account-service http://jira.mfd.msk:8088/browse/CLS-271 добавление оповещений о TradingClearingRegistryService 2023-06-02 10:45:28 +03:00
AKurakin
b30f01e3eb account-service http://jira.mfd.msk:8088/browse/CLS-271 добавление оповещений о TradingClearingRegistryService 2023-06-02 10:33:05 +03:00
akulikov
d62829f3b1 http://jira.mfd.msk:8088/browse/CLS-283 some fixes 2023-06-01 21:21:40 +03:00
AKurakin
c929b196b1 account-service http://jira.mfd.msk:8088/browse/CLS-271 добавление оповещений о TradingClearingRegistryService 2023-06-01 20:11:15 +03:00
AKurakin
a7fd8dc0ab company-service RelationService оправил проверку статусов 2023-06-01 18:56:32 +03:00
AKurakin
f4517b7736 securities-service http://jira.mfd.msk:8088/browse/CLS-326 часть правок 2023-06-01 18:46:45 +03:00
AKurakin
bd8af7fc16 account-service http://jira.mfd.msk:8088/browse/CLS-272 http://jira.mfd.msk:8088/browse/CLS-271 2023-06-01 18:46:24 +03:00
aalehin
903fed53b3 http://jira.mfd.msk:8088/browse/CLS-280
---
execution register
2023-06-01 18:07:54 +03:00
aalehin
0db6f75823 http://jira.mfd.msk:8088/browse/CLS-280
---
fix up
2023-06-01 18:07:54 +03:00
aalehin
dab63ad8be http://jira.mfd.msk:8088/browse/CLS-280
---
fix up
2023-06-01 18:07:54 +03:00
aalehin
5fa0bcd9be http://jira.mfd.msk:8088/browse/CLS-316
---
fix up
2023-06-01 18:07:53 +03:00
etreshenkov
226c33faaf creation DF-03/12 by PaymentInstruction 2023-06-01 17:46:48 +03:00
etreshenkov
a8eaf758c4 creation DF-03/12 by PaymentInstruction 2023-06-01 17:33:55 +03:00
AKurakin
42b26f4988 account-service http://jira.mfd.msk:8088/browse/CLS-265 2023-06-01 17:18:49 +03:00
ialbert
e9a1b245f1 ReturnDepositSession XDEP 2023-06-01 16:39:40 +03:00
etreshenkov
36e8d5f096 creation DF-03/12 by PaymentInstruction 2023-06-01 16:37:59 +03:00
etreshenkov
0987180bd3 fix stage 7 2023-06-01 16:37:00 +03:00
ialbert
8955aafdb9 ReturnDepositSession 2023-06-01 15:44:48 +03:00
AKurakin
c040188512 account-service http://jira.mfd.msk:8088/browse/CLS-271 TradingClearingRegistryService Что с кодом? Такой баг я где-то уже правил. Как тогда на тесте смогли что-то сделать? 2023-06-01 15:23:00 +03:00
etreshenkov
fa09badd70 fix reset balance 2023-06-01 14:35:01 +03:00
etreshenkov
c5d8260b38 fix stage 7 2023-06-01 14:07:05 +03:00
AKurakin
283e623f19 backend-api meta валидация Listing*Action 2 2023-06-01 14:05:05 +03:00
AKurakin
131c32978c backend-api meta валидация Listing*Action 2023-06-01 13:14:19 +03:00
etreshenkov
d1a9462029 fix stage 7 2023-06-01 13:06:14 +03:00
akulikov
baa61228fa http://jira.mfd.msk:8088/browse/CLS-301 some fixes 2023-06-01 12:36:13 +03:00
AKurakin
3a887732ac securities-service оправил параметры текста ошибки в SpecialIdPresentRule 2023-06-01 12:22:03 +03:00
AKurakin
d734d02a14 securities-service ListingValidation fix 2 2023-06-01 12:03:53 +03:00
AKurakin
f93525823a securities-service ListingValidation fix 2023-06-01 11:44:41 +03:00
AKurakin
07ffb36104 securities-service исправление e70cbc108d 2023-06-01 09:57:34 +03:00
AKurakin
5c3cc9265e platform-messaging debug log++ 2023-05-31 20:28:15 +03:00
AKurakin
86b9bd095f company-service ClearingMemberCategoryService -> RelationService правки взаимодествия 2023-05-31 20:22:36 +03:00
etreschenkov
a622fccc71 fix stage 7 2023-05-31 19:25:12 +03:00
etreschenkov
6af1575053 fix stage 7 2023-05-31 19:14:40 +03:00
aalehin
7b7baf52d3 http://jira.mfd.msk:8088/browse/CLS-280
---
update
2023-05-31 18:51:18 +03:00
AKurakin
750d5c1e76 company-service CompanyService CompanyInfo заполнение (начало) 2023-05-31 18:36:40 +03:00
etreschenkov
e1dea39b1f fix stage 5 2023-05-31 18:35:30 +03:00
ialbert
74697eb48f InclusionObligations 2023-05-31 18:14:05 +03:00
AKurakin
e224a4ffb7 account-service http://jira.mfd.msk:8088/browse/CLS-272 ClientCodeService, TradingClearingRegistryService 2023-05-31 18:05:46 +03:00
etreschenkov
2a873a22b3 http://jira.mfd.msk:8088/browse/CLS-328 2023-05-31 17:46:32 +03:00
AKurakin
53a574f34f securities-service http://jira.mfd.msk:8088/browse/CLS-326 Listing-валидация. 2023-05-31 16:52:52 +03:00
ialbert
14915bf450 ExecutionDeposit - always money 2023-05-31 16:25:33 +03:00
ialbert
15d950bee8 privamr 2023-05-31 16:09:49 +03:00
etreschenkov
37bc4b72cd add check on exist sdf57 record by dbfId 2023-05-31 15:57:51 +03:00
ialbert
1621a3cfb9 DealsPrepare session stage tradingDate condition 2023-05-31 15:56:50 +03:00
ialbert
50201be458 final MKR deals conditions 2023-05-31 15:48:19 +03:00
etreschenkov
59d06cd0a8 http://jira.mfd.msk:8088/browse/CLS-303 2023-05-31 15:36:29 +03:00
AKurakin
329e2dda28 IMDGMessageResolver добавил номер ошибки в текст 2023-05-31 15:30:27 +03:00
etreschenkov
29b7bd7f38 http://jira.mfd.msk:8088/browse/CLS-303 2023-05-31 15:25:51 +03:00
etreschenkov
e641510e7c http://jira.mfd.msk:8088/browse/CLS-303 2023-05-31 14:51:42 +03:00
ialbert
8255f4a1eb sdf57 executor 2023-05-31 14:39:06 +03:00
AKurakin
e70cbc108d security-util SecuritySelector 2023-05-31 14:38:25 +03:00
etreschenkov
addf59853e http://jira.mfd.msk:8088/browse/CLS-303 2023-05-31 14:20:07 +03:00
akulikov
93fb2eaa07 http://jira.mfd.msk:8088/browse/CLS-301 fix send securities, test added 2023-05-31 14:09:29 +03:00
ialbert
9360387bd0 registries B/F для sdf57 executor 2023-05-31 13:55:18 +03:00
etreschenkov
0a2e7ca09a http://jira.mfd.msk:8088/browse/CLS-303 2023-05-31 13:50:25 +03:00
ialbert
f52f5fe304 sdf57 executor clearing-service 2023-05-31 13:16:17 +03:00
AKurakin
2527755afc imdg добавление некоторых History 2023-05-31 12:28:53 +03:00
akulikov
7e8566cb14 http://jira.mfd.msk:8088/browse/CLS-301 swagger fix 2023-05-31 11:33:12 +03:00
AKurakin
d5c6123575 scheduler-service dbf-exporter http://jira.mfd.msk:8088/browse/CLS-268 параметры запуска, валидация. Task.java 2023-05-31 11:31:43 +03:00
AKurakin
eebfd0b16a meta 3.5.0.31 2023-05-31 11:14:47 +03:00
etreschenkov
79c3c9bdad Merge branch 'sdf08' into dev 2023-05-31 10:45:44 +03:00
etreschenkov
bfc487cfa5 http://jira.mfd.msk:8088/browse/CLS-303 2023-05-31 10:30:07 +03:00
akulikov
24e9b4f548 http://jira.mfd.msk:8088/browse/CLS-301 swagger and validate common request 2023-05-30 20:59:36 +03:00
akulikov
587da25d0c http://jira.mfd.msk:8088/browse/CLS-301 fix bad logic and search company for company symbols, if company not found in request 2023-05-30 20:02:44 +03:00
etreshenkov
14dc721cfd fix stage 5 2023-05-30 19:28:34 +03:00
aalehin
f99398ea12 http://jira.mfd.msk:8088/browse/CLS-316
---
fix up
2023-05-30 19:07:34 +03:00
aalehin
5c3c287bf4 http://jira.mfd.msk:8088/browse/CLS-316
---
fix up
2023-05-30 19:07:34 +03:00
AKurakin
a934befc3d . 2023-05-30 18:59:54 +03:00
AKurakin
e2fc49c968 company-service RelationService ... 2023-05-30 18:50:18 +03:00
etreshenkov
0ce767d78f fix StatementService 2023-05-30 18:31:42 +03:00
ialbert
29b3f3b188 final MKR session duplicate intermediate MKR session 2023-05-30 18:07:22 +03:00
etreshenkov
e58c6fa899 fix swt export 2023-05-30 17:59:15 +03:00
aalehin
2c2e0a699a http://jira.mfd.msk:8088/browse/CLS-316
---
fix up
2023-05-30 17:54:39 +03:00
etreshenkov
88068659cf exporter 2023-05-30 17:54:34 +03:00
ialbert
c0a88239a0 SDF57 fix registry#balance NLP 2023-05-30 17:52:44 +03:00
AKurakin
475d19f1d8 account-service BankAccountService поправил блокировку 2023-05-30 17:51:33 +03:00
aalehin
1e1c4f5526 http://jira.mfd.msk:8088/browse/CLS-316
---
fix up
2023-05-30 17:44:30 +03:00
ialbert
0c8fec38dc ExecutionDeposit#securityCode 2023-05-30 17:34:04 +03:00
aalehin
143f7f9088 http://jira.mfd.msk:8088/browse/CLS-316
---
update
2023-05-30 17:24:29 +03:00
etreshenkov
3135905dcc fix stage 5 2023-05-30 17:06:36 +03:00
AKurakin
79f0650417 clearing-validation поправил сообщение об ошибке 1010 2023-05-30 16:43:55 +03:00
AKurakin
bc0f95e032 account-service поправил правки по изменённому правками ТЗ. Поправил. 2023-05-30 16:15:22 +03:00
AKurakin
8991d915b3 securities-service Поправил (вернул) listing с MoneyMarketSecurityService.java 2023-05-30 15:28:01 +03:00
ialbert
49d13fba43 MKR session 2023-05-30 15:17:18 +03:00
etreshenkov
c5d74bd318 fix creation registry by sdf01 2023-05-30 15:06:00 +03:00
AKurakin
1710d25188 swt-exporter http://jira.mfd.msk:8088/browse/CLS-317 улучшил перенос строк, поправил вывод в файл 2023-05-30 14:58:49 +03:00
akulikov
d7400624fa http://jira.mfd.msk:8088/browse/CLS-283 log unknown properties 2023-05-30 14:51:54 +03:00
ialbert
37b6b5d4e9 RequirementsAndObligationCreation stage execution matching logs 2023-05-30 14:03:55 +03:00
AKurakin
374ff0ca34 lim-exporter http://jira.mfd.msk:8088/browse/CLS-262 формат чисел 2023-05-30 13:51:47 +03:00
akulikov
c505292247 http://jira.mfd.msk:8088/browse/CLS-283 some fixes 2023-05-30 13:35:37 +03:00
ialbert
23efed8caa session continue EventReceiver 2023-05-30 13:19:27 +03:00
ialbert
5dfeeaff61 PrimaryAuctionT0Session 2023-05-30 13:08:36 +03:00
AKurakin
578283a999 company-service http://jira.mfd.msk:8088/browse/CLS-259 правки 2023-05-30 13:01:19 +03:00
ialbert
6b34b26852 Secondary SecondaryAuctionT0Session session fix 2023-05-30 11:59:31 +03:00
AKurakin
b29e6b7ab8 swt-importer http://jira.mfd.msk:8088/browse/CLS-316 поправил порт в настройках как на 181. 2023-05-30 11:56:26 +03:00
ialbert
4249e486ba warn -> info for "new deals not found" in loading ExecutionDeposit/ExecutionFond 2023-05-30 11:31:21 +03:00
etreshenkov
a0525260ed fix stage 5 2023-05-30 11:15:52 +03:00
etreshenkov
79637d1bd9 fix stage 5 2023-05-30 11:14:30 +03:00
ialbert
5daab77c0a distr pom 2023-05-30 11:12:53 +03:00
AKurakin
cf62aa4586 meta 3.5.0.30 http://jira.mfd.msk:8088/browse/CLS-344 обновление классов... (поправил тест imdg) 2023-05-30 11:05:25 +03:00
aalehin
30161a3291 http://jira.mfd.msk:8088/browse/CLS-317
---
formatting changed
2023-05-29 22:20:30 +03:00
etreschenkov
a950dfcf33 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-29 21:54:35 +03:00
etreschenkov
c288a5669f http://jira.mfd.msk:8088/browse/CLS-290 2023-05-29 20:56:54 +03:00
AKurakin
be01162125 meta 3.5.0.30 http://jira.mfd.msk:8088/browse/CLS-344 обновление классов... 2023-05-29 20:26:40 +03:00
AKurakin
4b58259239 meta 3.5.0.30 http://jira.mfd.msk:8088/browse/CLS-344 обновление классов 2023-05-29 19:59:23 +03:00
AKurakin
d8f79b85ee reports-service fix NPE in Execution LiabilitiesClaimsReportBuilder report 2023-05-29 19:22:56 +03:00
AKurakin
4218d95a49 meta 3.5.0.30 http://jira.mfd.msk:8088/browse/CLS-344 2023-05-29 19:22:56 +03:00
etreschenkov
e95e5bd677 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-29 19:20:42 +03:00
etreschenkov
b3a5565dc0 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-29 19:01:49 +03:00
etreschenkov
3bf9d651cd http://jira.mfd.msk:8088/browse/CLS-290 2023-05-29 18:33:34 +03:00
etreschenkov
0390f3d20e http://jira.mfd.msk:8088/browse/CLS-290 2023-05-29 18:33:34 +03:00
AKurakin
1775ababa1 account-service fillAccountFromRelation для AccountService убрал проверку категорий 2023-05-29 18:17:13 +03:00
ialbert
dc5c8d766f removed deprecated 2023-05-29 17:54:09 +03:00
akulikov
fdfdb12cd5 http://jira.mfd.msk:8088/browse/CLS-283 2023-05-29 17:53:53 +03:00
akulikov
22ffb02971 http://jira.mfd.msk:8088/browse/CLS-283 2023-05-29 17:14:55 +03:00
AKurakin
8dc2cb0398 data.xml 3.5.0.8 . 2023-05-29 17:08:20 +03:00
AKurakin
2e3233e17b data.xml 3.5.0.8, hot fix SessionStatusDictionary 2023-05-29 16:51:44 +03:00
etreschenkov
e84a75016e fix LauncherController fix specific method 2023-05-29 16:26:22 +03:00
etreschenkov
e110b10cb9 http://jira.mfd.msk:8088/browse/CLS-344 2023-05-29 16:08:37 +03:00
ialbert
eff05cb619 removed debug from ClearingService 2023-05-29 16:05:10 +03:00
ialbert
540562610d removed deprecated from BuilderConsumerStep.setConsumer 2023-05-29 15:57:42 +03:00
ialbert
547c993c53 SDF01 statement#clearingDate,securityId fix 2023-05-29 15:48:29 +03:00
AKurakin
5f121a09b0 account-service AccountService поправил формирование текста ошибки. 2023-05-29 15:14:15 +03:00
AKurakin
fe241653b5 company-service улучшил валидацию для Relation companyId 2023-05-29 14:36:48 +03:00
etreschenkov
537f8a3ff6 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-29 14:21:58 +03:00
AKurakin
751da613a5 securities-service поправил WorkflowStatus 2023-05-29 14:14:14 +03:00
etreschenkov
c6a7ab20c1 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-29 14:07:48 +03:00
etreschenkov
d07f2e491c http://jira.mfd.msk:8088/browse/CLS-313 2023-05-29 13:41:28 +03:00
ialbert
0873f7a166 ExecutionDeposit#SecondLegSettlementDate fix 2023-05-29 13:39:01 +03:00
etreschenkov
d57001d705 http://jira.mfd.msk:8088/browse/CLS-313 2023-05-29 13:22:06 +03:00
AKurakin
def4cd43c0 backend-api LauncherCommandRequest добавил новые поля 2023-05-29 13:02:45 +03:00
etreschenkov
7c4fb50cff send sdf05 to export 2023-05-29 12:50:04 +03:00
AKurakin
f36f1b5542 lim-exporter добавил логов 2023-05-29 12:39:19 +03:00
etreschenkov
af0a234e9b http://jira.mfd.msk:8088/browse/CLS-290 2023-05-29 12:24:29 +03:00
etreschenkov
bbd445b10f http://jira.mfd.msk:8088/browse/CLS-290 2023-05-29 12:18:44 +03:00
etreschenkov
87ea31c507 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-29 12:09:15 +03:00
ialbert
0cba4f2dbb ExecutionDeposit company search by sec_code fix
ExecutionDeposit#contract fill fix
2023-05-29 12:06:55 +03:00
akulikov
ad73909774 gateway fix 2023-05-29 11:28:00 +03:00
etreschenkov
99004e0c47 fix balance and credit for T and F registry 2023-05-29 11:26:39 +03:00
AKurakin
873123cb9c gateway-api изменил порт; swt-export добавил в батник. 2023-05-29 11:18:17 +03:00
akulikov
644414447f fix .sh 2023-05-29 10:55:21 +03:00
akulikov
234acc6577 . 2023-05-29 09:31:42 +03:00
akulikov
a5bd6dd1cf . 2023-05-28 19:28:06 +03:00
akulikov
7a8c5d704e logs 2023-05-28 18:52:30 +03:00
akulikov
e92cb8cc8e Merge branch 'dev' into cls-301
# Conflicts:
#	clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ProfileDocumentValidationConfig.java
#	clearing-parent/pom.xml
#	platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/InstrumentType.java
2023-05-27 20:48:18 +03:00
akulikov
694a029554 fix logs 2023-05-27 20:30:07 +03:00
AKurakin
6f4daca734 meta 3.5.0.28 data 2023-05-27 20:08:09 +03:00
AKurakin
fbda04082a securities-service http://jira.mfd.msk:8088/browse/CLS-325 http://jira.mfd.msk:8088/browse/CLS-326 Листинг. todo валидацию. 2023-05-27 19:55:59 +03:00
akulikov
de3a2a6759 ProcessorConfiguration 2023-05-27 19:53:32 +03:00
akulikov
0feec2cfa2 CheckMoneyMarketSecurityExist 2023-05-27 19:31:52 +03:00
etreschenkov
a289ed3672 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-27 19:29:40 +03:00
ialbert
d18504377f Merge remote-tracking branch 'origin/dev' into dev 2023-05-27 19:29:08 +03:00
ialbert
f4b1f08eec execution uploading logging fix 2023-05-27 19:26:35 +03:00
AKurakin
ebe8bbb13f account-service Валидаторrы... 2023-05-27 19:04:05 +03:00
akulikov
a0b8291e1d ValidateExchangeInstruments 2023-05-27 18:52:21 +03:00
AKurakin
4b25a6d1e9 account-service securities-service Валидаторы... 2023-05-27 18:41:08 +03:00
ialbert
616df8d5e5 ValidationConfig clearing-service fix 2023-05-27 18:35:27 +03:00
akulikov
48f619fdc7 PrepareExchangeInstruments 2023-05-27 18:17:01 +03:00
AKurakin
e68be9e8d3 securities-service продолжение необязательности валидации... 2023-05-27 18:10:27 +03:00
AKurakin
8e3b49220a backend-api BankAccountNewAction убрал проверку на RUB 2023-05-27 17:49:14 +03:00
AKurakin
5e11208758 securities-service поправил валидаторы (в соответствии с метой). Доделка 3. 2023-05-27 17:44:42 +03:00
AKurakin
1c54744fdf securities-service поправил валидаторы (в соответствии с метой). Доделка 2. 2023-05-27 17:33:40 +03:00
AKurakin
58dcfe6061 company-service http://jira.mfd.msk:8088/browse/CLS-333 часть 2. 2023-05-27 17:18:29 +03:00
aalehin
5fee2ac276 http://jira.mfd.msk:8088/browse/CLS-316
---
sh update
2023-05-27 16:56:24 +03:00
AKurakin
602604aa81 securities-service поправил валидаторы (в соответствии с метой) 2023-05-27 16:50:56 +03:00
AKurakin
5e5133b580 . 2023-05-27 16:50:56 +03:00
aalehin
18f17923f9 http://jira.mfd.msk:8088/browse/CLS-316
---
sh update
2023-05-27 16:37:35 +03:00
etreschenkov
d2da0e24c4 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-27 16:17:09 +03:00
aalehin
a60f550645 http://jira.mfd.msk:8088/browse/CLS-316
---
small fix
2023-05-27 16:09:53 +03:00
aalehin
eafd571518 http://jira.mfd.msk:8088/browse/CLS-316
---
improvement
2023-05-27 16:09:08 +03:00
akulikov
ee1f89e771 SendMessageToCompanyServiceWithMemberCompanies 2023-05-27 15:54:48 +03:00
etreschenkov
9b8c2d3e37 fix continue 2023-05-27 15:42:09 +03:00
AKurakin
adc4d101f0 reports-service http://jira.mfd.msk:8088/browse/CLS-283 запуск новых отчётов по GREP 2023-05-27 15:33:49 +03:00
ialbert
3c252ca3f6 SecondaryT0 stage 7 2023-05-27 15:08:43 +03:00
etreschenkov
b539db7664 finish session if stage7 result is empty 2023-05-27 15:02:28 +03:00
etreschenkov
515e68de67 PaymentInstructionBuilder fix 2023-05-27 14:58:19 +03:00
etreschenkov
25b64c3c09 fix up stage 7; session BN 2023-05-27 14:47:25 +03:00
ialbert
786e4af3eb sessions continue phase 2023-05-27 14:45:25 +03:00
ialbert
8d21e5a23e EventsReceiver start sessions fix 2023-05-27 14:40:07 +03:00
ialbert
84bda2fa12 start sessions based on request 2023-05-27 14:30:34 +03:00
ialbert
d51cbf809a marketCodesForBn 2023-05-27 14:16:32 +03:00
ialbert
ecbb5d1ed9 Merge remote-tracking branch 'origin/dev' into dev 2023-05-27 14:02:35 +03:00
ialbert
d60ed8a99b SecondaryAuctionT0Session 2023-05-27 14:02:26 +03:00
AKurakin
232d034126 backend-api http://jira.mfd.msk:8088/browse/CLS-257 MoneyMarketSecurity*Action добавил поле 2023-05-27 14:01:27 +03:00
ialbert
67b60354bb Merge remote-tracking branch 'origin/dev' into dev 2023-05-27 13:58:59 +03:00
ialbert
acd14d0390 marketCodesForT0 list 2023-05-27 13:58:51 +03:00
aalehin
f3067be20d http://jira.mfd.msk:8088/browse/CLS-316
---
FIX UP
2023-05-27 13:50:23 +03:00
AKurakin
a4b70c6635 company-service reports-service securities-service http://jira.mfd.msk:8088/browse/CLS-258 поправил EndDtAfterStartDtRule 2023-05-27 13:42:43 +03:00
aalehin
9fa165de2e http://jira.mfd.msk:8088/browse/CLS-316
---
mid swt importer
2023-05-27 13:37:41 +03:00
etreschenkov
56441c39cb fix SDF57Executor and registryBuilder 2023-05-27 13:11:15 +03:00
akulikov
83909eda50 Merge branch 'dev' into cls-301 2023-05-27 13:10:07 +03:00
AKurakin
8ea3397e16 lim-exporter swt-exporter http://jira.mfd.msk:8088/browse/CLS-262 поправил инициализацию kafka 2023-05-27 13:00:06 +03:00
ialbert
7d971cd054 DealRevise SDF56 command to kafka 2023-05-27 12:53:32 +03:00
akulikov
0881e1182b ValidateMemberCompanies, CheckMemberCompanyExist 2023-05-27 12:29:16 +03:00
ialbert
1f42a6badc BalanceRevise session step 0 send command to dbf-exporter SDF-56 2023-05-27 12:25:02 +03:00
ialbert
bd33c77b47 SDF01 removed registry#balance update 2023-05-27 12:17:52 +03:00
ialbert
08d17adb1a Merge remote-tracking branch 'origin/dev' into dev 2023-05-27 11:49:22 +03:00
ialbert
f04b094ac4 SDF01 statement#clearingDate,securityId fix 2023-05-27 11:49:12 +03:00
etreschenkov
b8e563f913 SDF57 processing 2023-05-27 11:46:41 +03:00
ialbert
0dbafe7972 Merge remote-tracking branch 'origin/dev' into dev 2023-05-27 11:32:41 +03:00
ialbert
2c917e0ddf SDF01 company check fix 2023-05-27 11:32:32 +03:00
AKurakin
5144b26a85 backend-api SecurityController отдача всех Security (3 вида) 2023-05-27 11:10:10 +03:00
AKurakin
1e8ae0a47b company-service account-srvice http://jira.mfd.msk:8088/browse/CLS-265 http://jira.mfd.msk:8088/browse/CLS-333 Info-account - доделал правильный инкремент номера счёта 2023-05-27 10:53:12 +03:00
akulikov
53fab62830 rename and new stages for companies request 2023-05-27 10:33:53 +03:00
etreschenkov
64eb0bf654 fix side 2023-05-26 21:47:00 +03:00
AKurakin
75968bba76 company-service account-srvice http://jira.mfd.msk:8088/browse/CLS-265 http://jira.mfd.msk:8088/browse/CLS-333 system new Info-account 2023-05-26 21:33:09 +03:00
etreschenkov
c922351170 fix statementService when we should send command for continue session 2023-05-26 21:17:46 +03:00
ialbert
0379f82276 Merge remote-tracking branch 'origin/dev' into dev 2023-05-26 20:23:55 +03:00
ialbert
b80d21288d registry creation for session registryCapacity 2023-05-26 20:23:45 +03:00
AKurakin
0a339688cd backend-api http://jira.mfd.msk:8088/browse/CLS-331 fix NPE 2023-05-26 19:56:23 +03:00
akulikov
d0409a243e PrepareMemberCompanies stage 2023-05-26 19:48:56 +03:00
ialbert
35e7cd2344 Merge remote-tracking branch 'origin/dev' into dev 2023-05-26 19:44:16 +03:00
ialbert
7ad62a3079 registry builder fix 2023-05-26 19:44:06 +03:00
etreschenkov
9a40d06eb9 define marketcodes for bn session 2023-05-26 19:42:53 +03:00
AKurakin
8546affd94 meta 3.5.0.27 2023-05-26 19:42:26 +03:00
AKurakin
b770d8431f scheduler-service http://jira.mfd.msk:8088/browse/CLS-320 добавил в enum. Там ещё много изменений надо сделать, todo. 2023-05-26 19:34:57 +03:00
AKurakin
a6cf844c74 meta http://jira.mfd.msk:8088/browse/CLS-320 опять обновление. 2023-05-26 19:22:50 +03:00
akulikov
70cb5b3da9 pipeline for FOND and EQUITY complete 2023-05-26 19:18:12 +03:00
ialbert
dce0a6d690 Merge remote-tracking branch 'origin/dev' into dev 2023-05-26 19:16:02 +03:00
ialbert
2b2e04bf84 Execution#side fix, RegistryBuilder TCR search fix 2023-05-26 19:15:45 +03:00
aalehin
ea62e75492 bug fix 2023-05-26 19:04:11 +03:00
ialbert
3af4b9e525 Merge remote-tracking branch 'origin/dev' into dev 2023-05-26 18:57:48 +03:00
ialbert
c0c8bd3056 SDF01 executor statement executed update 2023-05-26 18:57:38 +03:00
etreschenkov
94c2373dc9 fix regex 2023-05-26 18:52:19 +03:00
etreschenkov
2245e1313c fix filling Execution.Market 2023-05-26 18:52:19 +03:00
ialbert
381afbfc29 Merge remote-tracking branch 'origin/dev' into dev 2023-05-26 18:51:26 +03:00
ialbert
2c268d84fa SDF01 executor 2023-05-26 18:51:17 +03:00
AKurakin
afee32f2d5 оправил параметры для отладки sh 2023-05-26 18:14:15 +03:00
AKurakin
3a36df08eb scheduler-service http://jira.mfd.msk:8088/browse/CLS-336 новые Task 2023-05-26 17:19:24 +03:00
etreschenkov
b4a330e713 fix bn session 2023-05-26 17:13:54 +03:00
ialbert
03a8eecf91 Merge remote-tracking branch 'origin/dev' into dev 2023-05-26 16:56:16 +03:00
ialbert
7f542d6736 kafkaSender for backend-api 2023-05-26 16:56:08 +03:00
aalehin
a342c01fd9 bug fix 2023-05-26 16:53:46 +03:00
ialbert
ac39aa5856 Merge remote-tracking branch 'origin/dev' into dev 2023-05-26 16:51:17 +03:00
ialbert
80c2b7a272 controller for sending kafka messages 2023-05-26 16:50:58 +03:00
aalehin
878ec0fcbb sh update 2023-05-26 16:33:30 +03:00
AKurakin
8e9f6143e4 swt-exporter http://jira.mfd.msk:8088/browse/CLS-317 z-distr 2023-05-26 16:32:28 +03:00
etreschenkov
a722c86907 SDF01 processing 2023-05-26 16:16:08 +03:00
AKurakin
6ad105d04a company-service http://jira.mfd.msk:8088/browse/CLS-284 hot fix relation NPE 2023-05-26 16:13:48 +03:00
akulikov
8e390eb272 Merge branch 'dev' into cls-301
# Conflicts:
#	clearing-parent/pom.xml
2023-05-26 16:10:11 +03:00
AKurakin
5df646b6e9 Merge branch 'swt_exporter' into dev
# Conflicts:
#	platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java
2023-05-26 15:17:18 +03:00
AKurakin
5590fffc80 swt-exporter http://jira.mfd.msk:8088/browse/CLS-317 поправил настройку 2023-05-26 15:16:06 +03:00
akulikov
fafa894df8 ValidateIssuerCompanies stage 2023-05-26 15:13:36 +03:00
AKurakin
fb85254c03 swt-exporter http://jira.mfd.msk:8088/browse/CLS-317 z-distr sh 2023-05-26 15:11:12 +03:00
AKurakin
adcb2e7a91 swt-exporter http://jira.mfd.msk:8088/browse/CLS-317 почти готов, но формат файла не понял 2023-05-26 15:00:48 +03:00
akulikov
062f6682c2 fix logs for stages 2023-05-26 14:45:25 +03:00
ialbert
cd802139b0 SDF01 executor 2023-05-26 14:20:19 +03:00
ialbert
fe18b289a3 fixed 'section' field for strades uploading into clearing 2023-05-26 14:15:07 +03:00
ialbert
ec55bd90cb Merge remote-tracking branch 'origin/dev' into dev 2023-05-26 13:01:27 +03:00
ialbert
125c50beb8 ExecutionFond creation 2023-05-26 13:01:19 +03:00
etreschenkov
3e09c017c3 SDF57 processing 2023-05-26 11:40:18 +03:00
akulikov
94ed38e0de Merge branch 'dev' into cls-301 2023-05-26 10:16:01 +03:00
ialbert
c425431f4f Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/SdfExecutorsConfig.java
2023-05-25 21:07:09 +03:00
ialbert
f22dad9a20 Sdf01Executor 2023-05-25 21:05:36 +03:00
etreshenkov
a220b41443 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-25 20:20:40 +03:00
etreshenkov
46a3060ba9 remove stage 8 2023-05-25 20:18:01 +03:00
etreshenkov
61d7570b35 remove stage 8 2023-05-25 20:15:52 +03:00
akulikov
9410af7c15 fix CheckSecurityExist stage 2023-05-25 19:50:43 +03:00
AKurakin
d3a8aaff7a backend-api http://jira.mfd.msk:8088/browse/CLS-331 валидация рексестов, поправил реквесты, добавил тестирвоание и исключение (todo) 2023-05-25 19:39:49 +03:00
AKurakin
ca30893ed2 backend-api http://jira.mfd.msk:8088/browse/CLS-331 валидация рексестов, поправил реквесты, добавил тестирвоание и исключение (todo) 2023-05-25 19:36:52 +03:00
akulikov
4749ae9592 CompaniesRequest (in progress) 2023-05-25 19:23:35 +03:00
aalehin
c1d70b5990 http://jira.mfd.msk:8088/browse/CLS-284
---
bug fix
2023-05-25 19:21:56 +03:00
etreshenkov
389eb7d9fd fix statementService 2023-05-25 18:44:12 +03:00
akulikov
338d8274ab add CompaniesRequest 2023-05-25 18:36:04 +03:00
akulikov
6832899c2a some stages 2023-05-25 18:23:47 +03:00
AKurakin
cec531d04a backend-api http://jira.mfd.msk:8088/browse/CLS-331 валидация рексестов, обновление meta для подключения валидаторов запросов 2023-05-25 18:20:58 +03:00
AKurakin
11b0afdd4a backend-api http://jira.mfd.msk:8088/browse/CLS-331 валидация рексестов, обновление meta для подключения валидаторов запросов 2023-05-25 18:10:13 +03:00
AKurakin
14f7a814aa backend-api http://jira.mfd.msk:8088/browse/CLS-331 валидация запросов (action) по meta.json (обязательность полей)/ 2023-05-25 17:24:55 +03:00
etreshenkov
58b396c849 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-25 17:11:53 +03:00
etreshenkov
d1ae9e05c8 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-25 16:43:33 +03:00
aalehin
d10b79f05e http://jira.mfd.msk:8088/browse/CLS-284
---
Отрефакторил
2023-05-25 16:16:52 +03:00
etreshenkov
e2e8fba2a1 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-25 15:10:52 +03:00
aalehin
d638615c2e http://jira.mfd.msk:8088/browse/CLS-259
---
Добавил обработку удаления информации о контактах
2023-05-25 15:10:08 +03:00
ialbert
a665e8e0d6 Merge remote-tracking branch 'origin/dev' into dev 2023-05-25 14:14:59 +03:00
ialbert
1379882a6a http://jira.mfd.msk:8088/browse/CLS-296 2023-05-25 14:14:52 +03:00
aalehin
20ffcb6c8c http://jira.mfd.msk:8088/browse/CLS-259
---
Добавил обработку удаления информации о контактах
Поправил добавление информации о реквизитах
2023-05-25 13:50:50 +03:00
etreshenkov
81dbf7bf2c http://jira.mfd.msk:8088/browse/CLS-290 2023-05-25 13:13:26 +03:00
akulikov
afd3d948fc Merge branch 'dev' into cls-301 2023-05-25 12:41:06 +03:00
AKurakin
cf2b937cff swt-exporter http://jira.mfd.msk:8088/browse/CLS-317 начало... 2023-05-25 12:10:12 +03:00
ialbert
0597fe9136 IMDGMessageResolver removed stack trace 2023-05-25 11:50:59 +03:00
aalehin
45f51a1b27 http://jira.mfd.msk:8088/browse/CLS-284
---
resolved issues
2023-05-24 20:39:29 +03:00
AKurakin
d3a9c46234 swt-exporter http://jira.mfd.msk:8088/browse/CLS-317 начало 2023-05-24 20:14:00 +03:00
etreschenkov
53e10b7527 SDF57 processing 2023-05-24 19:44:14 +03:00
etreschenkov
b5de68ae1e SDF57 processing 2023-05-24 19:25:45 +03:00
AKurakin
2d7bfae8a0 . 2023-05-24 18:59:12 +03:00
akulikov
b6a48e49d7 . 2023-05-24 18:51:25 +03:00
etreschenkov
be2d9aa234 SDF57 processing 2023-05-24 18:49:18 +03:00
etreschenkov
93f2a6ecc9 SDF57 processing 2023-05-24 18:39:38 +03:00
ialbert
a8e5bcc1ee SDF57 processing 2023-05-24 18:26:25 +03:00
ialbert
8a9cb9f201 Merge remote-tracking branch 'origin/dev' into dev 2023-05-24 18:04:33 +03:00
AKurakin
4aa53c223b securities-service . 2023-05-24 18:02:39 +03:00
ialbert
a32849351f SDF57 processing 2023-05-24 17:50:44 +03:00
AKurakin
f13fba18fd securities-service http://jira.mfd.msk:8088/browse/CLS-258 правки 2023-05-24 17:41:19 +03:00
etreschenkov
dea2954ec3 http://jira.mfd.msk:8088/browse/CLS-290 fix validators 2023-05-24 16:54:39 +03:00
ialbert
d6c951f638 Merge remote-tracking branch 'origin/dev' into dev 2023-05-24 16:54:24 +03:00
ialbert
0bb9990a6e SDF57 processing 2023-05-24 16:54:13 +03:00
etreschenkov
37335728cf http://jira.mfd.msk:8088/browse/CLS-290 fix valadators 2023-05-24 16:53:34 +03:00
AKurakin
fac24548fa backend-api http://jira.mfd.msk:8088/browse/CLS-325 + meta 3.5.0.25 2023-05-24 16:20:49 +03:00
etreschenkov
f9044dcc1c http://jira.mfd.msk:8088/browse/CLS-290 2023-05-24 15:54:06 +03:00
ialbert
3619329137 Merge remote-tracking branch 'origin/dev' into dev 2023-05-24 15:19:18 +03:00
ialbert
0fe495a1a2 B0 session 2023-05-24 15:19:10 +03:00
etreschenkov
f686361534 http://jira.mfd.msk:8088/browse/CLS-313 SDF57 2023-05-24 15:07:46 +03:00
ialbert
d9cc47aadf Merge remote-tracking branch 'origin/dev' into dev 2023-05-24 15:01:57 +03:00
ialbert
4bd05d4fb2 http://jira.mfd.msk:8088/browse/CLS-290 1st step DealsPrepare conditions added 2023-05-24 15:01:49 +03:00
AKurakin
ddda96e150 lim-exporter http://jira.mfd.msk:8088/browse/CLS-262 fix send notification 2023-05-24 14:54:14 +03:00
ialbert
f52cc62e08 Merge remote-tracking branch 'origin/dev' into dev 2023-05-24 14:04:08 +03:00
ialbert
01c3a8d1f7 DealsPrepare bugfix 2023-05-24 14:03:58 +03:00
AKurakin
25dc117c52 account-service AccountValidationConfig поправил, см. ТЗ X - Блокировка корреспондентского счета (2) 2023-05-24 14:03:34 +03:00
ialbert
3e6f6121c4 Merge remote-tracking branch 'origin/dev' into dev 2023-05-24 13:52:21 +03:00
ialbert
bfcd79ab31 prototype scope for session stages 2023-05-24 13:52:13 +03:00
etreschenkov
0daaea522e copye tests 2023-05-24 13:49:26 +03:00
AKurakin
412d15ec3a account-service AccountValidationConfig поправил, см. ТЗ X - Блокировка корреспондентского счета 2023-05-24 13:49:11 +03:00
etreschenkov
699587c8d4 refactoring SDF*executors 2023-05-24 13:41:33 +03:00
AKurakin
d3069db920 account-service http://jira.mfd.msk:8088/browse/CLS-272 исправления ClientCode, TradingClearingRegistry 2023-05-24 13:32:31 +03:00
etreschenkov
0d01940b42 delete SDF01,SDF57 executors from balance-service 2023-05-24 13:32:21 +03:00
etreschenkov
4bcf820019 copy SDF*executors to clearing-service 2023-05-24 13:27:52 +03:00
ialbert
3dcb785ebb http://jira.mfd.msk:8088/browse/CLS-290 2023-05-24 13:15:29 +03:00
akulikov
0e4b425645 Merge branch 'dev' into cls-301 2023-05-24 13:00:04 +03:00
etreschenkov
28d7176a5c delete sdf12 from importer 2023-05-24 12:43:46 +03:00
etreschenkov
73c8cce9c2 create SDF56 by BalanceRevise 2023-05-24 12:42:39 +03:00
etreschenkov
cd863f209a exporter 2023-05-24 12:42:39 +03:00
ialbert
0d0157fef2 Merge remote-tracking branch 'origin/dev' into dev 2023-05-24 12:02:20 +03:00
ialbert
e34d015c47 перенес Registry SQL builder 2023-05-24 12:02:07 +03:00
AKurakin
150945dbb1 account-service равка, логи. 2023-05-24 11:59:06 +03:00
etreschenkov
8b2c7c120d Revert "create sdf56 by task GALB" 2023-05-24 11:54:43 +03:00
etreschenkov
4478644316 some refactoring 2023-05-24 11:54:29 +03:00
etreschenkov
2e90eb7ca2 some refactoring 2023-05-24 11:49:25 +03:00
etreschenkov
05abf6b132 create sdf56 by task GALB 2023-05-24 11:23:42 +03:00
etreschenkov
d8db3048c1 create sdf56 by task GALB 2023-05-24 11:17:28 +03:00
AKurakin
af54945fde lim-exporter CLS-262 поправил тесты 2023-05-24 10:53:28 +03:00
ialbert
ec619899f6 Merge remote-tracking branch 'origin/dev' into dev 2023-05-23 21:49:12 +03:00
ialbert
3f8b8b8909 http://jira.mfd.msk:8088/browse/CLS-303 2023-05-23 21:48:59 +03:00
akulikov
8a6ae8dcda . 2023-05-23 19:10:47 +03:00
AKurakin
67a1bcede0 lim-exporter CLS-262 поправил условие выборки 2023-05-23 19:01:57 +03:00
AKurakin
eda01f2a15 account-service ClearingAccountService bug fix init() 2023-05-23 18:56:43 +03:00
AKurakin
3b33a57218 platform-messaging QueueConsumer уточнил stacktrace в логе при вызове Init. 2023-05-23 18:56:17 +03:00
AKurakin
c2f463a1a7 account-service поправил валидатор AccountValidationConfig. Попробовал починить юнит-тесты, но неудачно. 2023-05-23 18:33:58 +03:00
ialbert
4bbd7d09c1 http://jira.mfd.msk:8088/browse/CLS-290 SDF56_PROCESS -> REVISE_PROCESS 2023-05-23 18:14:00 +03:00
etreshenkov
41cdca1e3b http://jira.mfd.msk:8088/browse/CLS-314 sdf57 and sdf51 2023-05-23 18:05:38 +03:00
ialbert
32bcede266 http://jira.mfd.msk:8088/browse/CLS-290 removed consumer from PrimaryAuctionBnSession.java 2023-05-23 18:00:55 +03:00
ialbert
10c0d8790c http://jira.mfd.msk:8088/browse/CLS-290 2023-05-23 17:53:31 +03:00
ialbert
62da31b484 Merge remote-tracking branch 'origin/dev' into dev 2023-05-23 17:46:06 +03:00
ialbert
053a347e12 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-23 17:45:57 +03:00
aalehin
67b435889e http://jira.mfd.msk:8088/browse/CLS-280
---
Refactored + added logs
2023-05-23 15:47:29 +03:00
etreshenkov
2b2d178850 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-23 15:22:40 +03:00
etreshenkov
7d28912120 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-23 15:17:47 +03:00
etreshenkov
be35cf9c5f http://jira.mfd.msk:8088/browse/CLS-290 2023-05-23 14:58:23 +03:00
etreshenkov
9f62b4fa76 http://jira.mfd.msk:8088/browse/CLS-313 SDF-57 2023-05-23 14:57:51 +03:00
AKurakin
aef5753a41 backend-api http://jira.mfd.msk:8088/browse/CLS-257 MoneyMarketSecurity убрал фильтр по workflowStatus 2023-05-23 14:55:08 +03:00
ialbert
c537509c48 Merge remote-tracking branch 'origin/dev' into dev 2023-05-23 14:44:05 +03:00
ialbert
936e4613d8 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-23 14:43:43 +03:00
AKurakin
7bdfda5b19 backend-api http://jira.mfd.msk:8088/browse/CLS-273 актуализация tradingClearingRegistry 2023-05-23 14:38:22 +03:00
AKurakin
fa8cfe268d http://jira.mfd.msk:8088/browse/CLS-267 enum для launcher/post 2023-05-23 14:04:27 +03:00
AKurakin
fc5d14db85 lim-exporter http://jira.mfd.msk:8088/browse/CLS-262 sFTP улучшил надёжность удаления временных файлов 2023-05-23 13:21:36 +03:00
etreshenkov
522f4f955d http://jira.mfd.msk:8088/browse/CLS-290 2023-05-23 13:20:31 +03:00
etreshenkov
45a47dd76d http://jira.mfd.msk:8088/browse/CLS-313 SDF-57 2023-05-23 13:06:16 +03:00
AKurakin
fa98b9f7af clearing-service http://jira.mfd.msk:8088/browse/CLS-290 stage 10 2023-05-23 12:25:12 +03:00
etreshenkov
a26978764b http://jira.mfd.msk:8088/browse/CLS-280 2023-05-23 12:00:25 +03:00
AKurakin
5c93f133dd trade-importer http://jira.mfd.msk:8088/browse/CLS-276 поправил копирование объекта 2023-05-23 11:58:48 +03:00
aalehin
63b1babed9 http://jira.mfd.msk:8088/browse/CLS-280
---
DepoPaymentInstructionRegisterService refactored, but there are a lot of question that should be sorted out
2023-05-23 11:29:30 +03:00
aalehin
df4cecf59e http://jira.mfd.msk:8088/browse/CLS-280
---
CoveredLiabilitiesRegisterService refactored
2023-05-23 11:09:16 +03:00
aalehin
ee8ef5c24c http://jira.mfd.msk:8088/browse/CLS-280
---
AdmittedLiabilitiesRegisterService
CoveredLiabilitiesRegisterService
DepoBalanceRegisterService
ExcludeLiabilitiesRegisterService
refactored work with imdg and added some logs
2023-05-23 01:35:38 +03:00
ialbert
7918f78761 Merge remote-tracking branch 'origin/dev' into dev 2023-05-22 20:11:04 +03:00
ialbert
d39797a52b http://jira.mfd.msk:8088/browse/CLS-290 2023-05-22 20:10:49 +03:00
AKurakin
fd2b54d44b backend-api meta 4 обновление API 2 2023-05-22 19:31:59 +03:00
ialbert
bea0c96d64 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-22 17:48:27 +03:00
aalehin
91b7b99f86 http://jira.mfd.msk:8088/browse/CLS-280
---
registry service update
2023-05-22 16:51:07 +03:00
AKurakin
343497b556 clearing-service http://jira.mfd.msk:8088/browse/CLS-290 stage 10/11 мелочи 2023-05-22 13:35:42 +03:00
ialbert
627533f66c Merge remote-tracking branch 'origin/dev' into dev 2023-05-22 12:51:05 +03:00
ialbert
0eadc49ab6 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-22 12:50:56 +03:00
AKurakin
dbec4604f9 clearing-service http://jira.mfd.msk:8088/browse/CLS-290 stage 11 2023-05-22 12:34:51 +03:00
ialbert
bcbae31783 Merge remote-tracking branch 'origin/dev' into dev 2023-05-22 10:15:19 +03:00
ialbert
00a02ed7d2 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-22 10:15:10 +03:00
psemenkov
363c4e4e88 Merge remote-tracking branch 'origin/dev' into dev 2023-05-19 19:41:16 +03:00
psemenkov
2a8bda41e9 http://jira.mfd.msk:8088/browse/CLS-268
Исправил создание plannerAllToday если тек.день=ПН-ПТ и не задан clearingCalendar (т.е. нет записи).
2023-05-19 19:41:05 +03:00
AKurakin
8c30280c1e backend-api meta 4 обновление API. 2023-05-19 19:35:10 +03:00
ialbert
db14e0f8e8 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-19 19:26:14 +03:00
ialbert
697017a8e8 Merge remote-tracking branch 'origin/dev' into dev 2023-05-19 19:23:57 +03:00
ialbert
6bdfb36c52 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-19 19:23:50 +03:00
AKurakin
b80431f22e clearing-service CLS-290 рефакторинг stage 6, 8 2023-05-19 19:05:19 +03:00
psemenkov
8755f3e1ca http://jira.mfd.msk:8088/browse/CLS-313
Исправил ошибки.
2023-05-19 18:35:26 +03:00
AKurakin
f7b129bf24 dbf-exporter http://jira.mfd.msk:8088/browse/CLS-313ил логов и детализацию ошибок парсинга файлов 2023-05-19 18:26:31 +03:00
psemenkov
4b8c8fc2bb Merge remote-tracking branch 'origin/dev' into dev 2023-05-19 16:09:13 +03:00
psemenkov
181291c42e http://jira.mfd.msk:8088/browse/CLS-313
Поправил ошибки, добавил отправку по sFTP.
2023-05-19 16:08:23 +03:00
akulikov
de42098a8e todo for FieldRequiredRule 2023-05-19 13:02:30 +03:00
AKurakin
8e5421900e backend-api meta java generator - генерация сырого кода java для упрощения программирования 2023-05-18 18:52:12 +03:00
akulikov
e220d147bb fix report tests 2023-05-18 18:12:21 +03:00
etreshenkov
df63b37e3c http://jira.mfd.msk:8088/browse/CLS-290 stage 7 2023-05-18 17:49:14 +03:00
etreshenkov
715328e4c9 http://jira.mfd.msk:8088/browse/CLS-290 stage 7 2023-05-18 17:46:28 +03:00
etreshenkov
0d296dac74 add RegistryCodeSqlBuilder 2023-05-18 15:17:08 +03:00
ialbert
0d9ae577df Merge remote-tracking branch 'origin/dev' into dev 2023-05-18 14:58:21 +03:00
ialbert
02e927ab1b http://jira.mfd.msk:8088/browse/CLS-290 2023-05-18 14:58:11 +03:00
AKurakin
312c7c6294 clearing-service http://jira.mfd.msk:8088/browse/CLS-290 обработчик для stage 8 2023-05-18 14:53:56 +03:00
ialbert
c8725ae10f Merge remote-tracking branch 'origin/dev' into dev 2023-05-18 13:47:31 +03:00
ialbert
c7fefd481c http://jira.mfd.msk:8088/browse/CLS-290 2023-05-18 13:47:13 +03:00
psemenkov
2b038a3b04 http://jira.mfd.msk:8088/browse/CLS-313
Привел модуль в соответствие с новым ТЗ.
2023-05-18 12:22:09 +03:00
akulikov
bf5785d0d3 fix report tests 2023-05-18 11:46:37 +03:00
akulikov
8d67330505 Merge remote-tracking branch 'origin/cls-283' into dev
# Conflicts:
#	clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionDeposit.java
#	clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/execution/ExecutionFond.java
2023-05-18 11:02:58 +03:00
akulikov
90b8d80ce8 fix after review 2023-05-17 19:50:20 +03:00
AKurakin
e45b073290 clearing-service http://jira.mfd.msk:8088/browse/CLS-290 обработчик для шага 6 refactoring 2023-05-17 19:47:24 +03:00
etreschenkov
d0a74989a4 http://jira.mfd.msk:8088/browse/CLS-290 stage 5 2023-05-17 18:36:31 +03:00
ialbert
ea4ef2f09c Merge remote-tracking branch 'origin/dev' into dev 2023-05-17 18:20:41 +03:00
ialbert
967877537d http://jira.mfd.msk:8088/browse/CLS-290 2023-05-17 18:19:57 +03:00
AKurakin
35a7a41091 clearing-service http://jira.mfd.msk:8088/browse/CLS-290 обработчик для шага 6 2023-05-17 17:51:05 +03:00
akulikov
15abb8cbfa tests done 2023-05-17 16:54:57 +03:00
AKurakin
4e37cf7757 http://jira.mfd.msk:8088/browse/CLS-293 DDL meta 4.2 2023-05-17 14:45:43 +03:00
etreschenkov
6fdfcb041f http://jira.mfd.msk:8088/browse/CLS-290 stage 4 2023-05-17 12:05:26 +03:00
akulikov
94ab971af1 some fixes and tests 2023-05-16 21:26:24 +03:00
ialbert
fe79868712 Merge remote-tracking branch 'origin/dev' into dev 2023-05-16 19:19:02 +03:00
ialbert
fc82c9817c http://jira.mfd.msk:8088/browse/CLS-290 2023-05-16 19:15:30 +03:00
AKurakin
e90e577f53 company-service поправлен CompanySymbolValidationConfig (наверное в ветке уже было исправлено, но это dev) 2023-05-16 19:09:27 +03:00
psemenkov
71d8454ad4 Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	clearing-parent/account-service/src/test/java/ru/spcex/clearing/account/service/ClientCodeServiceTest.java
2023-05-16 18:17:06 +03:00
psemenkov
4790494d62 Добавил поддержку нового функционала KafkaSender в тестовый модуль. Поправил тестовый модуль и тесты. 2023-05-16 18:10:11 +03:00
AKurakin
754df8edad company-service/account-service http://jira.mfd.msk:8088/browse/CLS-272 рефакторинг: перенёс ClientCodeService. 2023-05-16 18:05:58 +03:00
ialbert
c1519a2d7a http://jira.mfd.msk:8088/browse/CLS-290 2023-05-16 15:29:51 +03:00
ialbert
f80c10ef04 Merge remote-tracking branch 'origin/dev' into dev 2023-05-16 15:28:32 +03:00
ialbert
64a28bc5a5 http://jira.mfd.msk:8088/browse/CLS-290 2023-05-16 15:28:23 +03:00
AKurakin
3172be7554 . 2023-05-16 14:54:24 +03:00
AKurakin
11c1e705f0 Merge branch 'aalehin' into dev
# Conflicts:
#	clearing-parent/backend-api/src/main/resources/meta/meta.xml
#	clearing-parent/backend-api/src/test/resources/meta.json
#	clearing-parent/registry-service/src/test/java/ru/spcex/clearing/registry/service/ContractRegisterServiceTest.java
#	platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java
#	platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/LiabilitiesRegisterNewRequest.java
2023-05-16 14:43:53 +03:00
AKurakin
f4573b3dc5 backend-api http://jira.mfd.msk:8088/browse/CLS-282 добавил юнит тест, поправил мету под регистры 2023-05-16 14:17:08 +03:00
ialbert
5ba662b11a Merge branch 'dev' into CLS-277-execution-deposit 2023-05-16 13:42:44 +03:00
ialbert
a7e2929cdb http://jira.mfd.msk:8088/browse/CLS-290 2023-05-16 13:41:36 +03:00
aalehin
c002f39111 http://jira.mfd.msk:8088/browse/CLS-282
---
get requests done
2023-05-16 12:00:24 +03:00
AKurakin
3fdc6b1dbc backend-api http://jira.mfd.msk:8088/browse/CLS-309 2023-05-15 19:53:47 +03:00
akulikov
47fbbabb1b report create methods 2023-05-15 18:33:18 +03:00
akulikov
c76aee2428 report requests validators 2023-05-15 18:06:02 +03:00
akulikov
a2873620a3 report requests 2023-05-15 17:21:59 +03:00
akulikov
0e58782a4c deprecate old reports 2023-05-15 17:10:08 +03:00
akulikov
b59597bc7b fixes 2023-05-15 16:20:22 +03:00
akulikov
1551ad04c8 Merge branch 'dev' into cls-283
# Conflicts:
#	clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/bt/bt_17_4/ReportBR_0420314_P2_Collector.java
#	platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Market.java
2023-05-15 15:59:11 +03:00
psemenkov
4bff19f9ba http://jira.mfd.msk:8088/browse/CLS-276
Поправил настройки подключения к БД и отправку в кафку.
2023-05-15 15:58:00 +03:00
akulikov
4d9185088a Period*ReportBuilder 2023-05-15 15:27:13 +03:00
akulikov
8d7c725a06 Period*ReportBuilder 2023-05-15 15:11:34 +03:00
AKurakin
0dd8b6840c backend-api http://jira.mfd.msk:8088/browse/CLS-306 2023-05-15 12:07:30 +03:00
ialbert
6c23cbca36 http://jira.mfd.msk:8088/browse/CLS-290 добавил Spring KafkaTemplate 2023-05-15 12:04:05 +03:00
akulikov
75e8a83aad SummaryLiabilitiesClaimsReportBuilder
SummaryMoneyChangeReportBuilder
2023-05-15 11:37:27 +03:00
AKurakin
ce84c28297 z-distr для себя, сmd скрипт 2023-05-12 19:35:57 +03:00
AKurakin
f05e93e14e platform-messaging поправил возврат текста ошибки валидаций в очередь "request-info-update" 2023-05-12 18:38:01 +03:00
akulikov
c3a1cc41de ExecutedDealReport, OperationalLiabilitiesClaimsReport, OperationalMoneyChangeReport, UnfulfilledDealReport 2023-05-12 18:09:54 +03:00
psemenkov
5021443bb1 Merge remote-tracking branch 'origin/dev' into dev 2023-05-12 18:09:05 +03:00
psemenkov
aa15b344b1 http://jira.mfd.msk:8088/browse/CLS-276
Дбавил обработку полей создания записи STrades и ее апдейта.
2023-05-12 18:08:57 +03:00
etreschenkov
ee65d129f6 http://jira.mfd.msk:8088/browse/CLS-302 2023-05-12 17:45:49 +03:00
etreschenkov
0147b88ba8 http://jira.mfd.msk:8088/browse/CLS-302 2023-05-12 17:45:49 +03:00
psemenkov
183babf1c2 http://jira.mfd.msk:8088/browse/CLS-268
Привел модуль в соответствие с ТЗ.
2023-05-12 17:43:51 +03:00
AKurakin
f74937ab8e backend-api поправил тесты 2023-05-12 15:49:18 +03:00
AKurakin
276252b2a1 backend-api зачистка классов 2023-05-12 15:41:58 +03:00
AKurakin
97da625d64 backend-api http://jira.mfd.msk:8088/browse/CLS-257 http://jira.mfd.msk:8088/browse/CLS-256 сверка с метой. 2023-05-12 15:25:03 +03:00
AKurakin
9db47584ec account-service потребовалась отдельная очередь в company-service DESTINATION_TRADING_CLEARING_REGISTRY_REPLY. Потомучто стандартная "request-info-update" иногда содержит объекты с другими полями. 2023-05-12 15:06:13 +03:00
AKurakin
44b8455ea6 company-service изменил ожидаемую очередь, изменил валидацию для обновления заблокированной компании. 2023-05-12 14:38:24 +03:00
psemenkov
32b63823fc http://jira.mfd.msk:8088/browse/CLS-262
Исправил ошибки.
2023-05-12 14:02:43 +03:00
psemenkov
ceb52616b0 http://jira.mfd.msk:8088/browse/CLS-262
Исправил ошибки.
2023-05-12 13:06:12 +03:00
psemenkov
008a3dbf36 Merge remote-tracking branch 'origin/dev' into dev 2023-05-12 12:42:16 +03:00
AKurakin
39b476b917 http://jira.mfd.msk:8088/browse/CLS-293 meta 4: доделал опечатку в TradingClearingRegistry 2023-05-12 12:23:25 +03:00
AKurakin
e13968a148 backend-api мелкий рефакторинг 4 2023-05-12 12:21:47 +03:00
psemenkov
d5c929f2a4 http://jira.mfd.msk:8088/browse/CLS-262
Добавил .sh, сделал алгоритмы выгрузки и тесты.
2023-05-12 11:34:54 +03:00
AKurakin
ee79336ce4 backend-api мелкий рефакторинг 3.1 2023-05-12 11:00:20 +03:00
AKurakin
4968bce3a5 backend-api мелкий рефакторинг 3 2023-05-12 10:53:23 +03:00
AKurakin
41faf64289 http://jira.mfd.msk:8088/browse/CLS-293 meta 4: чуть чуть дообновил DATA 2023-05-11 19:15:51 +03:00
AKurakin
a28cf54bbd backend-api мелкий рефакторинг 2 2023-05-11 19:07:58 +03:00
AKurakin
c46f4ebf07 backend-api мелкий рефакторинг 2023-05-11 18:30:24 +03:00
AKurakin
7a858cf422 Merge branch 'meta_4' into dev 2023-05-11 17:33:11 +03:00
AKurakin
d6e31a84e5 http://jira.mfd.msk:8088/browse/CLS-293 meta 4: и тут обновили мету 4 немного. Теперь уж точно доделал. 2023-05-11 17:06:30 +03:00
AKurakin
f2756ac0e5 http://jira.mfd.msk:8088/browse/CLS-293 meta 4: доделал тесты. Всё готово, но не тут то было... 2023-05-11 15:08:35 +03:00
akulikov
6c78081607 extract abstract class ExecutionCommon 2023-05-11 14:51:35 +03:00
aalehin
680d572385 fix up with meta based classes 2023-05-11 14:37:17 +03:00
AKurakin
457f051588 http://jira.mfd.msk:8088/browse/CLS-293 meta 4: правка кода, чтобы компилировалось. 2023-05-11 14:31:24 +03:00
AKurakin
c752efceec http://jira.mfd.msk:8088/browse/CLS-293 meta 4: доделал классы (не компилируется) 2023-05-11 14:20:11 +03:00
aalehin
59bfa7124e Merge branch 'meta_4' of http://git.mfd.msk/mfd/clearing into aalehin
 Conflicts:
	clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/register/AdmittedLiabilitiesRegister.java
	clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/register/CoveredLiabilitiesRegister.java
	clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/register/DepoBalanceRegister.java
	clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/register/DepoPaymentInstructionRegister.java
	clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/register/ExcludeLiabilitiesRegister.java
	clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/register/ExecutionRegister.java
	clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/register/LiabilitiesRegister.java
	clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/register/MoneyBalanceRegister.java
	clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/register/MoneyPaymentInstructionRegister.java
	platform-parent/platform-imdg-api/src/main/java/ru/spcex/clearing/imdg/IMDGDistributedNames.java
	platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/registry/MoneyPaymentInstructionRegisterNewRequest.java
2023-05-11 13:58:44 +03:00
akulikov
0022cb6b22 cls-283 base service 2023-05-11 13:57:29 +03:00
psemenkov
39167a2e8e Merge remote-tracking branch 'origin/CLS-262' into dev 2023-05-11 13:51:13 +03:00
psemenkov
b214aa8415 Merge remote-tracking branch 'origin/dev' into CLS-262 2023-05-11 13:50:12 +03:00
psemenkov
9bba734885 http://jira.mfd.msk:8088/browse/CLS-262
Добавил не полную логику формирования строк файлов (необходимо изменение ТЗ).
2023-05-11 13:49:48 +03:00
ialbert
8eb1b69902 http://jira.mfd.msk:8088/browse/CLS-277 2023-05-11 12:48:34 +03:00
ialbert
837485e96e Merge branch 'dev' into CLS-277-execution-deposit
# Conflicts:
#	platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/QueueConsumer.java
2023-05-11 12:23:28 +03:00
ialbert
3931d453da http://jira.mfd.msk:8088/browse/CLS-290 Добавил CORRELATION_ID header в сообщения кафки, для использования Spring ReplyingKafkaTemplate 2023-05-11 12:18:48 +03:00
akulikov
eed1e94f07 classes for cls-283 2023-05-10 19:58:18 +03:00
AKurakin
c427338121 http://jira.mfd.msk:8088/browse/CLS-293 meta 4: добавил регистры 2023-05-10 19:52:08 +03:00
AKurakin
61ed69c676 http://jira.mfd.msk:8088/browse/CLS-293 meta 4: добавил новые словари 2023-05-10 19:21:30 +03:00
AKurakin
d9fa17b0c7 http://jira.mfd.msk:8088/browse/CLS-293 meta 4: зачистка удаляемых объектов 2023-05-10 18:48:16 +03:00
AKurakin
d0d59ba582 http://jira.mfd.msk:8088/browse/CLS-293 DDL и обновление meta 4 2023-05-10 18:41:55 +03:00
aalehin
c6f0abfea3 http://jira.mfd.msk:8088/browse/CLS-280
---
registry service done
2023-05-10 18:13:44 +03:00
akulikov
907d76ed24 Merge branch 'cls-271' into dev 2023-05-10 16:10:05 +03:00
akulikov
833e7b670d http://jira.mfd.msk:8088/browse/CLS-271 2023-05-10 15:48:54 +03:00
psemenkov
d023d289b0 http://jira.mfd.msk:8088/browse/CLS-268
Поправил валидацию.
2023-05-10 15:34:51 +03:00
psemenkov
518f5b774d Merge remote-tracking branch 'origin/dev' into dev 2023-05-10 15:03:55 +03:00
psemenkov
05e879112a http://jira.mfd.msk:8088/browse/CLS-268
Поправил валидацию.
2023-05-10 15:03:40 +03:00
AKurakin
795075a4b6 RequestHelper перенёс в clearing-validation 2023-05-10 13:33:54 +03:00
akulikov
70e73b68ae fix after review 2023-05-10 13:23:38 +03:00
psemenkov
9d7bb36da8 http://jira.mfd.msk:8088/browse/CLS-268
.
2023-05-10 12:51:38 +03:00
AKurakin
a607262412 http://jira.mfd.msk:8088/browse/CLS-284 поправил тесты 2023-05-10 12:27:17 +03:00
AKurakin
f001e551af Merge branch 'CLS-284' into dev 2023-05-10 12:19:22 +03:00
AKurakin
a4d1a618cb RequestHelper т.к. обычно ответ сразу возвращается - добавил запись текста ответа в лог info 2023-05-10 12:17:20 +03:00
AKurakin
84870fb64f company-service http://jira.mfd.msk:8088/browse/CLS-284 доделал. 2023-05-10 12:16:41 +03:00
akulikov
18b8e6d81f repackage old reports 2023-05-10 11:45:28 +03:00
psemenkov
3d56c0fc63 http://jira.mfd.msk:8088/browse/CLS-268
Поправил ошибку запуска.
2023-05-09 21:32:01 +03:00
psemenkov
ba59d1cc80 http://jira.mfd.msk:8088/browse/CLS-276
Добавил поле в запрос.
2023-05-09 20:32:06 +03:00
AKurakin
a37fea5061 company-service http://jira.mfd.msk:8088/browse/CLS-284 доделал кроме странной логики валидации 2023-05-05 20:17:35 +03:00
akulikov
8d893d74ca http://jira.mfd.msk:8088/browse/CLS-265 auto request for TCR new 2023-05-05 18:36:14 +03:00
akulikov
65c235c01c http://jira.mfd.msk:8088/browse/CLS-265 auto request for TCR new 2023-05-05 18:28:32 +03:00
akulikov
654943ec36 http://jira.mfd.msk:8088/browse/CLS-271 2023-05-05 18:19:32 +03:00
psemenkov
e657e609bd Merge remote-tracking branch 'origin/dev' into dev 2023-05-05 15:40:39 +03:00
AKurakin
8238757ca8 meta http://jira.mfd.msk:8088/browse/CLS-293 обновил DATA 2023-05-05 15:33:46 +03:00
psemenkov
c5b80bd3c9 http://jira.mfd.msk:8088/browse/CLS-276
Добавил поле в запрос.
2023-05-05 15:21:22 +03:00
akulikov
f5e2886ad6 http://jira.mfd.msk:8088/browse/CLS-271 TradingClearingRegistryService, fix for informationAccount 2023-05-05 15:13:43 +03:00
psemenkov
05285cb12a Merge remote-tracking branch 'origin/dev' into CLS-262
# Conflicts:
#	clearing-parent/pom.xml
2023-05-05 14:39:57 +03:00
psemenkov
e1b9076cd1 http://jira.mfd.msk:8088/browse/CLS-262
Добавил sFTP сервис.
2023-05-05 14:39:11 +03:00
AKurakin
2829e50e7e company-service http://jira.mfd.msk:8088/browse/CLS-284 начало (доделать!) 2023-05-05 14:36:33 +03:00
AKurakin
5938786f84 backend-api поправил поля в CompanyInfo 2023-05-05 14:30:08 +03:00
akulikov
3195081661 http://jira.mfd.msk:8088/browse/CLS-271 TradingClearingRegistryServiceTest 2023-05-05 13:59:43 +03:00
AKurakin
1b98981c9f company-service http://jira.mfd.msk:8088/browse/CLS-259 исправления 2023-05-05 12:48:07 +03:00
AKurakin
cdd6a0996f QueueConsumer улучшил логирование ошибок. IMDGMessageResolver добавил надёжности при ошибках форматирования ошибок. 2023-05-05 11:57:49 +03:00
akulikov
9d1a378447 http://jira.mfd.msk:8088/browse/CLS-271 TradingClearingRegistryService 2023-05-05 10:45:01 +03:00
akulikov
71203b08e7 http://jira.mfd.msk:8088/browse/CLS-271 fix statuses 2023-05-05 09:58:01 +03:00
AKurakin
a83f4f348f backend-api http://jira.mfd.msk:8088/browse/CLS-273 поправил swagger/json аннотации 2023-05-04 19:06:39 +03:00
AKurakin
b6eb7a9d71 company-service http://jira.mfd.msk:8088/browse/CLS-272 доделал коммент к таску 27/апр/23 16:24 2023-05-04 17:10:55 +03:00
AKurakin
864bbcf125 company-service http://jira.mfd.msk:8088/browse/CLS-272 исправил использование BiDirectionQueueExchanger 2023-05-04 16:29:52 +03:00
AKurakin
f1a803aacf merge ветку http://jira.mfd.msk:8088/browse/CLS-272 2023-05-04 16:17:21 +03:00
AKurakin
3ec2177641 http://jira.mfd.msk:8088/browse/CLS-272 доделал тесты (не стабильно работают) 2023-05-04 16:16:13 +03:00
ialbert
c8d45cc872 Merge branch 'dev' into CLS-277-execution-deposit 2023-05-04 13:30:49 +03:00
psemenkov
f53d05ba6c http://jira.mfd.msk:8088/browse/CLS-276
Поправил отправку сообщений.
2023-05-04 13:22:38 +03:00
psemenkov
2a6d4e38b9 http://jira.mfd.msk:8088/browse/CLS-262
Создал новый модуль.
2023-05-04 13:18:41 +03:00
ialbert
be93eb1ded http://jira.mfd.msk:8088/browse/CLS-278 2023-05-04 12:37:47 +03:00
akulikov
b60f046a8c Merge branch 'dev' into cls-271
# Conflicts:
#	platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java
2023-05-04 12:03:41 +03:00
AKurakin
e95b816f54 backend-api http://jira.mfd.msk:8088/browse/CLS-288 2023-05-03 20:08:18 +03:00
AKurakin
819a1afd22 http://git.mfd.msk/mfd/clearing/-/issues/10 IMessageResolver + IMDG 2023-05-03 20:07:56 +03:00
AKurakin
29b47b8b96 QueueConsumer защита от переполнения спамом логов 2023-05-03 19:02:00 +03:00
ialbert
ac3e325269 http://jira.mfd.msk:8088/browse/CLS-277 cleanup 2023-05-03 18:27:18 +03:00
ialbert
cd8118dad5 http://jira.mfd.msk:8088/browse/CLS-277 2023-05-03 18:23:36 +03:00
ialbert
246dc403af http://jira.mfd.msk:8088/browse/CLS-277 2023-05-03 18:23:36 +03:00
akulikov
2ad812d603 Merge branch 'cls-265' into dev
# Conflicts:
#	platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java
2023-05-03 17:55:45 +03:00
akulikov
8ff70f65cf http://jira.mfd.msk:8088/browse/CLS-265 fix after review 2023-05-03 17:54:27 +03:00
akulikov
93d707961c TradingClearingRegistryService in progress 2023-05-03 17:47:19 +03:00
ialbert
ed47b5291b http://jira.mfd.msk:8088/browse/CLS-277 2023-05-03 17:29:23 +03:00
akulikov
342db96a1e fixes EnumPresentRule 2023-05-03 16:30:19 +03:00
AKurakin
d901d9fca7 trade-importer http://jira.mfd.msk:8088/browse/CLS-276 добавил в z_distr, скрипты 2023-05-03 15:54:29 +03:00
AKurakin
bf8454062e validateRoleAndGetResult изменил
log info
2023-05-03 15:11:35 +03:00
akulikov
d2a48a22cf Merge branch 'cls-265' into cls-271
# Conflicts:
#	platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java
2023-05-03 15:10:20 +03:00
AKurakin
bca9879cc9 company-service убрал проверки по enum, оставил по dictionary 2023-05-03 15:04:44 +03:00
AKurakin
795b488629 http://jira.mfd.msk:8088/browse/CLS-272 поправил ошибки 2023-05-03 13:58:35 +03:00
psemenkov
8beb210e32 Merge remote-tracking branch 'origin/dev' into CLS-276 2023-05-03 12:27:50 +03:00
psemenkov
948b8187bc http://jira.mfd.msk:8088/browse/CLS-276
Поправил лог.
2023-05-03 12:22:01 +03:00
psemenkov
2f2835cc91 http://jira.mfd.msk:8088/browse/CLS-276
Поправил вывод в лог и чтение из БД.
2023-05-03 11:18:55 +03:00
psemenkov
bb396b71d5 http://jira.mfd.msk:8088/browse/CLS-276
Небольшие изменения.
2023-05-02 16:44:22 +03:00
akulikov
804b659227 depoAccountNew test 2023-05-02 16:41:39 +03:00
akulikov
2fc7c7e180 clearingAccountUpdate test 2023-05-02 16:19:51 +03:00
akulikov
09b65585c4 clearingAccountNew test 2023-05-02 16:00:39 +03:00
psemenkov
b5592ad393 http://jira.mfd.msk:8088/browse/CLS-276
Оптимизация кода.
2023-05-02 15:42:52 +03:00
akulikov
a42f767698 DepoAccountNewRequest, new depo account 2023-05-02 15:16:12 +03:00
AKurakin
74238e1f23 http://jira.mfd.msk:8088/browse/CLS-267 поправил значения в TASK_DICTIONARY 2023-05-02 14:17:17 +03:00
akulikov
32d95c175f ClearingAccountUpdateRequest, update clearing account, fix some names 2023-05-02 12:53:40 +03:00
psemenkov
7e4f7788e6 Поправил имена классов, добавил вызов destroyMethod в конфигурации БД. 2023-05-02 10:55:31 +03:00
psemenkov
84e737083f http://jira.mfd.msk:8088/browse/CLS-276
Добавил загрузку sTrades из Торговой системы.
2023-05-02 10:53:17 +03:00
AKurakin
0d35f74b1c http://jira.mfd.msk:8088/browse/CLS-288 fix API endpoint 2023-04-28 19:54:33 +03:00
AKurakin
a87f2ac0dc http://jira.mfd.msk:8088/browse/CLS-272 поправил ошибки, добавил юниттест (пока не проходит) 2023-04-28 19:50:30 +03:00
akulikov
441546dd18 ClearingAccount in progress 2023-04-28 18:23:29 +03:00
akulikov
5cefa961b1 Merge branch 'dev' into cls-265 2023-04-28 16:31:36 +03:00
akulikov
2dc844ba3f add create info account, fix from TT, deprecate some methods 2023-04-28 16:31:24 +03:00
AKurakin
f542cc0441 http://jira.mfd.msk:8088/browse/CLS-256 небольшая чистка кода 2023-04-28 15:43:35 +03:00
AKurakin
fb7ff4711a http://jira.mfd.msk:8088/browse/CLS-257 поправил названия контроллеров 2023-04-28 15:11:55 +03:00
AKurakin
9d1bb95169 http://jira.mfd.msk:8088/browse/CLS-270 http://jira.mfd.msk:8088/browse/CLS-273 api url прописаны в мете destination 2023-04-28 15:01:17 +03:00
AKurakin
ae1c39f8b4 http://jira.mfd.msk:8088/browse/CLS-272 ClientCodeService, доделал BiDirectionQueueExchanger. Необходимо это покрыть тестами. 2023-04-27 18:55:14 +03:00
akulikov
202feebf0c equals -> equals by key 2023-04-27 12:37:24 +03:00
akulikov
2f369d6ea1 Merge branch 'dev' into cls-265 2023-04-27 11:28:02 +03:00
psemenkov
aa265afd86 http://jira.mfd.msk:8088/browse/CLS-268
Поправил тесты.
2023-04-26 14:17:48 +03:00
psemenkov
6a1f2f7c20 http://jira.mfd.msk:8088/browse/CLS-268
Поправил тесты.
2023-04-26 14:03:47 +03:00
psemenkov
d45878e1a2 Merge remote-tracking branch 'origin/dev' into CLS-268
# Conflicts:
#	clearing-parent/backend-api/src/main/resources/meta/data.xml
#	clearing-parent/backend-api/src/main/resources/meta/meta.xml
#	clearing-parent/backend-api/src/test/java/ru/spcex/clearing/backendapi/controller/queue/AbstractControllerTest.java
#	clearing-parent/backend-api/src/test/resources/meta.json
#	clearing-parent/db-scripts/src/main/resources/db/DATA.sql
#	clearing-parent/db-scripts/src/main/resources/db/DDL.sql
2023-04-26 11:42:16 +03:00
psemenkov
fe3cc5f6f5 http://jira.mfd.msk:8088/browse/CLS-268
Сделал проверку на Null.
2023-04-26 11:03:07 +03:00
psemenkov
95fdcd2d92 http://jira.mfd.msk:8088/browse/CLS-267
Поправил название RCHK.
2023-04-26 10:52:21 +03:00
psemenkov
ccb8afc679 http://jira.mfd.msk:8088/browse/CLS-267
Добавил новые таски.
2023-04-25 16:06:10 +03:00
akulikov
67058ad32a fix names and add consts 2023-04-25 15:20:06 +03:00
psemenkov
ccddd98cd6 http://jira.mfd.msk:8088/browse/CLS-268
Сделал оптимизацию кода.
2023-04-25 13:59:10 +03:00
akulikov
ff992e6812 fix accountService 2023-04-25 13:52:07 +03:00
psemenkov
7543e4b08f http://jira.mfd.msk:8088/browse/CLS-268
Исправил обработку InterruptedException.
2023-04-25 11:49:26 +03:00
akulikov
7026406168 fix accountService 2023-04-24 19:22:33 +03:00
akulikov
7193d79256 fix accountService 2023-04-24 19:21:34 +03:00
akulikov
0a20044d1e fix account field filling: processedSign 2023-04-24 19:06:38 +03:00
akulikov
6e6d866445 fix tests 2023-04-24 19:03:44 +03:00
psemenkov
510dfde848 # Conflicts:
#	clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/account/AccountNewAction.java
#	clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/ExecutionDepositHistoryMapStore.java
#	clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/SessionHistoryMapStore.java
#	clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/dictionary/SessionStatusDictionaryMapStore.java
#	clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/dictionary/SessionTypeDictionaryMapStore.java
2023-04-24 18:07:45 +03:00
psemenkov
f41aecf739 http://jira.mfd.msk:8088/browse/CLS-268
Сделал TaskManager без hazelcast listener добавил отправку сообщений из сервисов в очередь и написал TaskManagerTest.
2023-04-24 17:57:34 +03:00
psemenkov
1d9d670c3a http://jira.mfd.msk:8088/browse/CLS-268
Исправил название тестовой директории.
2023-04-24 17:54:04 +03:00
psemenkov
70433b7f85 http://jira.mfd.msk:8088/browse/CLS-268
Исправил ошибки.
2023-04-24 17:52:20 +03:00
akulikov
2716196bf7 AccountServiceTest (block) 2023-04-24 16:44:39 +03:00
akulikov
df9458b4ed AccountServiceTest (update/new) 2023-04-24 16:19:37 +03:00
akulikov
c442dfb1fe AccountServiceTest 2023-04-24 12:56:08 +03:00
akulikov
bf82612485 Merge branch 'dev' into cls-265 2023-04-24 12:55:11 +03:00
akulikov
54e828432d Account: update and block request 2023-04-24 12:48:04 +03:00
AKurakin
8528730e9c TradingClearingRegistryType A/C поправил опечатку с кирилицей-латиницей 2023-04-24 12:09:49 +03:00
akulikov
c1c5ec4c9c Account: new account request 2023-04-24 11:52:59 +03:00
AKurakin
98df65ed49 IMDG http://jira.mfd.msk:8088/browse/CLS-275 3.5.0.4, meta.3 добавил 2 словаря 2023-04-21 12:55:30 +03:00
AKurakin
8d643808c2 data.4 3.5.0.4 (словари попозже доделаю) 2023-04-20 18:58:32 +03:00
AKurakin
a325a7fd2e backend-api http://jira.mfd.msk:8088/browse/CLS-273 2023-04-20 18:48:47 +03:00
AKurakin
43ae4b26d8 backend-api http://jira.mfd.msk:8088/browse/CLS-279 2023-04-20 16:30:44 +03:00
AKurakin
849130f8b3 backend-api http://jira.mfd.msk:8088/browse/CLS-270 2023-04-20 15:57:54 +03:00
psemenkov
9bfc038111 Squashed commit of the following:
commit 670d21b13f
Merge: dd41ada2 7720f416
Author: AKurakin <akurakin@mfd.ru>
Date:   Wed Apr 19 16:44:12 2023 +0300

    Merge branch 'DDL_CLS-275' into dev

commit 7720f41699
Author: AKurakin <akurakin@mfd.ru>
Date:   Wed Apr 19 15:59:48 2023 +0300

    http://jira.mfd.msk:8088/browse/CLS-275 DDL (3) часть 3 правки тестов и кода TODO

commit 07e4e946de
Author: AKurakin <akurakin@mfd.ru>
Date:   Wed Apr 19 15:51:06 2023 +0300

    http://jira.mfd.msk:8088/browse/CLS-275 DDL (3) часть 2 доделал тест IMDG

commit a1a68d50b2
Author: AKurakin <akurakin@mfd.ru>
Date:   Wed Apr 19 13:06:51 2023 +0300

    http://jira.mfd.msk:8088/browse/CLS-275 DDL (3) часть 2 переименование STrade -> STrades

commit 762ddeacc5
Author: AKurakin <akurakin@mfd.ru>
Date:   Wed Apr 19 12:14:04 2023 +0300

    http://jira.mfd.msk:8088/browse/CLS-275 DDL (3) часть 1

commit dd41ada256
Author: AKurakin <akurakin@mfd.ru>
Date:   Tue Apr 18 16:02:37 2023 +0300

    backend-api . CLS-264 CLS-257

commit d7c74b25b1
Author: AKurakin <akurakin@mfd.ru>
Date:   Tue Apr 18 15:57:32 2023 +0300

    backend-api http://jira.mfd.msk:8088/browse/CLS-257 /accounting/

commit 32590c00f8
Author: AKurakin <akurakin@mfd.ru>
Date:   Tue Apr 18 14:12:41 2023 +0300

    backend-api http://jira.mfd.msk:8088/browse/CLS-257 unit-test дополнил, поправил

commit 5d75c6f53d
Author: AKurakin <akurakin@mfd.ru>
Date:   Tue Apr 18 12:19:29 2023 +0300

    backend-api http://jira.mfd.msk:8088/browse/CLS-257

commit a213ca1872
Author: AKurakin <akurakin@mfd.ru>
Date:   Mon Apr 17 17:21:33 2023 +0300

    backend-api .

commit 0ea216fef2
Author: AKurakin <akurakin@mfd.ru>
Date:   Mon Apr 17 17:19:55 2023 +0300

    http://jira.mfd.msk:8088/browse/CLS-256 backend-api. Юбилейный 256 таск :)
2023-04-20 14:44:52 +03:00
psemenkov
45ca3d9b56 http://jira.mfd.msk:8088/browse/CLS-268
Поправил существующий серис, тест для laucnher.
2023-04-20 13:54:15 +03:00
psemenkov
6b2acb66e7 http://jira.mfd.msk:8088/browse/CLS-268
Поправил существующий серис, валидаторы, тесты для plannerTemplate .
2023-04-20 13:53:47 +03:00
psemenkov
eae197cef9 http://jira.mfd.msk:8088/browse/CLS-268
Поправил существующий серис, валидаторы, тесты для plannerTemplate .
2023-04-20 13:53:03 +03:00
psemenkov
1fa4944ad1 http://jira.mfd.msk:8088/browse/CLS-268
Поправил существующий серис, валидаторы, тесты для clearingCalendar.
2023-04-20 13:52:27 +03:00
psemenkov
41a0f2a4b7 http://jira.mfd.msk:8088/browse/CLS-268
Поправил существующие тесты валидаторов, чтобы они запускались мавеном.
2023-04-20 13:50:39 +03:00
psemenkov
5096a2eb73 http://jira.mfd.msk:8088/browse/CLS-258
Сделат дополнительную настройку, поправил коды ошибок, добавил тестовый модуль(и удалил дублирующие их конфиги)
2023-04-20 13:47:47 +03:00
psemenkov
02c5b2a176 http://jira.mfd.msk:8088/browse/CLS-258
Привел в соответствие с ТЗ PlannerAllTodayMaker и добавил тесты к нему.
2023-04-20 11:41:48 +03:00
psemenkov
24dccbf4b7 http://jira.mfd.msk:8088/browse/CLS-258
Добавил пустой конструктор чтобы спринг мог создавать бин.
2023-04-20 11:36:29 +03:00
psemenkov
015171fc81 http://jira.mfd.msk:8088/browse/CLS-258
Добавил в тесты тестового пользователя с правами админа.
2023-04-20 11:34:16 +03:00
psemenkov
59e4a091ba http://jira.mfd.msk:8088/browse/CLS-258
Добавил реализацию getCollectionIdsBySQL() в ImdgHazelcast.
2023-04-20 11:22:31 +03:00
psemenkov
026a6a8d09 http://jira.mfd.msk:8088/browse/CLS-268
Создал модуль cleaning-builders для общих билдеров.
2023-04-20 11:19:35 +03:00
psemenkov
e5239c7a24 http://jira.mfd.msk:8088/browse/CLS-268
Создал модуль cleaning-builders для общих билдеров. Добавил PlannerAllTodayBuilder и ISchedulerChecker для валидации и создания PlannerAllToday.
2023-04-20 11:18:06 +03:00
psemenkov
384847168b http://jira.mfd.msk:8088/browse/CLS-258
Перенес общие классы и конфиги в test-clearing.
2023-04-19 17:39:33 +03:00
AKurakin
670d21b13f Merge branch 'DDL_CLS-275' into dev 2023-04-19 16:44:12 +03:00
AKurakin
7720f41699 http://jira.mfd.msk:8088/browse/CLS-275 DDL (3) часть 3 правки тестов и кода TODO 2023-04-19 16:01:33 +03:00
AKurakin
07e4e946de http://jira.mfd.msk:8088/browse/CLS-275 DDL (3) часть 2 доделал тест IMDG 2023-04-19 15:51:06 +03:00
AKurakin
a1a68d50b2 http://jira.mfd.msk:8088/browse/CLS-275 DDL (3) часть 2 переименование STrade -> STrades 2023-04-19 13:06:51 +03:00
AKurakin
762ddeacc5 http://jira.mfd.msk:8088/browse/CLS-275 DDL (3) часть 1 2023-04-19 12:23:56 +03:00
psemenkov
542b8c7e58 Сделал выравнивание. 2023-04-18 17:13:21 +03:00
psemenkov
1c32803b60 Исправил ListingBuilder. 2023-04-18 17:03:53 +03:00
AKurakin
dd41ada256 backend-api . CLS-264 CLS-257 2023-04-18 16:14:10 +03:00
AKurakin
d7c74b25b1 backend-api http://jira.mfd.msk:8088/browse/CLS-257 /accounting/ 2023-04-18 15:57:32 +03:00
AKurakin
32590c00f8 backend-api http://jira.mfd.msk:8088/browse/CLS-257 unit-test дополнил, поправил 2023-04-18 14:12:41 +03:00
AKurakin
5d75c6f53d backend-api http://jira.mfd.msk:8088/browse/CLS-257 2023-04-18 12:19:29 +03:00
AKurakin
a213ca1872 backend-api . 2023-04-17 17:21:33 +03:00
AKurakin
0ea216fef2 http://jira.mfd.msk:8088/browse/CLS-256 backend-api. Юбилейный 256 таск :) 2023-04-17 17:19:55 +03:00
akulikov
44ee51994a AccountValidation (in progress) 2023-04-14 14:14:09 +03:00
akulikov
e27d50f481 Merge branch 'dev' into cls-265 2023-04-11 17:00:43 +03:00
akulikov
c01d1ba0c6 remove redundant validation rules 2023-04-11 16:31:14 +03:00
AKurakin
f71ae406a2 http://jira.mfd.msk:8088/browse/CLS-261 DDL правки mapstore. Осторожно: удаление классов! 2023-04-11 14:46:37 +03:00
AKurakin
57b912dee1 http://jira.mfd.msk:8088/browse/CLS-261 DDL, meta.2 refactoring 2023-04-11 12:07:56 +03:00
AKurakin
7f58755bb8 http://jira.mfd.msk:8088/browse/CLS-261 DDL, meta.2 2023-04-10 21:23:18 +03:00
akulikov
0545a84229 BankAccountServiceTest 2023-04-10 16:46:52 +03:00
AKurakin
f701b0db8c IMDG refactoring для дочерних таблиц объединил общий код 2023-04-10 13:29:36 +03:00
akulikov
c00ea6be31 BankAccountValidationConfig 2023-04-10 11:49:23 +03:00
AKurakin
e3bc062346 meta.1.xml вернул нужные *History mapstore. Скоро будет обновление до meta.2.xml + ddl 2023-04-09 20:34:13 +03:00
akulikov
6707e361d9 FieldRequiredRule, add additional checks 2023-04-07 20:58:58 +03:00
ialbert
ce9ea6b1b2 Merge remote-tracking branch 'origin/dev' into dev 2023-04-07 19:25:26 +03:00
ialbert
8ce4158ce7 Merge remote-tracking branch 'origin/dev' into dev 2023-04-07 19:25:10 +03:00
AKurakin
d44bea5228 Переименование комментариев. 2023-04-07 19:25:06 +03:00
ialbert
6652cc7465 json.xsl and meta.xml update 2023-04-07 19:25:01 +03:00
AKurakin
9b92dfdf93 Merge branch 'CLS_258_259' into dev 2023-04-07 19:20:28 +03:00
AKurakin
02261a4c0c company-service CompanyService, AccountNotificationHelper - доделка очереди обработки 2023-04-07 19:20:04 +03:00
AKurakin
db8da95d32 Merge remote-tracking branch 'origin/dev' into dev 2023-04-07 18:55:05 +03:00
AKurakin
700ecaf547 Merge branch 'CLS_258_259' into dev
# Conflicts:
#	clearing-parent/backend-api/src/main/resources/meta/data.xml
#	clearing-parent/backend-api/src/main/resources/meta/meta.xml
2023-04-07 18:50:40 +03:00
AKurakin
2573b559c5 company-service ProfileDocumentService - добавлена отправка в account-service kafka 2023-04-07 18:44:08 +03:00
AKurakin
e3fc42dda9 Merge remote-tracking branch 'origin/CLS_258_259' into CLS_258_259
# Conflicts:
#	clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanyInfoServiceTest.java
#	clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanyServiceTest.java
#	clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/CompanySymbolServiceTest.java
2023-04-07 18:39:25 +03:00
psemenkov
4294321613 http://jira.mfd.msk:8088/browse/CLS-258
Перенес общие классы и конфиги в test-clearing.
2023-04-07 18:25:11 +03:00
AKurakin
e821423e68 company-service CompanySymbolValidationConfig добавлено правило валидации 2023-04-07 18:09:24 +03:00
AKurakin
83a513f629 company-service CompanyService, CompanySymbolService 2023-04-07 17:59:28 +03:00
psemenkov
5aea636e35 http://jira.mfd.msk:8088/browse/CLS-258
Перенес тестовые утилиты в test-clearing.
2023-04-07 17:09:20 +03:00
psemenkov
b0e7595d73 http://jira.mfd.msk:8088/browse/CLS-258
Добавил проверку ролей.
2023-04-07 14:19:59 +03:00
akulikov
cb3b251ee5 UserRoleVerification for company-service 2023-04-07 13:50:06 +03:00
AKurakin
2269f2c10e UserRoleVerification добавил комментарий и лог 2023-04-07 13:02:56 +03:00
akulikov
3280be88e2 UserRoleVerification modification 3 2023-04-07 12:55:41 +03:00
akulikov
cff4302c4a UserRoleVerification modification 2 2023-04-07 12:46:26 +03:00
akulikov
5366a7d79b UserRoleVerification modification 2023-04-07 12:20:36 +03:00
akulikov
4594540d40 company-service: RequestHelper fix logger 2023-04-07 11:17:16 +03:00
akulikov
3fcf40d94a company-service: RequestHelper to spring bean 2023-04-07 10:55:11 +03:00
AKurakin
28f47e8ebd validateTillFirstError уровень ошибок валидации - warn. 2023-04-07 10:54:48 +03:00
akulikov
17ca798fef CouponPeriodService: fix new/update request 2023-04-06 19:56:12 +03:00
akulikov
0cbbe2a05b CompanyServiceTest, add test for newCompany fail 2023-04-06 19:30:01 +03:00
akulikov
ade79ed6c6 CompanySymbolNotExistRule added 2023-04-06 19:09:46 +03:00
AKurakin
c1b17eb6c5 update meta 3.5.0.18 2023-04-06 18:53:10 +03:00
psemenkov
cd2c49b9d9 Merge remote-tracking branch 'origin/CLS_258_259' into CLS_258_259 2023-04-06 18:35:23 +03:00
psemenkov
d7680f6bdf Перенес тестовые утилиты в новый модуль test-clearing. 2023-04-06 18:35:13 +03:00
akulikov
1d173afccb DictionaryPresentRule add additional checks (fix) 2023-04-06 18:24:58 +03:00
akulikov
466037cd22 DictionaryPresentRule add additional checks 2023-04-06 18:19:46 +03:00
AKurakin
cf22ea1074 platform-imdg-api-hazelcast-impl: HazelcastHelper refactoring 2023-04-06 17:59:47 +03:00
AKurakin
c4b3c918c3 company-service поправил работу с hazelcast (его надо обновить - слишком старая версия с багом в транзакции) 2023-04-06 17:56:17 +03:00
AKurakin
0b1dc8f98d . 2023-04-06 14:38:48 +03:00
AKurakin
34d1a8c444 company-service fix log error in test 2023-04-06 13:52:29 +03:00
AKurakin
167db4a815 New meta 3.5.0.17 2023-04-06 12:55:36 +03:00
AKurakin
7833e7c669 Merge remote-tracking branch 'origin/CLS_258_259' into CLS_258_259 2023-04-06 12:45:09 +03:00
AKurakin
8288b4c988 company-service: CompanyRoleSetService поправил юниттесты 2023-04-06 12:44:56 +03:00
akulikov
0f3ef112a4 rename clearing-utils -> clearing-validation 2023-04-06 12:05:46 +03:00
akulikov
de137377bc ClearingMemberCategoryServiceTest fix 2023-04-06 12:01:41 +03:00
akulikov
61953777e6 FixedIncomeCashFlow update request and test 2023-04-06 11:36:03 +03:00
akulikov
398307b6b5 FieldRequiredRule fix 2023-04-06 11:16:12 +03:00
akulikov
7a3c1ec22c FixedIncomeCashFlow, new request test 2023-04-06 11:09:54 +03:00
psemenkov
e2452d33a7 Merge remote-tracking branch 'origin/CLS_258_259' into CLS_258_259 2023-04-06 10:50:45 +03:00
psemenkov
21db7fb5bd http://jira.mfd.msk:8088/browse/CLS-258
Убрал дубликат EndDtAfterStartDt.
2023-04-06 10:50:34 +03:00
akulikov
bacbf1ceca add Consts (FixedIncomeCashFlow) 2023-04-06 10:46:50 +03:00
akulikov
09c0ab342b FixedIncomeCashFlowValidationConfig 2023-04-06 10:37:48 +03:00
akulikov
156e181d50 FieldRequiredRule fix 2023-04-06 10:32:24 +03:00
akulikov
a45445340a FieldRequiredRule add additionalChecks 2023-04-06 10:27:41 +03:00
akulikov
0c4d747dde IsLongValueRule 2023-04-06 10:14:08 +03:00
psemenkov
eb4e730bdf http://jira.mfd.msk:8088/browse/CLS-258
Поменял Double на BigDecimal в полях nominalValue и lotSize.
2023-04-06 10:13:17 +03:00
AKurakin
cd093c81eb company-service: CompanyRoleSetService (в ТЗ не указаны запросы) 2023-04-05 22:52:41 +03:00
AKurakin
8c43a6e4ae company-service: CompanyInfoService добавил валидацию 2023-04-05 21:43:21 +03:00
AKurakin
1adc5db487 company-service: refactoring CompanyService + transaction 2023-04-05 20:58:35 +03:00
psemenkov
edff45ebae http://jira.mfd.msk:8088/browse/CLS-258
Добавил CouponPeriodService валидацию и тесты к нему.
2023-04-05 19:56:57 +03:00
psemenkov
15a477e8ce http://jira.mfd.msk:8088/browse/CLS-258
Добавил CurrencyService валидацию и тесты к нему.
2023-04-05 18:45:29 +03:00
akulikov
894f12591d FixedIncomeCashFlowNewRequest, FixedIncomeCashFlowUpdateRequest 2023-04-05 17:25:16 +03:00
akulikov
15404dbec1 contact meta fix 2023-04-05 17:23:16 +03:00
psemenkov
cd561d3302 Merge remote-tracking branch 'origin/CLS_258_259' into CLS_258_259 2023-04-05 17:03:27 +03:00
psemenkov
a6926d1e46 http://jira.mfd.msk:8088/browse/CLS-258
Поменял тип запросов с Double на BigDecimal.
2023-04-05 17:03:18 +03:00
AKurakin
c53374be1e company-service: refactoring CompanyService 2023-04-05 16:36:21 +03:00
psemenkov
dec7f44e48 http://jira.mfd.msk:8088/browse/CLS-258
Добавил проверку записей в справочниках, исправил ошибки, исправил тесты.
2023-04-05 16:26:32 +03:00
akulikov
2f01256a66 ContactService validation 2023-04-05 14:18:28 +03:00
akulikov
6ea7520b7b new CompanyErrors added 2023-04-05 13:50:40 +03:00
AKurakin
64e0dbbcf3 backend-api, UserMapStore: заполнение BaseRequest.userId fix unittest 2023-04-05 13:30:18 +03:00
AKurakin
c8306a1f7f Imdg.insert return id 2023-04-05 13:23:52 +03:00
AKurakin
316e2fe042 backend-api, UserMapStore: заполнение BaseRequest.userId 2 2023-04-05 13:18:59 +03:00
AKurakin
1e5e4e393d backend-api . 2023-04-05 12:33:37 +03:00
AKurakin
9aeb6ca6ee backend-api, UserMapStore: заполнение BaseRequest.userId 2023-04-05 12:33:20 +03:00
AKurakin
3140ea911e backend-api: ContactUpdateRequest and meta.xml fix 2023-04-05 12:31:50 +03:00
akulikov
30d600cdc8 ContactTypes enum added 2023-04-05 11:52:21 +03:00
akulikov
ddc27dbb33 ContactUpdateRequest and meta.xml fix 2023-04-05 11:30:41 +03:00
akulikov
7fea5d46cd ContactUpdateRequest and meta.xml fix 2023-04-05 11:26:00 +03:00
AKurakin
7ff3de2724 CLS-259 util добавил ассинхронно-синхронный обмен сообщениями (интерфейс) BiDirectionQueueExchanger 2023-04-05 09:37:09 +03:00
AKurakin
4ffbefbbe0 CLS-256, CLS-259 немного поменялось API по meta 2023-04-04 21:50:31 +03:00
AKurakin
a2cc3945f6 Refactoring: IErrorEnumId 2023-04-04 19:04:09 +03:00
AKurakin
77c4fe1bfd fix security-util pom 2023-04-04 18:54:59 +03:00
AKurakin
ffcba02af2 CLS-259 CompanyService поправил тест 2023-04-04 18:22:38 +03:00
psemenkov
bfe2db7a72 Merge remote-tracking branch 'origin/CLS_258_259' into CLS_258_259 2023-04-04 18:14:22 +03:00
psemenkov
e2ce49e3e5 http://jira.mfd.msk:8088/browse/CLS-258
Добавил FixedIncomeSecurityService.java, исправил ошибки, добавил тесты.
2023-04-04 18:13:52 +03:00
akulikov
d07674e2c6 ContactNewRequest 2023-04-04 17:59:00 +03:00
AKurakin
ba4a7140d6 http://jira.mfd.msk:8088/browse/CLS-259 CompanyService 2023-04-04 17:57:56 +03:00
AKurakin
96dc0d0313 clearing-utils улучшил читаемость 2023-04-04 17:23:59 +03:00
akulikov
adf57e7b00 updateProfileDocument 2023-04-04 15:56:45 +03:00
psemenkov
30485d7104 http://jira.mfd.msk:8088/browse/CLS-258
Небольшие изменения.
2023-04-04 15:51:46 +03:00
akulikov
7d0da57d4a ProfileDocumentUpdateRequest 2023-04-04 15:06:46 +03:00
AKurakin
53a5d25cd9 http://jira.mfd.msk:8088/browse/CLS-259 добавил platform-enum, поправил поля в CompanyNewRequest 2023-04-04 14:49:41 +03:00
psemenkov
93664b6ef5 http://jira.mfd.msk:8088/browse/CLS-258
Исправил MoneyMarketSecurityMapStore.
2023-04-04 13:37:03 +03:00
akulikov
dcb517d300 profileDocumentNewRequest 2023-04-04 12:09:22 +03:00
akulikov
7eb629f158 profileDocumentNewRequestValidator 2023-04-04 11:32:30 +03:00
akulikov
f334a31b10 EndDtAfterStartDtRule 2023-04-04 11:29:09 +03:00
AKurakin
536df6a156 platform-messaging - добавил некоторые требуемые поля 2023-04-03 21:08:25 +03:00
akulikov
2032c156a8 ClearingMemberCategoryServiceTest fix 2023-04-03 17:39:04 +03:00
ialbert
ae1d52794a http://jira.mfd.msk:8088/browse/CLS-254 meta webtype 2023-04-03 15:53:05 +03:00
akulikov
50e5d8d7bc fix ValidationHelper: method validate (now validateTillFirstError) static -> not static 2023-04-03 15:13:49 +03:00
AKurakin
5ed307f639 http://jira.mfd.msk:8088/browse/CLS-259 . 2023-04-03 14:19:17 +03:00
psemenkov
0b062fc97c http://jira.mfd.msk:8088/browse/CLS-258
Поправил MoneyMarketSecurityService и валидацию в соответствии с ТЗ. Исправил MoneyMarketSecurityMapStore.
2023-04-03 13:21:27 +03:00
akulikov
9e4b4fd7df fix pom.xml for clearing-utils 2023-04-03 12:15:33 +03:00
akulikov
5560731a36 need fix clearing-utils 2023-04-03 11:44:17 +03:00
akulikov
b6f516d81d remove ImdgValidationContext.java, IValidatorContext.java, IValidationRule.java, IValidator.java, ValidatorImpl.java from clearing-utils 2023-04-03 11:37:51 +03:00
akulikov
a7875f2396 валидация для ClearingMemberCategory. есть проблема с clearing-utils, при сборке maven его не видит, возможно была ошибка при добавлении модуля 2023-04-02 20:38:59 +03:00
AKurakin
ee86ba8340 http://jira.mfd.msk:8088/browse/CLS-259 начало 2023-04-01 21:41:46 +03:00
AKurakin
f99989145c Чтобы компилировалось. 2023-03-31 21:40:30 +03:00
ialbert
73757a3bdb Merge remote-tracking branch 'origin/CLS_258_259' into CLS_258_259 2023-03-31 17:24:02 +03:00
ialbert
2570b82309 http://jira.mfd.msk:8088/browse/CLS-256 2023-03-31 17:23:53 +03:00
AKurakin
f7dcff2e87 Merge branch 'dev' into CLS_258_259 2023-03-31 16:49:31 +03:00
AKurakin
2f17391664 Update META 3.5.0.16 2023-03-31 16:48:51 +03:00
AKurakin
ead30c2765 Добавил clearing-utils 2023-03-31 16:13:25 +03:00
AKurakin
9abd6c818b Добавил security-util с UserRoleVerification для проверки прав. 2023-03-31 15:44:59 +03:00
AKurakin
d4d544a086 http://jira.mfd.msk:8088/browse/CLS-252 DDL этап 1, корректировка MoneyMarketSecurityHistory - пока не нужен 2023-03-31 13:54:40 +03:00
AKurakin
3ed83781f2 http://jira.mfd.msk:8088/browse/CLS-252 DDL этап 1 2023-03-30 19:10:33 +03:00
psemenkov
611801e965 Adding ExecutionDepositComponentTest. 2023-03-21 10:19:48 +03:00
psemenkov
de54b1c94a Fixing VerificationResultComponentTest and PaymentUpdateBySdf04Test. 2023-03-20 12:44:28 +03:00
psemenkov
3c31fc9d02 Fixing VerificationResultComponent. 2023-03-20 10:25:28 +03:00
psemenkov
e24cece994 Adding test VerificationResultComponentTest for clearing-service. 2023-03-17 18:17:38 +03:00
psemenkov
729280e629 Adding test PaymentUpdateBySdf04Test for clearing-service. 2023-03-16 16:09:42 +03:00
psemenkov
d8bed72ea2 Adding test ClearingServiceTest for clearing-service. 2023-03-10 10:15:18 +03:00
psemenkov
a8a4d99113 Creating ClearingServiceTest for clearing-service. Fixing bug in ValidationConfig. 2023-03-03 18:13:19 +03:00
psemenkov
18959e3beb Creating tests for registry-service. 2023-03-01 12:31:10 +03:00
psemenkov
e0b53a15d1 Creating ProfileDocumentServiceTest AdmittedDealRegisterServiceTest tests. Creating InstantDateTimeDeserializer and InstantDateTimeSerializer with pattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS'Z'"). 2023-02-28 11:47:42 +03:00
psemenkov
a1076c5026 Simple refactoring company-service tests. 2023-02-22 18:56:31 +03:00
psemenkov
3acebda42b Adding test for user, utilities, securities and simple refactoring. 2023-02-21 18:24:44 +03:00
psemenkov
4817f8644f Adding test for register and simple refactoring. 2023-02-20 18:53:15 +03:00
psemenkov
7b50a49d5c Adding test and simple refactoring. 2023-02-17 18:42:56 +03:00
psemenkov
ee334d285e Adding test for ExecutionDepositController. And update meta.json. 2023-02-17 12:39:46 +03:00
psemenkov
24cba526f9 Adding test for LauncherController. And fixing NPE in LauncherController.addSpecific. 2023-02-16 17:56:05 +03:00
psemenkov
4345254674 Fixing test for backend-api. 2023-02-16 10:13:43 +03:00
psemenkov
71de170b00 Testing account-service, backend-api, balance-service, company-service. 2023-02-14 14:51:03 +03:00
AKurakin
daa2e880ff http://jira.mfd.msk:8088/browse/CLS-189 fix SDF 03/11 отправку сообщений на создание (поправил опечатки) 2023-02-10 11:53:33 +03:00
AKurakin
fde8174e86 http://jira.mfd.msk:8088/browse/CLS-189 fix SDF 03/11 отправку сообщений на создание 2023-02-10 11:29:13 +03:00
AKurakin
0a1857ead8 http://jira.mfd.msk:8088/browse/CLS-189 fix SDF 03/11 date format 2023-02-09 16:50:40 +03:00
AKurakin
a984876d84 http://jira.mfd.msk:8088/browse/CLS-189 fix NPE 2023-02-09 16:30:19 +03:00
AKurakin
b9ff994011 http://jira.mfd.msk:8088/browse/CLS-189 правка полей в Sdf03Builder Sdf11Builder 2023-02-09 16:24:14 +03:00
AKurakin
331710f288 http://jira.mfd.msk:8088/browse/CLS-189 добавил логи, чтобы было ясно про ассинхронность 2023-02-09 12:34:30 +03:00
AKurakin
8b119cc145 http://jira.mfd.msk:8088/browse/CLS-189 PaymentInstructionCreator логика обновления PaymentInstruction (правка хака 650583bd7e) 2023-02-09 12:15:53 +03:00
ialbert
bfe9f42e04 Merge remote-tracking branch 'origin/dev' into dev 2023-02-09 12:09:57 +03:00
ialbert
4f3f78f4ba http://jira.mfd.msk:8088/browse/CLS-189 changed account balance timeout wait 2023-02-09 12:09:47 +03:00
etreshenkov
3520ac0392 update meta 2023-02-09 11:59:54 +03:00
AKurakin
1fe0168446 account-service http://jira.mfd.msk:8088/browse/CLS-231 валидация и спринг (spring=весна) 2023-02-09 10:58:25 +03:00
etreschenkov
29a9261ee8 update meta 2023-02-08 20:20:42 +03:00
AKurakin
650583bd7e http://jira.mfd.msk:8088/browse/CLS-189 PaymentInstructionCreator хак, чтобы не создавать PaymentInstruction по первой ноге I для первого executionDeposit. 2023-02-08 20:07:59 +03:00
etreschenkov
34d01f1a22 update meta 2023-02-08 19:58:59 +03:00
etreschenkov
5b0184d60f update meta 2023-02-08 19:56:29 +03:00
AKurakin
535908f169 http://jira.mfd.msk:8088/browse/CLS-189 PaymentInstructionCreator добавил проверку на liabilitiesClaimsAssets.settlementDate = сегодня 2023-02-08 19:35:19 +03:00
AKurakin
4d804f9644 http://jira.mfd.msk:8088/browse/CLS-189 PaymentInstructionCreator B *leg_=amount поправил заполнение 2023-02-08 18:24:33 +03:00
AKurakin
bb18e4909b http://jira.mfd.msk:8088/browse/CLS-189 PaymentInstructionCreator 2023-02-08 17:46:41 +03:00
AKurakin
bfbd0a8da4 http://jira.mfd.msk:8088/browse/CLS-130 или CLS-188: Sdf03Builder sbanknam1 2023-02-08 17:20:31 +03:00
ialbert
52543344d4 http://jira.mfd.msk:8088/browse/CLS-130 2023-02-08 15:58:10 +03:00
ialbert
fa382190e3 http://jira.mfd.msk:8088/browse/CLS-189 2023-02-08 14:52:07 +03:00
ialbert
2178135bc8 http://jira.mfd.msk:8088/browse/CLS-189 2023-02-08 14:06:35 +03:00
ialbert
1c3e295a6b Merge remote-tracking branch 'origin/dev' into dev 2023-02-08 13:39:29 +03:00
ialbert
c2b11fea53 http://jira.mfd.msk:8088/browse/CLS-189 2023-02-08 13:39:19 +03:00
AKurakin
3d8e4a6913 platform-imdg-api-hazelcast-impl добавил тест 2023-02-08 13:38:31 +03:00
ialbert
70320834ae Merge remote-tracking branch 'origin/dev' into dev 2023-02-08 13:36:57 +03:00
ialbert
a6c6a7d733 http://jira.mfd.msk:8088/browse/CLS-130 2023-02-08 13:36:48 +03:00
AKurakin
fa5aa2ea27 http://jira.mfd.msk:8088/browse/CLS-188 правка предиката и выборки объектов, поправил логи 2023-02-08 13:19:28 +03:00
AKurakin
a9cc2752d0 http://jira.mfd.msk:8088/browse/CLS-188 operation B/S BUY SELL 2023-02-08 12:48:32 +03:00
ialbert
2d3808460e http://jira.mfd.msk:8088/browse/CLS-189 2023-02-08 12:00:28 +03:00
ialbert
8ae1c18344 Merge remote-tracking branch 'origin/dev' into dev 2023-02-08 11:21:38 +03:00
ialbert
26696e73ba http://jira.mfd.msk:8088/browse/CLS-189 2023-02-08 11:21:25 +03:00
AKurakin
e6e7dd57c6 http://jira.mfd.msk:8088/browse/CLS-189 fix npe три 2023-02-08 11:10:00 +03:00
AKurakin
502a343c55 clearing-service http://jira.mfd.msk:8088/browse/CLS-188 правка ExecutionDepositComponent для http://jira.mfd.msk:8088/browse/CLS-189 - оказалось S_TRADE бывают с одинаковыми tradeNum 2023-02-08 10:58:26 +03:00
AKurakin
150468f823 http://jira.mfd.msk:8088/browse/CLS-189 fix PaymentInstructionCreator поправил AddresseeId для V 2023-02-07 19:07:22 +03:00
ialbert
13be0ab471 http://jira.mfd.msk:8088/browse/CLS-189 2023-02-07 18:34:27 +03:00
AKurakin
8a41f93e19 http://jira.mfd.msk:8088/browse/CLS-189 fix npe два (но тут еррор добавил 2023-02-07 17:52:50 +03:00
AKurakin
5c74626e76 http://jira.mfd.msk:8088/browse/CLS-189 fix npe раз 2023-02-07 17:17:57 +03:00
AKurakin
553bf5b93c http://jira.mfd.msk:8088/browse/CLS-189 final merge code 2023-02-07 16:55:21 +03:00
ialbert
37e7ee1f2e Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Clearing.java
2023-02-07 16:46:19 +03:00
ialbert
dc0a214306 http://jira.mfd.msk:8088/browse/CLS-189 2023-02-07 16:41:55 +03:00
AKurakin
52d4c654a1 http://jira.mfd.msk:8088/browse/CLS-189 PaymentInstructionCreator ПеРеДелКа часть с PaymentInstruction 2023-02-07 15:44:26 +03:00
AKurakin
afb0e6c182 http://jira.mfd.msk:8088/browse/CLS-189 PaymentInstructionCreator account I bug fix 2023-02-07 14:27:02 +03:00
AKurakin
bb96118df0 http://jira.mfd.msk:8088/browse/CLS-189 добавил логов trace 2023-02-07 14:10:59 +03:00
AKurakin
687b50d970 http://jira.mfd.msk:8088/browse/CLS-189 PaymentInstructionCreator мелкая правка, добавил логов trace 2023-02-07 14:08:20 +03:00
ialbert
722b6ff385 Merge remote-tracking branch 'origin/dev' into dev 2023-02-07 13:36:45 +03:00
ialbert
2ad1233863 http://jira.mfd.msk:8088/browse/CLS-130 added test SdfCreatorBySTLDPayment 2023-02-07 13:36:37 +03:00
AKurakin
c1f0923433 http://jira.mfd.msk:8088/browse/CLS-189 PaymentInstructionCreator мелкая правка B 2023-02-07 13:18:13 +03:00
ialbert
d22a4048aa Merge remote-tracking branch 'origin/dev' into dev 2023-02-07 13:15:50 +03:00
ialbert
54e7a99b77 http://jira.mfd.msk:8088/browse/CLS-130 2023-02-07 13:15:42 +03:00
AKurakin
15d836fade http://jira.mfd.msk:8088/browse/CLS-189 PaymentInstructionCreator правка 2023-02-07 11:07:33 +03:00
ialbert
09605b610d http://jira.mfd.msk:8088/browse/CLS-130 2023-02-06 20:06:34 +03:00
ialbert
0e8ea7b595 Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/builder/PaymentInstructionCreator.java
2023-02-06 18:31:06 +03:00
ialbert
d1b9543d35 http://jira.mfd.msk:8088/browse/CLS-189 2023-02-06 18:29:36 +03:00
etreschenkov
52b600dbbf update meta 2023-02-06 17:46:32 +03:00
AKurakin
f13bfbf9ac http://jira.mfd.msk:8088/browse/CLS-189 PaymentInstructionCreator правка заполнения LiabilitiesClaimsMoney для 2 ног 2023-02-06 17:12:34 +03:00
AKurakin
f60bfdd318 http://jira.mfd.msk:8088/browse/CLS-189 PaymentInstructionCreator правка заполнения из Credit/DebitLegAmount пустого. 2023-02-06 13:38:34 +03:00
AKurakin
e960fb6cb4 http://jira.mfd.msk:8088/browse/CLS-189 PaymentInstructionCreator правка заполнения из Credit/DebitLegAmount пустого. 2023-02-06 13:20:47 +03:00
AKurakin
1922203226 http://jira.mfd.msk:8088/browse/CLS-189 PaymentInstructionCreator правка заполнения payment1/2.getAddresseeId по executionDeposit 2023-02-06 12:36:45 +03:00
AKurakin
841ad76fe8 http://jira.mfd.msk:8088/browse/CLS-189 fix NPE PaymentInstructionCreator когда payment2.getAddresseeId == null - будет warn. Основная причина: securityId = %s and companyId <> %s 2023-02-06 11:20:37 +03:00
ialbert
8415cfd243 http://jira.mfd.msk:8088/browse/CLS-189 fix SqlPredicate -> equal predicate 2023-02-03 19:42:57 +03:00
ialbert
520dcfe9be Merge remote-tracking branch 'origin/dev' into dev 2023-02-03 18:44:28 +03:00
ialbert
c5633916c6 http://jira.mfd.msk:8088/browse/CLS-189 sql predicate date fix 2023-02-03 18:44:20 +03:00
etreschenkov
c6600ada46 update meta 2023-02-03 18:07:57 +03:00
ialbert
e105aad7eb http://jira.mfd.msk:8088/browse/CLS-189 AccountBalance change 2023-02-03 17:47:34 +03:00
ialbert
ef0a4a09c7 http://jira.mfd.msk:8088/browse/CLS-189 2023-02-03 17:09:14 +03:00
ialbert
0f2c8bf2dc http://jira.mfd.msk:8088/browse/CLS-189 2023-02-03 16:52:03 +03:00
AKurakin
c9676d3dfb http://jira.mfd.msk:8088/browse/CLS-189 интеграция кода 2023-02-03 16:47:10 +03:00
ialbert
12511a48e9 http://jira.mfd.msk:8088/browse/CLS-189 2023-02-03 16:26:07 +03:00
ialbert
e924df5be2 Merge remote-tracking branch 'origin/dev' into dev 2023-02-03 13:40:03 +03:00
ialbert
da5d08e1d8 http://jira.mfd.msk:8088/browse/CLS-189 account balance bug fix NLPs 2023-02-03 13:39:53 +03:00
etreshenkov
c38fa5c0bf http://jira.mfd.msk:8088/browse/CLS-217 2023-02-03 12:19:34 +03:00
ialbert
af192d5a32 http://jira.mfd.msk:8088/browse/CLS-189 bug fix 2023-02-03 11:21:13 +03:00
ialbert
b448d6b208 http://jira.mfd.msk:8088/browse/CLS-189 bug fix 2023-02-02 18:02:53 +03:00
ialbert
01c22e449d http://jira.mfd.msk:8088/browse/CLS-189 NLP fix 2023-02-02 17:40:53 +03:00
ialbert
894fdf7625 http://jira.mfd.msk:8088/browse/CLS-189 updated distr pom.xml added clearing-service 2023-02-02 17:05:12 +03:00
ialbert
c77444c4df http://jira.mfd.msk:8088/browse/CLS-189 added logging 2023-02-02 16:52:10 +03:00
ialbert
89059e8b46 http://jira.mfd.msk:8088/browse/CLS-189 added logging 2023-02-02 16:45:24 +03:00
ialbert
2b11d25ac2 http://jira.mfd.msk:8088/browse/CLS-189 added logging 2023-02-02 16:44:19 +03:00
ialbert
09a58a95ce http://jira.mfd.msk:8088/browse/CLS-189 added logging 2023-02-02 16:31:38 +03:00
ialbert
89839b7da2 Merge remote-tracking branch 'origin/dev' into dev 2023-02-02 16:14:17 +03:00
ialbert
5a772d40a3 http://jira.mfd.msk:8088/browse/CLS-189 2023-02-02 16:14:06 +03:00
AKurakin
36ac6256d6 поправил некоторые мелкие баги, найденные Sonar 2023-02-02 15:48:35 +03:00
ialbert
c59d010444 Merge remote-tracking branch 'origin/dev' into dev 2023-02-02 15:44:45 +03:00
ialbert
21d5fd0004 http://jira.mfd.msk:8088/browse/CLS-189 2023-02-02 15:44:35 +03:00
AKurakin
560ffc160a clearing-service http://jira.mfd.msk:8088/browse/CLS-189 доделки 2.2.2.2 2023-02-02 15:33:59 +03:00
AKurakin
118ad70db0 clearing-service http://jira.mfd.msk:8088/browse/CLS-189 доделал 2.2.2.2, осталось применить (вызвать) 2.2.2 и дописать начало. 2023-02-02 14:31:17 +03:00
AKurakin
68c74360d5 balance-service поправил юниттест после 8e78759713 2023-02-02 14:22:48 +03:00
ialbert
8e78759713 http://jira.mfd.msk:8088/browse/CLS-189 2023-02-02 14:08:27 +03:00
ialbert
a27d4c3061 Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/Clearing.java
#	platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/AccountType.java
2023-02-01 20:55:14 +03:00
ialbert
75c4e7aeae http://jira.mfd.msk:8088/browse/CLS-189 2023-02-01 20:52:25 +03:00
AKurakin
1debfd81da clearing-service http://jira.mfd.msk:8088/browse/CLS-189 создание PaymentInstruction... 2023-02-01 20:06:23 +03:00
akurakin
5f41508df3 clearing-service http://jira.mfd.msk:8088/browse/CLS-189 создание PaymentInstruction, часть 2.2.2 доделал полностью, осталось 2.2.2.1 и 2.2.2.2 2023-02-01 20:13:43 +03:00
akurakin
43b69192e6 clearing-service http://jira.mfd.msk:8088/browse/CLS-189 создание PaymentInstruction, часть 2.2.2 половина 2023-02-01 18:04:27 +03:00
etreschenkov
5c143ad47a update meta 2023-02-01 16:30:43 +03:00
AKurakin
6b43d3b238 dbf-exporter доделал опциональный KafkaSender, иначе не запускался без необязательных настроек. 2023-02-01 14:48:15 +03:00
AKurakin
8fb186f564 clearing-service fix NPE 2023-02-01 14:17:54 +03:00
etreshenkov
e016cc5528 http://jira.mfd.msk:8088/browse/CLS-217 2023-02-01 14:02:36 +03:00
etreschenkov
efbc815717 http://jira.mfd.msk:8088/browse/CLS-240 2023-02-01 13:25:13 +03:00
AKurakin
0ffc0a6471 clearing-service http://jira.mfd.msk:8088/browse/CLS-188 упростил отправку DealRegisterNewRequest (убрал даты явы 8 чтобы не стучал ошибками сериализации) 2023-02-01 12:17:01 +03:00
ialbert
9e00b96e95 Merge remote-tracking branch 'origin/dev' into dev 2023-02-01 12:12:34 +03:00
ialbert
76bde6941a http://jira.mfd.msk:8088/browse/CLS-189 2023-02-01 12:12:26 +03:00
AKurakin
f47d3c0914 clearing-service http://jira.mfd.msk:8088/browse/CLS-188 упростил выборку 2023-02-01 12:05:03 +03:00
AKurakin
1f09042271 clearing-service http://jira.mfd.msk:8088/browse/CLS-188 доделки по новому ТЗ 2023-02-01 11:15:31 +03:00
ialbert
196ec996df http://jira.mfd.msk:8088/browse/CLS-189 2023-02-01 11:10:30 +03:00
ialbert
fc56cbe360 Merge remote-tracking branch 'origin/dev' into dev 2023-01-31 20:09:36 +03:00
ialbert
2363c3362c http://jira.mfd.msk:8088/browse/CLS-189 2023-01-31 20:09:27 +03:00
AKurakin
503710f19b reports-service поменяли типы в LiabilitiesClaimsAssets.refundDate 2023-01-31 17:05:01 +03:00
AKurakin
7dd06fcc51 scheduler-service отправка команд в очереди - поправил обёртку launch 2023-01-31 16:50:13 +03:00
AKurakin
2c7a9934fe clearing-service http://jira.mfd.msk:8088/browse/CLS-188 часть доделок 2023-01-31 16:19:12 +03:00
AKurakin
06f53ad40d scheduler-service отправка команд в очереди по расписанию - рефакторинг команды запуска (стандартизация) 2023-01-31 16:16:55 +03:00
ialbert
7647a0ff5b Merge remote-tracking branch 'origin/dev' into dev 2023-01-31 15:25:08 +03:00
ialbert
52ff312044 http://jira.mfd.msk:8088/browse/CLS-189 2023-01-31 15:24:57 +03:00
etreshenkov
270a27187c http://jira.mfd.msk:8088/browse/CLS-217 2023-01-31 14:48:01 +03:00
AKurakin
10cf6bc3cb reports-service поправил обработку ошибок: если 1 вид отчёта не сможет сделать, то дбудет пробовать доделать остальные; поправил ReportBR_0420314_P2 при отсутствии company пишет warn и пропускает 2023-01-31 13:58:05 +03:00
AKurakin
df04573792 reports-service CLS-27 + ca35276db6 fix field LocalDate 2023-01-30 20:20:16 +03:00
akurakin
11d38b3112 clearing-service http://jira.mfd.msk:8088/browse/CLS-188 STrade Часть I - Изменение executionDeposit при получении новых сделок из ТС 2023-01-30 20:34:19 +03:00
psemenkov
65086fa8af Adding mapstor for testing 2023-01-30 16:51:34 +03:00
psemenkov
ca35276db6 Adding mapstor for testing 2023-01-30 16:36:02 +03:00
AKurakin
855f1c0c81 imdg CLS-188 поправил имена полей в STrade 2023-01-30 14:13:09 +03:00
AKurakin
b6fa8e7d79 imdg http://jira.mfd.msk:8088/browse/CLS-188 добавил мапу STrade 2023-01-30 13:20:15 +03:00
psemenkov
5d9a66eece Delete test with EmbeddedKafka. 2023-01-30 11:38:32 +03:00
psemenkov
8c4e5c3d40 Merge remote-tracking branch 'origin/dev' into dev 2023-01-27 18:57:47 +03:00
psemenkov
fdb8d558a9 Add test with EmbeddedKafka. 2023-01-27 18:57:36 +03:00
AKurakin
d36eefdfb7 reports-service http://jira.mfd.msk:8088/browse/CLS-92 http://jira.mfd.msk:8088/browse/CLS-102 поправил запуск дневных отчётов (INDOCUMENT,OUTDOCUMENT) 2023-01-27 14:20:05 +03:00
aalehin
f147d1cd1c http://jira.mfd.msk:8088/browse/CLS-85
---
ClearMemberRegisterChangeService
2023-01-26 18:17:31 +03:00
aalehin
3071a4457a http://jira.mfd.msk:8088/browse/CLS-84
---
ClearMemberRegisterService
2023-01-26 17:56:08 +03:00
aalehin
3eeab23360 http://jira.mfd.msk:8088/browse/CLS-89
---
UncoveredDealRegisterService
2023-01-26 14:32:48 +03:00
aalehin
b3c7ec99d3 http://jira.mfd.msk:8088/browse/CLS-86
---
BalanceRegisterService
2023-01-26 13:15:56 +03:00
aalehin
5cd4531638 http://jira.mfd.msk:8088/browse/CLS-91
---
ContractRegisterService
2023-01-26 12:35:00 +03:00
aalehin
b67d4fb7a1 Merge branch 'dev' of http://git.mfd.msk/mfd/clearing into dev 2023-01-26 12:09:05 +03:00
aalehin
b5dee6c1de http://jira.mfd.msk:8088/browse/CLS-90
---
OrderRegisterService
2023-01-26 12:05:00 +03:00
psemenkov
9c868859db Merge remote-tracking branch 'origin/dev' into dev 2023-01-24 18:35:13 +03:00
psemenkov
8d8206d5ae Fixing bug. 2023-01-24 18:35:04 +03:00
aalehin
8c4bee0b84 http://jira.mfd.msk:8088/browse/CLS-87
---
AdmittedDealRegisterService update
2023-01-24 18:32:31 +03:00
psemenkov
a53232a773 Adding StatementServiceServiceTest. 2023-01-24 17:59:03 +03:00
psemenkov
33cdde3b54 Merge remote-tracking branch 'origin/dev' into dev 2023-01-24 17:58:31 +03:00
aalehin
7e11a9fdc5 http://jira.mfd.msk:8088/browse/CLS-88
---
fix up of settings and launching
2023-01-24 13:39:28 +03:00
psemenkov
b58ed3023d simple cheng. 2023-01-24 12:03:10 +03:00
psemenkov
0de9b4cc5c simple cheng. 2023-01-24 11:38:36 +03:00
psemenkov
d452edad3c Adding test for Sdf08Service. 2023-01-24 10:49:53 +03:00
aalehin
dc6d2d681a http://jira.mfd.msk:8088/browse/CLS-88
---
CoveredDealRegisterService settled
2023-01-23 19:39:37 +03:00
psemenkov
ff5d2c22d0 Fixing NPE ExistClrnAccountValidationRule and fixing error in ValidationConfig. Adding test for Sdf16Executor. 2023-01-23 18:36:04 +03:00
AKurakin
4132f915a4 account-service http://jira.mfd.msk:8088/browse/CLS-231 поправил валидацию 2023-01-23 16:35:36 +03:00
psemenkov
93526ce1b5 Fixing NPE in Sdf09ValidationRule, AccountBalanceFreeAmountEnough and fixing error checking the balance in AccountBalanceFreeAmountEnough. Adding test for Sdf09Executor. 2023-01-23 16:32:11 +03:00
aalehin
b1b216a647 http://jira.mfd.msk:8088/browse/CLS-88
---
registry-service default architecture prepared
2023-01-23 13:27:05 +03:00
psemenkov
77de16d8f2 Fixing NPE and DateTimeParseException in Sdf01ValidationRule. Adding validation test in Sdf01ExecutorTest.validatedExecute. 2023-01-20 17:17:08 +03:00
psemenkov
b5d92c6cee Fixing Sdf01ExecutorTest. 2023-01-19 18:37:33 +03:00
akulikov
5685f95ce2 Merge branch 'CLS_51_57' into dev 2023-01-19 12:52:24 +03:00
akulikov
5551702dc9 PlannerTemplateServiceTest fix 2023-01-19 11:32:15 +03:00
akulikov
99c3a8e655 PlannerTemplateServiceTest fix 2023-01-19 11:28:47 +03:00
psemenkov
4616e5c735 Поправил checkSavingForAllMapStoreTest. 2023-01-19 10:26:17 +03:00
akulikov
209edc1a44 ClearingCalendarServiceTest add validation test 2023-01-18 15:48:39 +03:00
akulikov
39c3f92ec3 Merge branch 'dev' into CLS_51_57
# Conflicts:
#	clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/util/Util.java
2023-01-18 15:13:06 +03:00
akulikov
69f63cbc67 refactor, test fix 2023-01-18 14:43:06 +03:00
AKurakin
e00969fa4b imdg частичный revert c1de35e101 2023-01-18 13:10:41 +03:00
akulikov
84083be396 refactor and docs 2023-01-18 12:59:47 +03:00
AKurakin
ecab3cbee2 clearing-service dbf-exporter S_DF03 S_DF11 для множества вариантов learing_member_category допустимо несколько отчётов на 1 фирму 2023-01-18 12:32:55 +03:00
etreschenkov
c1de35e101 fix bugs 2023-01-18 11:25:48 +03:00
AKurakin
718bb594ef clearing-service dbf-exporter ASGN.M.BT10-1.1 и ASGN.M.BT10-1.2. S_DF03 S_DF11 правка для множества вариантов learing_member_category 2023-01-18 11:10:11 +03:00
etreschenkov
8644d18a90 update meta 2.4.0.7 2023-01-17 19:36:53 +03:00
AKurakin
4c66758bfc clearing-service dbf-exporter ASGN.M.BT10-1.1 и ASGN.M.BT10-1.2. S_DF03 S_DF11 добавил логов 2023-01-17 19:02:39 +03:00
etreschenkov
c1927b907d fix duplicate accounts 2023-01-17 18:42:38 +03:00
akulikov
ff8dd10f52 ClearingCalendarValidation 2023-01-17 18:05:35 +03:00
AKurakin
21bde123cb dbf-exporter ASGN.M.BT10-1.1 и ASGN.M.BT10-1.2. S_DF03 S_DF11 2023-01-17 18:04:50 +03:00
akulikov
45e5c588b5 PlannerTemplateServiceValidation 2023-01-17 17:29:22 +03:00
AKurakin
da2dfb3253 account-service http://jira.mfd.msk:8088/browse/CLS-231 правки валидатора 2023-01-17 17:12:47 +03:00
AKurakin
61ff18102b backend-api временно выключил логи на мету, потом необходимо вернуть в WARN. 2023-01-17 17:10:04 +03:00
AKurakin
40f8d02f00 account-service временно выключил тесты BankAccountServiceTest потомучто не проходят 2023-01-17 16:53:03 +03:00
AKurakin
d68c6409e8 meta поправил ещё раз и тест поправил 2023-01-17 16:49:52 +03:00
akulikov
299cbb1abe Some ValidatorRule and PlannerNewRequest validator 2023-01-17 16:17:49 +03:00
AKurakin
d42cc56964 meta поправил классы для валидации меты. WARN MetaServer:META SERVER >>> Класс для dealRegister не найден! 2023-01-17 16:03:51 +03:00
AKurakin
59fbe93045 account-service http://jira.mfd.msk:8088/browse/CLS-231 валидация 2023-01-17 14:44:53 +03:00
AKurakin
299ecd9b26 account-service http://jira.mfd.msk:8088/browse/CLS-230 (переделал) 2023-01-17 13:25:50 +03:00
AKurakin
8923d0e2cf z-distr update sh, без docker 2023-01-17 12:52:34 +03:00
AKurakin
3503246d2b account-service http://jira.mfd.msk:8088/browse/CLS-230 2023-01-17 12:52:34 +03:00
akulikov
a6100aca8f FieldRequiredRule, tests for DictionaryPresentRule 2023-01-17 12:45:31 +03:00
etreschenkov
fa1f347842 update meta 2.4.0.6 2023-01-17 12:06:42 +03:00
AKurakin
06b37a91cb clearing-service http://jira.mfd.msk:8088/browse/CLS-200 Сверка VerificationResult доделал 2023-01-17 11:19:24 +03:00
AKurakin
198daf9e62 imdg plannerMap shedulerDate == null значит вместо NPE запланировать на сегодня. TODO перенести эту правку после мёржа с веткой. 2023-01-17 11:13:27 +03:00
akurakin
6032bba359 clearing-service http://jira.mfd.msk:8088/browse/CLS-200 Сверка VerificationResult 2023-01-16 22:31:55 +03:00
akulikov
5167eb45f0 for test 2023-01-16 19:18:39 +03:00
AKurakin
f61f28eb7b dbf-importer почистил enum Task (98028949b5) 2023-01-16 18:23:05 +03:00
AKurakin
4c687e8d59 balance-service http://jira.mfd.msk:8088/browse/CLS-74 правильное обновление AccountBalanceService 2023-01-16 18:08:11 +03:00
AKurakin
b1cd2b7a0f balance-service Sdf16Executor поправил обновление sdf16 2023-01-16 16:46:47 +03:00
akulikov
58d0e9655d EnumPresentRule validator (commit for test) 2023-01-16 16:39:45 +03:00
AKurakin
a0d6bc2025 balance-service Sdf16ValidationRule добавил логи, тк. по bic не ищет, но не понял почему 2023-01-16 14:51:44 +03:00
AKurakin
c4e6cb142d balance-service http://jira.mfd.msk:8088/browse/CLS-74 правка обновления sdf09/10 2023-01-16 14:04:46 +03:00
AKurakin
394bcec2b3 scheduler-service отправка команд в очереди по расписанию 2023-01-16 12:19:47 +03:00
AKurakin
e22e422214 balance-service поправил валидаторы с null BigInt. 2. 2023-01-16 11:29:05 +03:00
AKurakin
9ae5936a01 balance-service поправил валидаторы с null BigInt 2023-01-16 10:52:36 +03:00
AKurakin
592b2cd02f securities-service http://jira.mfd.msk:8088/browse/CLS-16 validation delete 2023-01-13 20:35:46 +03:00
AKurakin
f85baa9800 dbf-export это uNIX time! 2023-01-13 19:04:11 +03:00
AKurakin
f6a60c023c dbf-export поправил работу с IMDG 2023-01-13 18:46:56 +03:00
AKurakin
5b529484a5 balance-service sfd09 поправил поиск по inn 2023-01-13 17:22:05 +03:00
etreschenkov
565ea49cdb fix BalanceError 2023-01-13 16:48:05 +03:00
AKurakin
a58ef60c99 balance-service sfd16 поправил поиск по inn,bic т.к. тип почемуто с плавающей запятой был 2023-01-13 16:40:48 +03:00
etreschenkov
fce1b1d28b fix crud operations on BankAccount 2023-01-13 16:12:49 +03:00
AKurakin
cfbd12ccc5 dbf-exporter поправил S_DF08_Converter.java 2023-01-13 15:36:52 +03:00
akulikov
0b1cc5639e validate from dictionaries (fix) 2023-01-13 15:25:07 +03:00
akulikov
f91e15f2a4 validate from dictionaries 2023-01-13 15:13:23 +03:00
AKurakin
98028949b5 dbf-importer добавил слушателей на новые Task 2023-01-13 14:29:34 +03:00
AKurakin
1f959be4f5 launcher-service вернул dcbdea0abf 2023-01-13 14:19:12 +03:00
akulikov
5b82cf4d22 validators 2023-01-13 14:08:21 +03:00
etreschenkov
12479c89b7 fix crud operations on BankAccount 2023-01-13 14:00:36 +03:00
AKurakin
62abb0d58b reports-service пофиксил запуск из jar (не мог прочитать ресурсы как файл), убрал томкат сервер (такое когда-то было несколько лет назад с проектом report-srvc) 2023-01-13 11:35:11 +03:00
AKurakin
30a9c39726 backend-api команда GREP для reports-service 2023-01-12 19:04:59 +03:00
akulikov
05dfccf5e2 http://jira.mfd.msk:8088/browse/CLS-51
add entry listener to map
static Util -> bean PlannerAllTodayMaker
fix condition removeIf
add enum Parent(tmpl, plnr, clnd)
add enum DayStatus(bday, doff)
2023-01-12 16:48:16 +03:00
AKurakin
ef3c8046ad Merge branch 'report_25_26_29' into dev 2023-01-11 17:08:20 +03:00
AKurakin
d9a1668f6a reports-service kafka - разделение видов команд отчётов 2023-01-11 17:06:37 +03:00
etreschenkov
3edbb87f6d meta version 2.4.5.0 2023-01-11 16:44:17 +03:00
AKurakin
563d03ffe5 reports-service отладил kafka 2023-01-11 16:29:31 +03:00
AKurakin
595ef708ac reports-service http://jira.mfd.msk:8088/browse/CLS-27 не надо группировать 2023-01-11 15:01:10 +03:00
AKurakin
1084a79a97 reports-service рефакторинг, оптимизация IMDF API, мелкие правки ReportPA_IV (название файла). 2023-01-11 14:43:54 +03:00
AKurakin
4ffdf50b39 reports-service рефакторинг ReportBR_0420315_P* 2023-01-11 12:17:17 +03:00
akulikov
b2028f5c8c . 2023-01-11 12:11:26 +03:00
akulikov
1c27ed93f9 cls26 collector 2023-01-11 12:10:50 +03:00
AKurakin
3f2aa8faa3 reports-service рефакторинг ReportBR_0420314_P* 2023-01-11 12:10:35 +03:00
akulikov
3a6fb8e5b2 cls27 collector 2023-01-11 12:06:57 +03:00
akulikov
dd101f97d0 cls29 collector10 fix 2023-01-11 11:50:45 +03:00
akulikov
828b3f6293 cls29 collector9 fix 2023-01-11 11:49:50 +03:00
akulikov
2d11ca2a45 cls29 collector8 fix 2023-01-11 11:49:00 +03:00
akulikov
4f7b529fcb cls29 collector6/7 fix 2023-01-11 11:47:44 +03:00
akulikov
e9fbf59a09 cls29 collector5 fix 2023-01-11 11:44:33 +03:00
akulikov
3d373d1678 cls29 collector4 fix 2023-01-11 11:42:59 +03:00
akulikov
f515bc5687 cls29 collector3 fix 2023-01-11 11:41:43 +03:00
akulikov
8661628eb9 cls29 collector2 fix 2023-01-11 11:40:53 +03:00
akulikov
8e48affdc8 cls29 collector1 fix 2023-01-11 11:38:24 +03:00
AKurakin
371e22eee4 reports-service запуск в режиме сервиса и в режиме утилиты 2023-01-11 11:21:56 +03:00
AKurakin
e1a73ad82a reports-service мелкая правка CLS-29 2023-01-11 11:13:30 +03:00
AKurakin
d6a1d7ee1e reports-service . 2023-01-11 10:42:05 +03:00
AKurakin
c116c93b37 reports-service добавил поддержку запуска SimpleReportCollector 2023-01-10 19:37:47 +03:00
AKurakin
324a1546c4 Merge branch 'dev' into report_25_26_29 2023-01-10 19:08:12 +03:00
AKurakin
521749db7c reports-service поправил CLS-27 2023-01-10 19:06:37 +03:00
etreshenkov
1aa55494f0 fix mapName for clearingCategoryDictionary 2023-01-10 18:35:53 +03:00
AKurakin
31959cd753 reports-service поправил CLS-29, часть CLS-27 2023-01-10 17:39:26 +03:00
akulikov
5851f2e11e cls-102 2023-01-10 17:36:57 +03:00
akulikov
a966d80995 cls-52/53, cls-92/93 2023-01-10 17:14:06 +03:00
AKurakin
552fbe26d0 reports-service поправил CLS-25 2023-01-10 16:52:07 +03:00
akulikov
801b1d88f7 . 2023-01-10 16:40:41 +03:00
akulikov
953c448bed . 2023-01-10 16:26:19 +03:00
AKurakin
90b5a8ad17 reports-service рефакторинг теста AbstractReportCollectorTest 2023-01-10 16:01:39 +03:00
akulikov
66d013d554 . 2023-01-10 15:53:30 +03:00
akulikov
d3c9bf2576 . 2023-01-10 15:48:36 +03:00
akulikov
94e29853af . 2023-01-10 15:13:11 +03:00
AKurakin
285f0960df reports-service рефакторинг запуска отчётов 2023-01-10 14:14:34 +03:00
akulikov
f2ec40d3c4 . 2023-01-10 14:02:38 +03:00
akulikov
2c74e24232 . 2023-01-10 13:36:05 +03:00
AKurakin
003024af9a reports-service refactoring collector name 2023-01-10 13:23:02 +03:00
akulikov
d70b537364 . 2023-01-10 12:55:04 +03:00
AKurakin
16a443b137 reports-service http://jira.mfd.msk:8088/browse/CLS-29 коллекторы для (0420312) [БТ 17.5] Сведения о клиринговом обеспечении 2023-01-10 12:13:38 +03:00
akulikov
52365c093f cls-52/53 2023-01-09 19:16:19 +03:00
AKurakin
0b27f29865 reports-service ReportId добавил в ключи соответствие частям имён файлов, т.к. говорили, что с фронта будут по имени файла приходить (рекомендовали так, необходимо согласовать с frontend-api). 2023-01-09 16:03:18 +03:00
AKurakin
fa5d6fbcc6 reports-service запускалки... Ещё доделать осталось. 2022-12-30 19:53:56 +03:00
ialbert
81b559b787 Merge remote-tracking branch 'origin/dev' into dev 2022-12-30 17:16:55 +03:00
ialbert
5aa360cb13 dbf-exporter Sdf08 fix 2022-12-30 17:16:45 +03:00
AKurakin
ba8dead115 Поправил закрытие пулов потоков Executors. 2022-12-30 17:16:01 +03:00
ialbert
19702fb5e0 Merge remote-tracking branch 'origin/dev' into dev 2022-12-30 16:52:33 +03:00
ialbert
e46835696f http://jira.mfd.msk:8088/browse/CLS-223 2022-12-30 16:52:05 +03:00
AKurakin
d36794b95d clearing-service http://jira.mfd.msk:8088/browse/CLS-200 TODO оделать сверку когда уточнят ТЗ и доабвить класс VerificationResult 2022-12-30 16:25:33 +03:00
AKurakin
9e9229588c reports-service точность 2 знака после запятой 2022-12-30 14:52:24 +03:00
AKurakin
ade57fd62a merge report-service, улучшение imdg Predicate API 2022-12-30 11:43:17 +03:00
AKurakin
2d2a0f5b9c reports-service правка XML разметки ReportBR_0420312_P1 2022-12-30 11:41:55 +03:00
AKurakin
55e0dc1c87 imdg, reports-service правки IMDG, правки выборки отчётов 2022-12-30 11:41:01 +03:00
AKurakin
220239de6e reports-service правки IMDG, т.к. Hazelcast <4.0.0 не умеет Instant сравнивать через SQL! 2022-12-29 19:14:37 +03:00
ialbert
fddb65868c User: update, auth processing, get id 2022-12-29 18:43:45 +03:00
akulikov
e794177155 some refactor 2022-12-29 18:05:43 +03:00
AKurakin
867f30de6a Merge branch 'dev' into report_25_26_29 2022-12-29 17:44:37 +03:00
akulikov
732ad424f4 tests for notifications 2022-12-29 17:09:54 +03:00
AKurakin
c7f6d097cc reports-service http://jira.mfd.msk:8088/browse/CLS-28 часть P2 2022-12-29 16:51:58 +03:00
ialbert
12fbacc765 Merge remote-tracking branch 'origin/dev' into dev 2022-12-29 16:33:13 +03:00
ialbert
71d01af671 separated user update from user auth success 2022-12-29 16:33:02 +03:00
mfd
6294fcd36d SPCEX-1.0.0.0 backend-api Deleted old transformation for meta 2022-12-29 15:17:43 +03:00
akulikov
f66c334100 ROOT_(NEW/CLOS/ACTV/BLKD/SSPD) notification, prepared for test 2022-12-29 15:12:50 +03:00
mfd
10cfe4f895 SPCEX-1.0.0.0 backend-api added data values to db.html 2022-12-29 15:04:22 +03:00
akulikov
f069bab18a RRPC, REX notification 2022-12-29 14:30:30 +03:00
psemenkov
8093bfe833 Поправил UserHistoryMapStore. 2022-12-29 13:19:09 +03:00
AKurakin
e80a94cd85 meta data генератор: добавил при перепроливке ON CONFLICT (ID) DO UPDATE 2022-12-29 13:17:13 +03:00
psemenkov
9bebeda22c Поправил тест Sdf01ExecutorTest. 2022-12-29 12:36:08 +03:00
ialbert
4d047f972f http://jira.mfd.msk:8088/browse/CLS-198 http://jira.mfd.msk:8088/browse/CLS-223 2022-12-29 12:30:38 +03:00
ialbert
820f59b46e Merge branch 'dev' into CLS-223-classes-mapstores-get 2022-12-29 12:06:13 +03:00
ialbert
cc5130b3ea http://jira.mfd.msk:8088/browse/CLS-198 2022-12-29 11:52:11 +03:00
AKurakin
5d23338904 meta ddl генератор: пересоздание таблиц через drop table.; поправил comment-objects COMMENT ON COLUMN;добавление поля *_HISTORY.EVENT_TYPE 2022-12-29 11:17:03 +03:00
mfd
e8c4088976 SPCEX-1.0.0.0 backend-api added document generation with xslt transformation 2022-12-29 10:58:13 +03:00
AKurakin
20b05c763d reports-service http://jira.mfd.msk:8088/browse/CLS-28 часть P1 (todo P2) 2022-12-28 20:19:56 +03:00
ialbert
6312389943 http://jira.mfd.msk:8088/browse/CLS-223 2022-12-28 19:11:37 +03:00
psemenkov
0f087c2f26 Merge remote-tracking branch 'origin/dev' into dev 2022-12-28 18:40:54 +03:00
psemenkov
6974ee2087 Добавил валидацию на null в AccountBalanceValidationRule.CompanyPresent, AccountBalanceValidationRule.AccountOk. Поправил тест AccountBalanceServiceTest. 2022-12-28 18:40:40 +03:00
ialbert
ad410be755 Merge remote-tracking branch 'origin/dev' into dev 2022-12-28 18:06:08 +03:00
ialbert
32ccbe2ced meta.xml 2.4.4.0 2022-12-28 18:05:58 +03:00
AKurakin
301d06a4c4 imdg http://jira.mfd.msk:8088/browse/CLS-198 добавил eventType в _HISTORY 2022-12-28 14:51:12 +03:00
psemenkov
cf6f80a0cf Закоментировал лишние поля(setShortName, setFullName, setTradingCode, setClearingCode, setRegistrationCode) в CompanyHistoryMapStore и CompanyMapStore. Поправил тест. 2022-12-28 12:57:22 +03:00
ialbert
a4a2476655 meta.xml 2.4.3.0 2022-12-28 12:13:15 +03:00
psemenkov
94fb771834 Теперь пути для AllMapStoreTest сетится програмно. Исправил ошибки: не сохранлись поля "ACCOUNT", "COMPANY_ID" у мапсторов AccountHistoryMapStore, BankAccountHistoryMapStore. Изменился тип у поля result в классе SDf17 (теперь нужен BigDecimal, был Integer его не хватает). По цепочке изменил Sdf16Executor, SDf17MapStore. 2022-12-28 11:36:26 +03:00
ialbert
f7d66bf1b1 http://jira.mfd.msk:8088/browse/CLS-63 2022-12-27 16:19:25 +03:00
AKurakin
c6c44b4549 reports-service мелкие правки 2022-12-27 15:25:37 +03:00
AKurakin
f38443ff55 Merge remote-tracking branch 'origin/dev' into report_25_26_29
# Conflicts:
#	clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java
#	clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java
#	clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java
2022-12-27 15:23:14 +03:00
ialbert
d80ab056d1 data.xml 2022-12-27 15:06:49 +03:00
ialbert
cf06177fa1 meta.xml 2.4.2.0 2022-12-27 14:29:52 +03:00
akulikov
59a93ee43f kafka reports 2022-12-27 11:27:50 +03:00
aalehin
19add71925 http://jira.mfd.msk:8088/browse/CLS-201
---
ProfileDocumentService set up
2022-12-26 20:35:59 +03:00
AKurakin
960d0e6b68 reports-service завершение работы сразу (доделать для сервиса, пока из консоли выключится сразу) 2022-12-26 20:32:10 +03:00
AKurakin
363a809afc reports-service http://jira.mfd.msk:8088/browse/CLS-29 начало, рефакторинг опять. 2022-12-26 20:32:10 +03:00
AKurakin
af8ff434ec reports-service refactoring 2022-12-26 20:32:10 +03:00
AKurakin
d0267aa78c reports-service добавление kafka, начало 2022-12-26 20:32:10 +03:00
AKurakin
5ce07b5404 reports-service завершение работы сразу (доделать для сервиса, пока из консоли выключится сразу) 2022-12-26 20:31:40 +03:00
AKurakin
c5c56f5d79 reports-service http://jira.mfd.msk:8088/browse/CLS-29 начало, рефакторинг опять. 2022-12-26 20:28:31 +03:00
ialbert
fa2ecfb3a7 Merge remote-tracking branch 'origin/dev' into dev 2022-12-26 20:20:12 +03:00
ialbert
1d63a859c6 http://jira.mfd.msk:8088/browse/CLS-213 добавил словари в мету 2022-12-26 20:20:04 +03:00
AKurakin
41147002f7 reports-service refactoring 2022-12-26 19:36:34 +03:00
AKurakin
ae3b24c8a1 reports-service добавление kafka, начало 2022-12-26 19:30:17 +03:00
AKurakin
9230dfb3b7 report-service merge report_25_26_29: first test of CLS-25 CLS-26, пока запуск из консоли 2022-12-26 18:59:29 +03:00
AKurakin
2b0167803b reports-service поправил мелкие баги, подключился к тестовому серверу 2022-12-26 18:31:44 +03:00
AKurakin
4b5667747a reports-service прикрутил генерацию тестов при запуске 2022-12-26 18:11:29 +03:00
akulikov
a8f15eff9d reportName 2022-12-26 17:40:40 +03:00
AKurakin
8f79cf6056 reports-service поправил тип ReportDataCollector 2022-12-26 17:20:54 +03:00
AKurakin
47df118474 reports-service http://jira.mfd.msk:8088/browse/CLS-25 понял про вложенность 2022-12-26 17:04:58 +03:00
aalehin
2ad1b73300 http://jira.mfd.msk:8088/browse/CLS-78
---
При добавлении записи в plannerTemplate и clearingCalendar в поле createdAt соответствующих таблиц не заполнялось время создания записи.
2022-12-26 16:55:51 +03:00
AKurakin
3f0fe1d901 reports-service http://jira.mfd.msk:8088/browse/CLS-25 refactoring 2022-12-26 16:23:55 +03:00
AKurakin
6a3433c26f http://jira.mfd.msk:8088/browse/CLS-25 http://jira.mfd.msk:8088/browse/CLS-26 рефакторинг коллекторов 2022-12-26 15:55:53 +03:00
akulikov
2c5dbe9143 reportName 2022-12-26 15:51:54 +03:00
akulikov
22598b867f reportName 2022-12-26 15:45:07 +03:00
ialbert
a5320f36f3 MoneyMarketSecurity GET filter 2022-12-26 15:22:52 +03:00
AKurakin
e18d8c9664 reports-service добавил настройку ReportModuleOut 2022-12-26 15:21:48 +03:00
akulikov
eed33ce35b insert values in docx (raw) 2022-12-26 14:38:31 +03:00
ialbert
17b298b5a4 meta.xml 2.4.1.0 2022-12-26 14:22:21 +03:00
akulikov
a396d54c7b Merge branch 'dev' into report_25_26_29 2022-12-26 13:50:43 +03:00
ialbert
095b2d86d1 MoneyMarketSecurityUpdateRequest, CommonDeleteRequest -> WithId
Planner, PlannerTemplate fill created/updated
2022-12-26 13:14:04 +03:00
ialbert
e278d65325 поправил экранирование JSON для UserSettings 2022-12-23 15:40:59 +03:00
ialbert
7a057e1ebf UserSettings update fix 2022-12-23 13:14:12 +03:00
akulikov
ddb8d47f3c Merge branch 'dev' into report_25_26_29
# Conflicts:
#	platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Market.java
2022-12-23 12:19:34 +03:00
ialbert
0015f651a0 http://jira.mfd.msk:8088/browse/CLS-198 2022-12-22 18:15:26 +03:00
ialbert
487752def2 http://jira.mfd.msk:8088/browse/CLS-198 2022-12-22 17:27:07 +03:00
ialbert
64d889566d http://jira.mfd.msk:8088/browse/CLS-198 2022-12-22 15:04:39 +03:00
ialbert
edbe6b928b Merge branch 'dev' into CLS-198-new-meta-2.4 2022-12-22 13:15:46 +03:00
ialbert
5b89f57456 dbf-exporter Sdf17 fix 2022-12-22 12:57:04 +03:00
ialbert
148bd3a95a dbf-exporter Sdf17 fix 2022-12-22 12:55:51 +03:00
ialbert
9b0acaeb7a http://jira.mfd.msk:8088/browse/CLS-198 2022-12-22 11:44:56 +03:00
ialbert
bbc10ca13b balance-service fix 2022-12-21 16:46:19 +03:00
ialbert
292675e92b backend-api LocalTime meta parsing fix 2022-12-21 15:45:15 +03:00
ialbert
b6c25744d2 scheduler-service logs fix 2022-12-21 13:03:07 +03:00
ialbert
dfbc350ed2 scheduler-service build fix 2022-12-21 12:41:01 +03:00
ialbert
dd117b09b1 balance-service fix 2022-12-21 12:33:38 +03:00
ialbert
b4c3388e06 dbf-importer log fix 2022-12-21 12:09:52 +03:00
ialbert
fd7ee9a989 http://jira.mfd.msk:8088/browse/CLS-16 2022-12-20 17:57:00 +03:00
AKurakin
c4734252df http://jira.mfd.msk:8088/browse/CLS-25 http://jira.mfd.msk:8088/browse/CLS-26 начало http://jira.mfd.msk:8088/browse/CLS-29 - написал выборку данных для формирования частей отчёта. TO DO 2022-12-20 15:04:24 +03:00
ialbert
94f878c0b4 Merge remote-tracking branch 'origin/dev' into dev 2022-12-20 13:18:59 +03:00
ialbert
bfcf9c919d url актуальной тестовой базы в imdg/application.properties 2022-12-20 13:18:51 +03:00
akulikov
52a9f6e00d insert values in docx (raw) 2022-12-19 19:36:53 +03:00
aalehin
8d6b5ef9be http://jira.mfd.msk:8088/browse/CLS-63
---
fix up
2022-12-19 16:33:55 +03:00
aalehin
9464b209de http://jira.mfd.msk:8088/browse/CLS-63
---
исправил ошибку
2022-12-19 16:15:23 +03:00
ialbert
0b7c73b0d0 SDF16 import fix 2022-12-19 15:38:16 +03:00
aalehin
2474be998b http://jira.mfd.msk:8088/browse/CLS-63
---
изменил UserAuthAction
2022-12-19 14:28:48 +03:00
ialbert
39c4b7d30f Merge remote-tracking branch 'origin/dev' into dev 2022-12-19 13:26:14 +03:00
ialbert
c4149935a0 dbf-importer added error directory 2022-12-19 13:26:04 +03:00
AKurakin
b67179ec8b http://jira.mfd.msk:8088/browse/CLS-25 добавил класс LiabilitiesClaimsAssets. TODO заполнение по CLS-25 2022-12-16 19:55:44 +03:00
ialbert
b25d9de2bd SDf12 importer Long fix 2022-12-16 18:59:06 +03:00
ialbert
f2b95b373f swagger fix 2022-12-16 18:42:07 +03:00
ialbert
347aef48a2 ActionType fix 2022-12-16 16:51:34 +03:00
aalehin
7e70f2ee94 http://jira.mfd.msk:8088/browse/CLS-57
---
task manager update and launcher service
2022-12-15 19:24:31 +03:00
ialbert
30a3f17200 Merge remote-tracking branch 'origin/dev' into dev 2022-12-15 12:29:11 +03:00
ialbert
471976dc9d meta 1.3.2.0 2022-12-15 12:28:46 +03:00
akulikov
b663824a5a docx, search keys from doc 2022-12-15 12:04:35 +03:00
psemenkov
15f2180f29 Merge remote-tracking branch 'origin/dev' into dev 2022-12-15 11:16:36 +03:00
psemenkov
d3657752b2 добавил Sdf01ExecutorTest пока без реализации 2022-12-15 11:16:13 +03:00
ialbert
6381e25193 http://jira.mfd.msk:8088/browse/CLS-218 2022-12-14 18:54:04 +03:00
psemenkov
8d2881c3eb Merge remote-tracking branch 'origin/dev' into dev 2022-12-14 14:24:23 +03:00
psemenkov
59e2b7a3b8 Fixing AccountBalanceServiceTest. And ImdgTransactionalHazelcast.getSingleObjectByFieldValues 2022-12-14 14:24:12 +03:00
aalehin
74cb4d75c0 http://jira.mfd.msk:8088/browse/CLS-37
---
рефактор TaskManager
2022-12-14 14:12:50 +03:00
ialbert
c773017570 http://jira.mfd.msk:8088/browse/CLS-178 2022-12-14 12:40:09 +03:00
ialbert
7a564fce21 Merge remote-tracking branch 'origin/dev' into dev 2022-12-14 11:46:47 +03:00
ialbert
a15fae4885 http://jira.mfd.msk:8088/browse/CLS-175 2022-12-14 11:46:35 +03:00
aalehin
79adbc64c1 http://jira.mfd.msk:8088/browse/CLS-37
---
добавил значения задач
2022-12-14 10:45:22 +03:00
aalehin
b225e0d3d9 http://jira.mfd.msk:8088/browse/CLS-37
---
перенес task manager
2022-12-14 10:41:37 +03:00
aalehin
9830cc8805 task manager... 2022-12-13 19:56:47 +03:00
psemenkov
91433d2710 Merge remote-tracking branch 'origin/dev' into dev 2022-12-13 18:47:10 +03:00
psemenkov
ec0a5edd67 Adding AccountBalanceServiceTest. 2022-12-13 18:46:42 +03:00
ialbert
c6fc217adc http://jira.mfd.msk:8088/browse/CLS-205 2022-12-13 15:16:40 +03:00
ialbert
d7e570fa39 http://jira.mfd.msk:8088/browse/CLS-205 2022-12-13 15:15:30 +03:00
ialbert
33193b9746 http://jira.mfd.msk:8088/browse/CLS-42 2022-12-13 14:22:47 +03:00
ialbert
48f02b2af3 http://jira.mfd.msk:8088/browse/CLS-36 2022-12-12 18:56:10 +03:00
ialbert
3bc6c83b1c http://jira.mfd.msk:8088/browse/CLS-36 parallel file execution temp fix 2022-12-12 18:55:03 +03:00
ialbert
7ddad9bd21 Merge remote-tracking branch 'origin/dev' into dev 2022-12-12 17:09:03 +03:00
ialbert
d28b12f68e http://jira.mfd.msk:8088/browse/CLS-36 bug fix 2022-12-12 17:08:35 +03:00
psemenkov
f5afbd5c9f Добавил мапсторы в тест и исправил SessionMapStore, PaymentInstructionMapStore, NotificationMapStore, ManagementJournalMapStore. 2022-12-12 15:42:41 +03:00
psemenkov
d377a788f2 Поправил SDf11, SDf11MapStore, Sdf11Builder, SDf03, SDf03MapStore, Sdf03Builder как в мета 2022-12-12 14:44:14 +03:00
aalehin
eedb15dba7 http://jira.mfd.msk:8088/browse/CLS-63
---
исправил нлп
2022-12-12 13:31:53 +03:00
aalehin
55cd288dd9 http://jira.mfd.msk:8088/browse/CLS-57
---
scheduler_service: добавление записи в launcher через новый сервис
2022-12-12 13:15:43 +03:00
ialbert
d4767d5937 http://jira.mfd.msk:8088/browse/CLS-35 2022-12-12 13:12:58 +03:00
ialbert
70bfd94b64 http://jira.mfd.msk:8088/browse/CLS-35 2022-12-12 11:04:48 +03:00
ialbert
e0dcd24604 http://jira.mfd.msk:8088/browse/CLS-69 2022-12-09 14:35:31 +03:00
ialbert
ad84cbd6a6 http://jira.mfd.msk:8088/browse/CLS-148 keyRate -> rate 2022-12-09 12:43:43 +03:00
ialbert
fc42ca0c8f Merge remote-tracking branch 'origin/dev' into dev 2022-12-09 12:16:19 +03:00
ialbert
39410874a9 meta update 2022-12-09 12:15:44 +03:00
aalehin
094659eca1 http://jira.mfd.msk:8088/browse/CLS-78
---
fix up
2022-12-08 19:37:07 +03:00
aalehin
4059c57c9e http://jira.mfd.msk:8088/browse/CLS-51
---
small fix up
2022-12-08 19:35:07 +03:00
aalehin
52605cfc48 http://jira.mfd.msk:8088/browse/CLS-51
---
plannerAllToday set up
2022-12-08 19:33:56 +03:00
ialbert
af5d18ba36 fixed not found wrong status 500 -> 404 2022-12-08 18:15:55 +03:00
ialbert
6a1951db28 http://jira.mfd.msk:8088/browse/CLS-69 2022-12-08 17:06:38 +03:00
aalehin
e65973cf90 plannerAllToday fixup 2022-12-08 13:37:20 +03:00
ialbert
2b1efc3bcb Merge remote-tracking branch 'origin/dev' into dev 2022-12-07 19:22:40 +03:00
ialbert
dcbdea0abf http://jira.mfd.msk:8088/browse/CLS-100 добавил сохранение объектов Launcher 2022-12-07 19:22:32 +03:00
akulikov
c41e9cc0f1 report-service: all-reports for cls-[25, 26, 27, 28, 29, 52, 53, 92, 93, 102] 2022-12-07 18:31:29 +03:00
ialbert
834150563a Merge remote-tracking branch 'origin/dev' into dev 2022-12-07 17:58:57 +03:00
ialbert
2de7c9876e http://jira.mfd.msk:8088/browse/CLS-100 2022-12-07 17:37:07 +03:00
psemenkov
08c1789d36 Fixing loading MoneyMarketSecurity in MoneyMarketSecurityMapStore 2022-12-07 15:49:11 +03:00
ialbert
a5a3136ed3 Merge remote-tracking branch 'origin/dev' into dev 2022-12-07 14:41:32 +03:00
ialbert
e8af75ee78 http://jira.mfd.msk:8088/browse/CLS-80 2022-12-07 14:41:20 +03:00
akulikov
92313b9b1e report-service: Обновил имеющиеся таблицы по ТЗ, обновил само ТЗ 2022-12-07 14:29:40 +03:00
ialbert
c760bd4d20 Merge branch 'CLS-80-backend-scheduler' into dev
# Conflicts:
#	clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/PlanerAllTodayController.java
2022-12-07 13:07:04 +03:00
psemenkov
194f14a2d8 Merge remote-tracking branch 'origin/dev' into dev 2022-12-07 12:36:30 +03:00
psemenkov
4a9708b205 Fixing store and loading companyInfo in CompanyMapStore 2022-12-07 12:36:11 +03:00
AKurakin
9d7e619954 dictionary поправил комментарии 2022-12-07 12:07:04 +03:00
psemenkov
04905c4e0a PlannerAllToday и planner_all_today изменились названия полей source -> parent, origId -> parentId. Затронуло SchedulerAllTodayBackendGetAll, PlannerAllTodayMapStore, PlannerAllToday. 2022-12-07 11:55:06 +03:00
psemenkov
5ee3129316 fixing MoneyMarketSecurityMapStore 2022-12-07 11:31:09 +03:00
psemenkov
5a0d2c2cb5 Merge remote-tracking branch 'origin/dev' into dev 2022-12-07 11:18:32 +03:00
psemenkov
53b0487e1f Изменились MoneyMarketSecurityNewRequest, MoneyMarketSecurityServiceDisabled, MoneyMarketSecurityFactory, MoneyMarketSecurityNewAction, MoneyMarketSecurityUpdateAction, MoneyMarketSecurityUpdateRequest в этих классах изменил Long nominalCurrencyId на String nominalCurrency (в мета нет nominalCurrencyId но есть nominalCurrency ) сюда не стал добавлять termType т.к. его нет в мета post и put.
MoneyMarketSecurityBackendGetFields, MoneyMarketSecurity, MoneyMarketSecurityBackendGetAllOld,  MoneyMarketSecurityMapStore поменял Long на String nominalCurrency и добавил termType
2022-12-07 11:18:07 +03:00
ialbert
902290f5f8 Merge remote-tracking branch 'origin/dev' into dev 2022-12-06 18:35:45 +03:00
ialbert
cf7bc22999 http://jira.mfd.msk:8088/browse/CLS-191 2022-12-06 18:35:32 +03:00
aalehin
9f04ebc688 http://jira.mfd.msk:8088/browse/CLS-63
---
fix up
2022-12-06 18:31:24 +03:00
psemenkov
8e191870b2 Merge remote-tracking branch 'origin/dev' into dev 2022-12-06 17:40:02 +03:00
psemenkov
c1e66ed914 rename feald TradingStatus -> DayStatus for ClearingCalendar and other entities 2022-12-06 17:36:17 +03:00
psemenkov
08dd60e18e delete feald account from BankAccount and other entities 2022-12-06 17:13:17 +03:00
ialbert
b8a218b0c7 Merge remote-tracking branch 'origin/dev' into dev 2022-12-06 16:44:09 +03:00
ialbert
56f027c313 http://jira.mfd.msk:8088/browse/CLS-75 added companyInfo GET method 2022-12-06 16:43:54 +03:00
psemenkov
f70d36d7bd Merge remote-tracking branch 'origin/dev' into dev 2022-12-06 16:29:40 +03:00
psemenkov
45c3fb745a delete feald account from BankAccount and other entity 2022-12-06 16:29:25 +03:00
ialbert
8633081e6d KeyRateService log fix 2022-12-06 16:19:23 +03:00
ialbert
59942baf9b http://jira.mfd.msk:8088/browse/CLS-74 bug fix 2022-12-06 15:51:15 +03:00
ialbert
d8c0401a59 Merge remote-tracking branch 'origin/dev' into dev 2022-12-06 15:24:40 +03:00
ialbert
abf51317ca http://jira.mfd.msk:8088/browse/CLS-130 добавил обновление PaymentInstruction.transactionStatus по sdf04 2022-12-06 15:24:30 +03:00
aalehin
2ec7c0fdc1 http://jira.mfd.msk:8088/browse/CLS-63
---
...
2022-12-06 13:45:40 +03:00
ialbert
0b24bae280 http://jira.mfd.msk:8088/browse/CLS-191 2022-12-05 18:35:25 +03:00
ialbert
c8527293b7 Merge branch 'master_meta_update' into dev
# Conflicts:
#	clearing-parent/backend-api/src/main/resources/meta/meta.xml
2022-12-02 14:50:34 +03:00
ialbert
aa23776d28 http://jira.mfd.msk:8088/browse/CLS-80 2022-12-02 14:01:33 +03:00
ialbert
874eaaa8ce CookieSameSite bug fix 2022-12-02 13:57:26 +03:00
ialbert
59110cdff8 http://jira.mfd.msk:8088/browse/CLS-80 2022-12-02 13:56:58 +03:00
ialbert
11ed1ff66b http://jira.mfd.msk:8088/browse/CLS-130 sdf03 sdf11 2022-12-01 16:22:08 +03:00
aalehin
6d14c43994 scheduler set up 2022-12-01 12:28:07 +03:00
ialbert
ca4483fe6f Merge branch 'CLS-130' into dev 2022-12-01 11:16:37 +03:00
ialbert
fa0b7ba787 http://jira.mfd.msk:8088/browse/CLS-130 sdf03 sdf11 2022-12-01 11:15:46 +03:00
ialbert
ce767ceae1 http://jira.mfd.msk:8088/browse/CLS-130 clearing-service 2022-11-29 19:21:56 +03:00
aalehin
49729c4d08 http://jira.mfd.msk:8088/browse/CLS-51
---
some fix up
2022-11-29 19:10:53 +03:00
ialbert
d5a7154a25 Merge remote-tracking branch 'origin/dev' into dev 2022-11-29 16:51:06 +03:00
ialbert
e8bc165537 http://jira.mfd.msk:8088/browse/CLS-97 2022-11-29 16:50:55 +03:00
aalehin
86e9b724ac http://jira.mfd.msk:8088/browse/CLS-51
---
SchedulerAllTodayService fix up
2022-11-29 16:36:12 +03:00
aalehin
d7d098990b http://jira.mfd.msk:8088/browse/CLS-51
---
1) application.properties
2) logback.xml
2022-11-29 10:56:23 +03:00
ialbert
30ec2ceeec http://jira.mfd.msk:8088/browse/CLS-51
---
scheduler service (addition of scheduler)
2022-11-28 21:36:17 +03:00
aalehin
58d605d7c1 http://jira.mfd.msk:8088/browse/CLS-63
---
fix-up of roles
2022-11-28 14:17:26 +03:00
ialbert
07443234e1 http://jira.mfd.msk:8088/browse/CLS-73 выгрузка sdf10 добавил заготовку для журналирования 2022-11-25 20:18:38 +03:00
ialbert
d25e8d9f4f http://jira.mfd.msk:8088/browse/CLS-73 выгрузка sdf10 добавил заготовку для журналирования 2022-11-25 19:19:56 +03:00
ialbert
e463d83084 http://jira.mfd.msk:8088/browse/CLS-99 dbf-import загрузка Sdf04 2022-11-25 12:58:10 +03:00
ialbert
59e748b18a http://jira.mfd.msk:8088/browse/CLS-98 2022-11-25 12:32:15 +03:00
ialbert
c720df9741 http://jira.mfd.msk:8088/browse/CLS-97 2022-11-25 12:31:34 +03:00
ialbert
45e163d1b7 meta update 2022-11-22 12:06:45 +03:00
ialbert
3397a28692 http://jira.mfd.msk:8088/browse/CLS-186 2022-11-18 18:53:05 +03:00
ialbert
e6c818b05f Merge branch 'get-actions-meta' into dev 2022-11-09 13:56:49 +03:00
ialbert
f97db6009f meta: getAll responses -> CommonGetAllResponse 2022-11-07 12:15:14 +03:00
ialbert
1adc00a11e meta get all method unified exapmle 2022-11-07 11:56:55 +03:00
ialbert
fac3f80184 meta: example for money market security and test 2022-11-03 16:21:24 +03:00
ialbert
0ed21584c1 meta.server.xslt added classes 2022-11-03 11:59:40 +03:00
ialbert
bbf64d6230 meta.xml classes 2022-11-03 11:57:55 +03:00
ialbert
f3b518df3e meta.xml new version 2022-11-03 11:26:07 +03:00
etreshenkov
b61aeb43ac add sdf16 validator 2022-11-02 18:02:02 +03:00
ialbert
47b0e6d6c4 meta parsing 2022-11-01 18:24:36 +03:00
etreshenkov
5422b93d34 add sdf16 validator 2022-11-01 17:29:26 +03:00
ialbert
15f42c96b8 http://jira.mfd.msk:8088/browse/CLS-74 2022-11-01 16:31:48 +03:00
ialbert
7cb1101b52 http://jira.mfd.msk:8088/browse/CLS-74 validation 2022-11-01 14:53:21 +03:00
etreshenkov
da14e08665 add sdf16 executor 2022-11-01 12:31:03 +03:00
ialbert
1cbee9a716 Merge remote-tracking branch 'origin/dev' into dev 2022-11-01 12:13:42 +03:00
ialbert
0b89f03b57 http://jira.mfd.msk:8088/browse/CLS-74 fixed validation 2022-11-01 12:13:23 +03:00
etreshenkov
de627b9e56 add executor config 2022-11-01 12:13:11 +03:00
etreshenkov
f771d755e3 importer/exporter 2022-11-01 11:28:19 +03:00
etreschenkov
0472cbc85e some refactoring balance-service 2022-10-31 18:43:22 +03:00
ialbert
10298d1880 Merge remote-tracking branch 'origin/dev' into dev 2022-10-31 11:35:14 +03:00
ialbert
08315f7518 http://jira.mfd.msk:8088/browse/CLS-186 2022-10-31 11:35:02 +03:00
etreschenkov
1dbc26f20a http://jira.mfd.msk:8088/browse/CLS-67 2022-10-31 11:27:28 +03:00
ialbert
927b033763 http://jira.mfd.msk:8088/browse/CLS-101
http://jira.mfd.msk:8088/browse/CLS-70
2022-10-28 15:04:01 +03:00
ialbert
3193e7014f http://jira.mfd.msk:8088/browse/CLS-101
http://jira.mfd.msk:8088/browse/CLS-70
2022-10-28 13:30:10 +03:00
ialbert
ca806a42e6 meta.server.xslt new version 2022-10-28 11:25:16 +03:00
ialbert
f2b28d0e3c http://jira.mfd.msk:8088/browse/CLS-70
http://jira.mfd.msk:8088/browse/CLS-101
2022-10-28 09:47:14 +03:00
ialbert
a044308ee0 Merge remote-tracking branch 'origin/dev' into dev 2022-10-28 09:11:00 +03:00
ialbert
dd958a36eb http://jira.mfd.msk:8088/browse/CLS-11 добавил возможность валидации для экшенов 2022-10-28 09:10:49 +03:00
etreshenkov
8c3771369b add build.cmd 2022-10-27 17:44:24 +03:00
etreshenkov
4390380893 Merge remote-tracking branch 'origin/psemenkov' into dev
# Conflicts:
#	clearing-parent/backend-api/pom.xml
2022-10-27 16:37:15 +03:00
etreshenkov
8cdd8ce17b fix tests after merge 2022-10-27 15:40:22 +03:00
ialbert
bd569825eb fixme balance-service validation 2022-10-27 15:34:29 +03:00
etreshenkov
5427c37028 Merge remote-tracking branch 'origin/mivanov' into dev
# Conflicts:
#	clearing-parent/utility-service/pom.xml
#	platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/KeyRateNewRequest.java
2022-10-27 14:50:46 +03:00
etreshenkov
c5b9cdc0a7 Merge branch 'psemenkov' into dev 2022-10-27 14:48:26 +03:00
ialbert
ec07c5be47 http://jira.mfd.msk:8088/browse/CLS-181 2022-10-27 12:30:47 +03:00
ialbert
628aa59727 http://jira.mfd.msk:8088/browse/CLS-181 2022-10-27 12:30:09 +03:00
ialbert
f9c512373e http://jira.mfd.msk:8088/browse/CLS-181 get meta.json method 2022-10-27 12:28:20 +03:00
ialbert
03a7f1056a добавил Access-Control-Allow-Methods, Access-Control-Allow-Headers, пока *
добавил настройку для SameSite
2022-10-27 09:38:11 +03:00
ialbert
b5cac139a8 ClearingMemberCategory new endpoint 2022-10-21 20:06:50 +03:00
ialbert
814c14d3b9 ClearingMemberCategory new endpoint 2022-10-21 19:33:45 +03:00
ialbert
30a9cc989e keycloak auth log fix 2022-10-21 16:00:27 +03:00
ialbert
cff3e0bcd6 keycloak auth log all roles 2022-10-21 15:42:56 +03:00
ialbert
19d013c096 imdg connect log fix 2022-10-21 12:26:20 +03:00
ialbert
5d08d3e438 removed unused class, log fix 2022-10-21 12:25:28 +03:00
ialbert
c242fde299 http://jira.mfd.msk:8088/browse/CLS-16 security status/created/updated 2022-10-21 11:46:13 +03:00
ialbert
edacf7ebea moneyMarketSecurity securityId fix 2022-10-20 20:04:04 +03:00
ialbert
7cf44f3879 KeyRate GET rate -> keyRate 2022-10-20 15:27:36 +03:00
ialbert
2a725b6f37 KeyRate new workflow status fix 2022-10-20 14:50:41 +03:00
ialbert
216d28767d http://jira.mfd.msk:8088/browse/CLS-11 2022-10-19 16:46:30 +03:00
ialbert
7ebbf89844 LocalDate request deserialization fix 2022-10-19 16:18:36 +03:00
ialbert
4df954baa2 Company map store fix 2022-10-19 15:51:05 +03:00
ialbert
20bbf515ff Company GET format 2022-10-19 15:34:26 +03:00
ialbert
c8f856fbed http://jira.mfd.msk:8088/browse/CLS-106 2022-10-19 13:31:06 +03:00
ialbert
d90c0fbc19 KeyRate controller fix 2022-10-19 11:31:41 +03:00
ialbert
7188362693 MoneyMarketSecurity controller fix 2022-10-19 11:29:30 +03:00
ialbert
0e8ec87211 MoneyMarketSecurity fix 2022-10-18 19:26:12 +03:00
ialbert
8ee414ab1b Merge remote-tracking branch 'origin/dev' into dev 2022-10-14 18:27:23 +03:00
ialbert
d9293624a9 delete supported for all 2022-10-14 18:27:12 +03:00
etreschenkov
e9b90b591e update ddl 2022-10-14 18:24:23 +03:00
ialbert
d56c0371da ddl 2022-10-14 18:06:56 +03:00
ialbert
f406c7eda3 StatementService fix 2022-10-14 18:01:42 +03:00
ialbert
e1dd66c502 bug fix 2022-10-14 17:59:47 +03:00
ialbert
b7cbcbbe54 fix dates 2022-10-14 14:45:54 +03:00
ialbert
72667e5dec StatementService fix 2022-10-14 14:44:30 +03:00
etreshenkov
a217295123 update meta and sqls 2022-10-14 14:03:15 +03:00
ialbert
a73845cfd9 http://jira.mfd.msk:8088/browse/CLS-131 2022-10-14 13:14:39 +03:00
ialbert
ed8a4c0e05 StatementService account request fix 2022-10-14 13:08:40 +03:00
ialbert
9884d8228e StatementService fix fields 2022-10-14 13:06:47 +03:00
ialbert
89ba1d2122 http://jira.mfd.msk:8088/browse/CLS-2 2022-10-14 10:33:45 +03:00
ialbert
ee3bca8ed2 скорректировал коды ошибок на backend-api 2022-10-14 10:01:22 +03:00
ialbert
7682259396 http://jira.mfd.msk:8088/browse/CLS-1 companyInfo description length 2022-10-13 18:34:23 +03:00
ialbert
ca31c7cc87 переименование ClearingMemberCategoryDictionary -> ClearingCategoryDictionary по мете 2022-10-13 18:25:52 +03:00
ialbert
be38359fc0 Merge remote-tracking branch 'origin/dev' into dev 2022-10-13 18:11:24 +03:00
ialbert
2cb220872e изменения по мете 2022-10-13 18:11:14 +03:00
etreshenkov
d93895655d fix localDate 2022-10-13 18:05:51 +03:00
ialbert
3f5ca4176c Merge remote-tracking branch 'origin/dev' into dev 2022-10-13 18:03:37 +03:00
ialbert
b493fbe7c5 meta excluded from resources 2022-10-13 18:03:29 +03:00
etreshenkov
c9aa070fe3 Merge remote-tracking branch 'origin/imdg_refactoring' into dev 2022-10-13 17:58:54 +03:00
psemenkov
fc8a412505 some refactoring 2022-10-13 13:04:26 +03:00
ialbert
fe1bdc63fd meta plugin 2022-10-13 12:23:13 +03:00
psemenkov
6feacbcb5d Merge remote-tracking branch 'origin/dev' into imdg_refactoring 2022-10-13 11:53:28 +03:00
psemenkov
5e73960f71 some refactoring 2022-10-13 11:53:01 +03:00
psemenkov
3216c04a9f Added tests for object MapStore 2022-10-13 09:50:55 +03:00
ialbert
df24344b8d http://jira.mfd.msk:8088/browse/CLS-152 ClearingMemberCategoryDictionaryMapStore 2022-10-12 19:59:56 +03:00
ialbert
431cf174d2 http://jira.mfd.msk:8088/browse/CLS-152 2022-10-12 19:40:39 +03:00
ialbert
31ad649a1b http://jira.mfd.msk:8088/browse/CLS-151 2022-10-12 19:22:56 +03:00
ialbert
ea82d82052 Merge remote-tracking branch 'origin/dev' into dev 2022-10-12 19:10:28 +03:00
ialbert
41f9c9f032 http://jira.mfd.msk:8088/browse/CLS-152 2022-10-12 19:09:18 +03:00
ialbert
8c41062235 http://jira.mfd.msk:8088/browse/CLS-151 2022-10-12 18:40:46 +03:00
ialbert
7eaec47ad3 http://jira.mfd.msk:8088/browse/CLS-152 2022-10-12 18:07:50 +03:00
etreschenkov
5323229c29 add standart plugin 2022-10-12 16:59:31 +03:00
psemenkov
b53dfda7a1 Added tests for dictionary MapStore(with CompanyHistoryMapStore) 2022-10-12 15:01:46 +03:00
ialbert
ab407edb8c http://jira.mfd.msk:8088/browse/CLS-151 2022-10-12 13:17:21 +03:00
ialbert
5f2abbd2d9 http://jira.mfd.msk:8088/browse/CLS-151 2022-10-11 20:18:06 +03:00
psemenkov
1adfb2f7a7 Merge remote-tracking branch 'origin/dev' into imdg_refactoring
# Conflicts:
#	clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/statement/Statement.java
#	clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/user/UserConnect.java
#	clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/IMDGApplication.java
#	clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/RelationMapStore.java
#	clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/StatementMapStore.java
#	clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/UserConnectMapStore.java
#	clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/HazelcastConfiguration.java
#	clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/PoolMapConfigs.java
2022-10-11 12:28:55 +03:00
psemenkov
86cc64d4a5 Added tests for dictionary MapStore(without CompanyHistoryMapStore) 2022-10-11 12:09:34 +03:00
ialbert
cdd322d628 hazelcast port setting changed to default 2022-10-10 17:54:31 +03:00
psemenkov
165f1df99b Added tests for business event MapStore(without CompanyHistoryMapStore) 2022-10-10 16:23:34 +03:00
ialbert
177b0f8602 company map store profile store fix 2022-10-10 16:09:30 +03:00
ialbert
dae87c4e9b company map store profile load fix 2022-10-10 15:48:45 +03:00
ialbert
5beea2d551 http://jira.mfd.msk:8088/browse/CLS-75 company controller nlp fix 2022-10-10 14:48:30 +03:00
ialbert
25cbd0e47e company-service settings fix 2022-10-10 10:08:21 +03:00
psemenkov
2e4107e461 Added tests for businessobject MapStore 2022-10-07 16:26:48 +03:00
ialbert
d7a70d1811 http://jira.mfd.msk:8088/browse/CLS-50 2022-10-06 15:35:26 +03:00
psemenkov
adca2cdd1a Missing test delete for MapStore 2022-10-06 12:31:22 +03:00
psemenkov
b134b94dba Added testing delete for MapStore 2022-10-06 12:15:22 +03:00
ialbert
7800b5cdab fix statement service 2022-10-06 10:13:07 +03:00
ialbert
63e54ae918 http://jira.mfd.msk:8088/browse/CLS-36 2022-10-06 09:37:25 +03:00
ialbert
10fa810151 http://jira.mfd.msk:8088/browse/CLS-36 2022-10-05 20:19:16 +03:00
psemenkov
7b237924dd Add AllMapStoreTest for testing MapStore 2022-10-05 18:58:47 +03:00
ialbert
94fbfe9d44 http://jira.mfd.msk:8088/browse/CLS-41 2022-10-05 15:49:28 +03:00
ialbert
871332dc53 http://jira.mfd.msk:8088/browse/CLS-34 2022-10-05 11:11:30 +03:00
AKurakin
ae3cc78586 IMDG http://jira.mfd.msk:8088/browse/CLS-47 2022-10-04 15:20:09 +03:00
AKurakin
dd2cdaf45c IMDG http://jira.mfd.msk:8088/browse/CLS-47, http://jira.mfd.msk:8088/browse/CLS-58 поправил некоторые мапсторы и классы, в соответствии с метой (не все). 2022-10-04 15:14:58 +03:00
AKurakin
02c1936ecb DDL, meta обновление 04.10.2022, http://jira.mfd.msk:8088/browse/CLS-47 http://jira.mfd.msk:8088/browse/CLS-58 2022-10-04 13:29:14 +03:00
etreschenkov
b123014b57 delete method for mapstore revision 2022-10-04 12:50:42 +03:00
etreschenkov
e19661b449 Merge branch 'imdg_refactoring' into dev
# Conflicts:
#	clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/PoolMapConfigs.java
#	platform-parent/platform-imdg-api/src/main/java/ru/spcex/clearing/imdg/IMDGDistributedNames.java
2022-10-04 12:49:31 +03:00
etreschenkov
b34f22439b some refactoring 2022-10-04 12:43:04 +03:00
etreschenkov
f953edc11d add kafka consumer 2022-10-04 12:42:47 +03:00
etreschenkov
7caa776828 fix bugs 2022-10-04 11:43:27 +03:00
aalehin
9f0f036356 http://jira.mfd.msk:8088/browse/CLS-21
---
fix-up
2022-10-03 16:25:34 +03:00
ialbert
b0d3e4ac5a http://jira.mfd.msk:8088/browse/CLS-65 2022-10-03 15:33:51 +03:00
ialbert
6120849cd2 http://jira.mfd.msk:8088/browse/CLS-64 2022-10-03 15:32:31 +03:00
ialbert
7788fd6175 http://jira.mfd.msk:8088/browse/CLS-64 2022-10-03 15:31:16 +03:00
psemenkov
4d50b53d5b fixing bug with MapIndexConfig for CompanyMapStore 2022-10-03 13:17:14 +03:00
aalehin
fefd935e45 http://jira.mfd.msk:8088/browse/CLS-21
---
fix-up
2022-10-03 11:37:00 +03:00
ialbert
b6e53e7dba http://jira.mfd.msk:8088/browse/CLS-65 2022-10-03 09:56:46 +03:00
psemenkov
177607167a Refactoring CompanyInfo and dependent classes 2022-09-30 17:25:01 +03:00
etreschenkov
95cb6c0eff send to export anyway 2022-09-30 13:55:38 +03:00
psemenkov
da0e319e95 Refactoring CompanyInfo and dependent classes 2022-09-30 13:47:26 +03:00
ialbert
5670dbd48d Merge remote-tracking branch 'origin/dev' into dev 2022-09-30 13:42:53 +03:00
ialbert
3014515e00 balance-service put sdf02 request to kafka 2022-09-30 13:42:39 +03:00
etreschenkov
14a009b066 export by request 2022-09-30 13:10:35 +03:00
etreschenkov
0b2e5a13fb export by request 2022-09-30 13:08:13 +03:00
etreschenkov
f4100e394d add consumer to export service 2022-09-30 12:30:03 +03:00
etreschenkov
ee92e11986 some exporter refactoring 2022-09-30 11:25:31 +03:00
etreshenkov
2d446f5239 some refactoring 2022-09-29 19:20:55 +03:00
psemenkov
93d8f1b856 Added AccountBalanceHistoryMapStore and AccountBalanceHistory 2022-09-29 16:13:36 +03:00
psemenkov
245e4d03b6 Added AccountBalanceMapStore, refactoring AccountBalance 2022-09-29 13:59:08 +03:00
ialbert
66cbf4e6b2 http://jira.mfd.msk:8088/browse/CLS-36 2022-09-28 19:12:03 +03:00
ialbert
15cad890c9 http://jira.mfd.msk:8088/browse/CLS-36 2022-09-28 18:49:27 +03:00
ialbert
2e46a484ff http://jira.mfd.msk:8088/browse/CLS-36 2022-09-28 18:39:02 +03:00
psemenkov
26c1fd84c7 Refactoring output 2022-09-28 18:23:13 +03:00
ialbert
db38a4230a http://jira.mfd.msk:8088/browse/CLS-36 2022-09-28 18:18:45 +03:00
psemenkov
870779d55d Added comment 2022-09-28 18:14:30 +03:00
psemenkov
b7ae9b69bc Added a search function by the name of the table to which you need to add a MapStore 2022-09-28 18:02:14 +03:00
psemenkov
7a2fbe5b79 AccountBalance added 2022-09-28 13:14:55 +03:00
etreschenkov
802ade769a get all maps from hazelcast config 2022-09-28 13:14:38 +03:00
etreschenkov
43027789d4 get bean 2022-09-28 13:10:00 +03:00
ialbert
4ad0fc2a94 SameSite=None 2022-09-27 16:48:18 +03:00
psemenkov
2acc0fa402 changing inherited class from ObjectBaseMapStore to TemplateMapStore for ContactMapStore and ProfileDocumentMapStore. refactor CompanySymbolsMapStore 2022-09-27 15:57:00 +03:00
psemenkov
b10c22b888 changing inherited class from ObjectBaseMapStore to TemplateMapStore for CompanySymbolsMapStore 2022-09-27 14:03:31 +03:00
etreschenkov
983b59b508 fix distibs 2022-09-27 12:39:42 +03:00
etreschenkov
77782ee5f5 fix distibs 2022-09-27 12:10:33 +03:00
etreschenkov
c28ad05c6e refactoring imdg settings 2022-09-27 10:34:16 +03:00
etreschenkov
7d55b4cb1b add module to distrib 2022-09-27 08:25:15 +03:00
etreschenkov
c6b9a9060f some imdg refactoring 2022-09-27 07:29:29 +03:00
psemenkov
a533e75fa4 http://git.mfd.msk/mfd/clearing/issues/7
---
marg
2022-09-26 18:55:53 +03:00
psemenkov
dd7610432a Merge remote-tracking branch 'origin/psemenkov' into psemenkov
# Conflicts:
#	clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/account/BankAccountControllerTest.java
#	clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/BankAccountControllerConfig.java
#	clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/HazelcastServiceTestConfiguration.java
#	clearing-parent/backend-api/src/test/ru/spcex/clearing/backendapi/controller/queue/config/IOperator.java
2022-09-26 18:52:45 +03:00
psemenkov
7e87dcd542 http___git_mfd_msk_mfd_clearing_issues_7
---
not work maven test, part test (3 of 5) in BankAccountController
2022-09-26 18:50:14 +03:00
psemenkov
4b7d382689 http://git.mfd.msk/mfd/clearing/issues/7
---
added test for DeleteCompanyController.
2022-09-26 18:20:47 +03:00
psemenkov
9d1fc630a4 http://git.mfd.msk/mfd/clearing/issues/7
---
added test for BankAccountController with validation test for add method. For methods update and delete didn't do the check validation empty id because without id REST request for path "/securities/bank-accounts/" not work.
2022-09-26 18:20:47 +03:00
psemenkov
b63904f0e0 ---
added test for method add
2022-09-26 18:20:46 +03:00
psemenkov
ad7c38f0bb ---
added test class
2022-09-26 18:20:46 +03:00
psemenkov
a1bccea45a http://git.mfd.msk/mfd/clearing/issues/6
---
fixing bug
2022-09-26 18:20:46 +03:00
psemenkov
f98e58a2bd http://git.mfd.msk/mfd/clearing/issues/6
---
fixing generate java doc for app
2022-09-26 18:20:45 +03:00
psemenkov
664b6c66c2 http://git.mfd.msk/mfd/clearing/issues/6
---
refactoring java doc tests
2022-09-26 18:20:45 +03:00
psemenkov
1eac98cf70 http://git.mfd.msk/mfd/clearing/issues/6
---
refactoring tests for adding java doc
2022-09-26 18:20:44 +03:00
aalehin
97899ebff6 test 2022-09-26 18:20:44 +03:00
psemenkov
b380dbf231 http://git.mfd.msk/mfd/clearing/issues/6
---
refactoring tests for running in maven
2022-09-26 18:20:44 +03:00
aalehin
d7f635f7f1 hotfix tests running with maven 2022-09-26 18:20:43 +03:00
psemenkov
ab391739fa http://git.mfd.msk/mfd/clearing/issues/6
---
refactoring tests
2022-09-26 18:20:43 +03:00
psemenkov
aed45da642 http://git.mfd.msk/mfd/clearing/issues/6
---
ContactServiceTest refactoring
2022-09-26 18:20:43 +03:00
psemenkov
bf6fb98742 http://git.mfd.msk/mfd/clearing/issues/6
---
ContactServiceTest test done
2022-09-26 18:20:41 +03:00
psemenkov
740a75823f http://git.mfd.msk/mfd/clearing/issues/6
---
CompanySymbolServiceTest test done
2022-09-26 18:20:41 +03:00
psemenkov
a26d8dd27c http://git.mfd.msk/mfd/clearing/issues/6
---
CompanyServiceTest test done
2022-09-26 18:20:40 +03:00
psemenkov
b0a28cfb6c ---
CompanyInfoServiceTest test done
2022-09-26 18:20:40 +03:00
psemenkov
225dc45046 ---
ClearingMemberCategoryServiceTest test done
2022-09-26 18:20:40 +03:00
psemenkov
ed20610c4f http://git.mfd.msk/dashboard/issues?assignee_id=30
---
tree test done
2022-09-26 18:20:39 +03:00
psemenkov
1cbb7fbf23 http://git.mfd.msk/dashboard/issues?assignee_id=30
---
tree test done, but dot work together
2022-09-26 18:20:39 +03:00
psemenkov
bb49709287 http://git.mfd.msk/dashboard/issues?assignee_id=30
---
first test done
2022-09-26 18:20:39 +03:00
psemenkov
49fe74ea60 http://git.mfd.msk/dashboard/issues?assignee_id=30
---
hz and kafka working
2022-09-26 18:20:38 +03:00
psemenkov
c9a0994fba http://git.mfd.msk/dashboard/issues?assignee_id=30
---
adding hazelcast client
2022-09-26 18:20:38 +03:00
aalehin
7c17cf4e46 http://git.mfd.msk/dashboard/issues?assignee_id=30
---
small refactor
2022-09-26 18:20:38 +03:00
aalehin
cac7d65408 http://git.mfd.msk/dashboard/issues?assignee_id=30
---
small refactor
2022-09-26 18:20:38 +03:00
psemenkov
1bceabef85 http://git.mfd.msk/dashboard/issues?assignee_id=30
---
primary testing
2022-09-26 18:20:37 +03:00
etreschenkov
10dd8bdd1d some imdg refactoring 2022-09-26 17:31:19 +03:00
etreschenkov
295a48a4d1 http://jira.mfd.msk:8088/browse/CLS-96 2022-09-26 15:34:45 +03:00
psemenkov
11eb548d79 http://git.mfd.msk/mfd/clearing/issues/7
---
added test for BankAccountController with validation test for add method. For methods update and delete didn't do the check validation empty id because without id REST request for path "/securities/bank-accounts/" not work.
2022-09-26 14:00:34 +03:00
psemenkov
2ac22ddbdd ---
added test for method add
2022-09-23 18:25:01 +03:00
aalehin
8e78fec954 hotfix 2022-09-23 16:02:23 +03:00
etreschenkov
0f891bb8f2 fix imdg mapStores 2022-09-23 15:28:30 +03:00
akulikov
9690bd0a57 remove S_DF 03/05/11/13 2022-09-23 14:49:51 +03:00
etreschenkov
8b90f6c5cb add sf09 class 2022-09-23 14:15:48 +03:00
ialbert
b9a50d158b http://jira.mfd.msk:8088/browse/CLS-63 2022-09-23 13:40:32 +03:00
ialbert
d147732b0e http://jira.mfd.msk:8088/browse/CLS-36 2022-09-22 19:56:11 +03:00
ialbert
29c818a76a Merge remote-tracking branch 'origin/dev' into dev 2022-09-22 19:51:49 +03:00
ialbert
cef2444524 http://jira.mfd.msk:8088/browse/CLS-36 2022-09-22 19:51:37 +03:00
aalehin
5ad4034388 1) перемещение данных из одной директории в другую
2) выполнил заполнение полей generation_id, generation_time, file_name
2022-09-22 19:37:43 +03:00
psemenkov
da2f2c12db ---
added test class
2022-09-22 19:30:11 +03:00
etreschenkov
0726c3e321 fix insert to db 2022-09-22 18:52:06 +03:00
akulikov
9c056718bb classes: added new class for tables; imdg: added new map store; dbf-exporter: add new tables for export 2022-09-22 14:32:34 +03:00
ialbert
0d3f6d8033 added validator 2022-09-21 19:15:37 +03:00
ialbert
5419765866 client.p12 2022-09-21 18:58:28 +03:00
ialbert
21adcaa308 Merge remote-tracking branch 'origin/dev' into dev 2022-09-21 18:40:36 +03:00
ialbert
7fc4e66043 added message resolver to utils 2022-09-21 18:40:06 +03:00
aalehin
621a02ad9e importer done 2022-09-21 17:38:11 +03:00
aalehin
7759391a15 importer almost done 2022-09-21 16:58:49 +03:00
psemenkov
48036a9a91 http://git.mfd.msk/mfd/clearing/issues/6
---
fixing bug
2022-09-21 15:39:41 +03:00
psemenkov
0d47c239b9 http://git.mfd.msk/mfd/clearing/issues/6
---
fixing generate java doc for app
2022-09-21 15:33:05 +03:00
akulikov
cc8a36018d dbf-exporter. jdbc -> hazelcast, ready for test (fix delete empty file) 2022-09-21 13:08:53 +03:00
akulikov
4e08b8acd0 dbf-exporter. jdbc -> hazelcast, ready for test 2022-09-21 12:54:47 +03:00
psemenkov
0bb08e59c4 http://git.mfd.msk/mfd/clearing/issues/6
---
adding java doc for tests
2022-09-20 18:26:49 +03:00
ialbert
f72d7ff8e2 http://jira.mfd.msk:8088/browse/CLS-63 2022-09-20 16:47:00 +03:00
psemenkov
1aaebae5b8 http://git.mfd.msk/mfd/clearing/issues/6
---
refactoring java doc tests
2022-09-20 16:39:14 +03:00
ialbert
220caec7cc http://jira.mfd.msk:8088/browse/CLS-63 2022-09-20 16:32:47 +03:00
psemenkov
126e5047b4 http://git.mfd.msk/mfd/clearing/issues/6
---
refactoring tests for adding java doc
2022-09-20 16:32:07 +03:00
ialbert
fac2ca4278 imdg port fix 2022-09-20 16:27:44 +03:00
ialbert
5b23c26ab5 added settings and logback 2022-09-20 14:28:43 +03:00
aalehin
3be380b868 test 2022-09-20 14:22:58 +03:00
psemenkov
408f13edf6 http://git.mfd.msk/mfd/clearing/issues/6
---
refactoring tests for running in maven
2022-09-19 17:05:55 +03:00
aalehin
eff9b131d5 hotfix tests running with maven 2022-09-19 16:45:36 +03:00
ialbert
becdf6dbc2 http://jira.mfd.msk:8088/browse/CLS-75 2022-09-19 16:27:32 +03:00
ialbert
d903be76b2 http://jira.mfd.msk:8088/browse/CLS-75 2022-09-19 15:59:33 +03:00
ialbert
84ceae28c4 http://jira.mfd.msk:8088/browse/CLS-75 2022-09-19 15:13:14 +03:00
ialbert
443a71c80d http://jira.mfd.msk:8088/browse/CLS-75 2022-09-19 13:58:59 +03:00
psemenkov
a26f328d7f http://git.mfd.msk/mfd/clearing/issues/6
---
refactoring tests
2022-09-19 11:27:32 +03:00
ialbert
4a844dcc43 offset window for transactional services 2022-09-16 19:15:45 +03:00
ialbert
b0bff28194 http://jira.mfd.msk:8088/browse/CLS-63 2022-09-16 19:14:04 +03:00
ialbert
cefcd14fda http://jira.mfd.msk:8088/browse/CLS-63 2022-09-16 19:11:07 +03:00
psemenkov
154c5cad89 http://git.mfd.msk/mfd/clearing/issues/6
---
ContactServiceTest refactoring
2022-09-16 19:05:24 +03:00
psemenkov
616be23d5a http://git.mfd.msk/mfd/clearing/issues/6
---
ContactServiceTest test done
2022-09-16 18:15:59 +03:00
mivanov
cc01789369 http://git.mfd.msk/mfd/clearing/issues/4
---
Тест на KeyRateService

http://git.mfd.msk/mfd/clearing/issues/5
---
Тест на MoneyMarketSecurityService
2022-09-16 17:40:28 +03:00
psemenkov
dd395f36aa http://git.mfd.msk/mfd/clearing/issues/6
---
CompanySymbolServiceTest test done
2022-09-16 17:32:45 +03:00
psemenkov
f3c8470f50 http://git.mfd.msk/mfd/clearing/issues/6
---
CompanyServiceTest test done
2022-09-16 16:07:48 +03:00
psemenkov
d412393ebb ---
CompanyInfoServiceTest test done
2022-09-16 14:57:26 +03:00
psemenkov
8fd84a799f ---
ClearingMemberCategoryServiceTest test done
2022-09-16 12:41:39 +03:00
AKurakin
d124da97b8 IMDG, DDL, meta обновление 15-16.09.2022, утро, правка бага после вечера 2022-09-16 10:35:18 +03:00
AKurakin
69790ae029 IMDG, DDL, meta обновление 15.09.2022, вечер 2022-09-15 19:54:57 +03:00
psemenkov
e7526aff13 http://git.mfd.msk/dashboard/issues?assignee_id=30
---
tree test done
2022-09-15 18:41:02 +03:00
psemenkov
702a107be6 http://git.mfd.msk/dashboard/issues?assignee_id=30
---
tree test done, but dot work together
2022-09-15 16:45:02 +03:00
AKurakin
a4957bbbc8 IMDG, DDL убрали лишний MarketAccess 2022-09-15 16:07:02 +03:00
AKurakin
f2a9a26636 IMDG по meta зачистка мапсторов: http://jira.mfd.msk:8088/browse/CLS-46 ... 2022-09-15 15:00:00 +03:00
AKurakin
2f1c8208d0 IMDG classes: http://jira.mfd.msk:8088/browse/CLS-46 http://jira.mfd.msk:8088/browse/CLS-47 http://jira.mfd.msk:8088/browse/CLS-49 http://jira.mfd.msk:8088/browse/CLS-50 http://jira.mfd.msk:8088/browse/CLS-55 http://jira.mfd.msk:8088/browse/CLS-58 2022-09-15 14:54:27 +03:00
AKurakin
a153aefbf1 DDL правки для USER_CLR 2022-09-15 14:49:59 +03:00
aalehin
36caec87be http://jira.mfd.msk:8088/browse/CLS-21
---
переименовал перфиксы в application.properties
пофиксил ConcurrentModificationException: KafkaConsumer is not safe for multi-threaded access
2022-09-15 13:23:21 +03:00
psemenkov
45fa3ddc02 http://git.mfd.msk/dashboard/issues?assignee_id=30
---
first test done
2022-09-15 12:17:28 +03:00
psemenkov
b54cade6c1 http://git.mfd.msk/dashboard/issues?assignee_id=30
---
hz and kafka working
2022-09-15 11:56:24 +03:00
AKurakin
7daedf9b26 DDL, meta - правка taskRunner 2022-09-15 11:08:15 +03:00
AKurakin
b5592bb6ba DDL. 2022-09-14 21:20:34 +03:00
AKurakin
dd75c68d96 DDL, meta обновлено на 14.09.2022 2022-09-14 19:05:13 +03:00
aalehin
47843f4242 hotfix reports-service parent tag 2022-09-14 15:29:38 +03:00
psemenkov
b6780affc0 http://git.mfd.msk/dashboard/issues?assignee_id=30
---
adding hazelcast client
2022-09-14 15:20:28 +03:00
ialbert
1e622e5de5 Merge remote-tracking branch 'origin/dev' into dev 2022-09-13 20:37:02 +03:00
ialbert
1a005ae584 добавил создание реквестов при запросе в backend-api
добавил транзакции для ImdgProvider
2022-09-13 20:36:43 +03:00
aalehin
09ddcff931 http://jira.mfd.msk:8088/browse/CLS-32
---
refactor
AccountServiceSettings prefix utility-service
BankAccountService убрать логи с запросами MoneyMarketSecurityNewRequest
2022-09-12 14:23:25 +03:00
aalehin
7e82916010 http://git.mfd.msk/dashboard/issues?assignee_id=30
---
small refactor
2022-09-12 13:42:43 +03:00
aalehin
bf6ec283f7 http://git.mfd.msk/dashboard/issues?assignee_id=30
---
small refactor
2022-09-12 13:37:54 +03:00
psemenkov
f8271d3ee2 http://git.mfd.msk/dashboard/issues?assignee_id=30
---
primary testing
2022-09-12 13:11:12 +03:00
ialbert
2b8ee91f76 залочил мапу при создании пользователя 2022-09-08 17:03:26 +03:00
ialbert
602c194db7 добавил автодобавление пользователя и методы в Imdg 2022-09-07 20:36:11 +03:00
aalehin
873a437a82 http://jira.mfd.msk:8088/browse/CLS-44
http://jira.mfd.msk:8088/browse/CLS-45
---
Изменения касаются наименования выгружаемых файлов
2022-09-07 16:32:26 +03:00
ialbert
102f6f7ce6 http://jira.mfd.msk:8088/browse/CLS-30 2022-09-07 13:41:04 +03:00
ialbert
7aad3f4100 http://jira.mfd.msk:8088/browse/CLS-42
http://jira.mfd.msk:8088/browse/CLS-41
2022-09-06 18:14:33 +03:00
AKurakin
714c561424 update meta... 2022-09-06 16:35:36 +03:00
AKurakin
c391e6a633 http://jira.mfd.msk:8088/browse/CLS-40 поправил тип поля для sDf08 2022-09-06 16:24:59 +03:00
AKurakin
cf5e6f2c54 http://jira.mfd.msk:8088/browse/CLS-33 http://jira.mfd.msk:8088/browse/CLS-34 http://jira.mfd.msk:8088/browse/CLS-39 http://jira.mfd.msk:8088/browse/CLS-40 рефакторинг имён пакетов 2022-09-06 15:44:30 +03:00
AKurakin
d6977d499e Merge branch 'dev' into dev_tmpmeta01.09.2022 2022-09-06 10:39:09 +03:00
aalehin
284b94f26f http://jira.mfd.msk:8088/browse/CLS-32
---
bug fix clearing-member-category-update
2022-09-05 19:14:14 +03:00
AKurakin
7ab9f62079 Merge branch 'dev' into dev_tmpmeta01.09.2022 2022-09-05 18:41:00 +03:00
AKurakin
c4a8db1cd8 IMDG рефакторинг, чтобы компилировалось. 2022-09-05 18:40:00 +03:00
akurakin
08c45b90d6 http://jira.mfd.msk:8088/browse/CLS-33 http://jira.mfd.msk:8088/browse/CLS-34 http://jira.mfd.msk:8088/browse/CLS-39 http://jira.mfd.msk:8088/browse/CLS-40 IMDG таблицы... 2022-09-05 17:33:14 +03:00
aalehin
9a77ad254e http://jira.mfd.msk:8088/browse/CLS-32
---
account_services: добавление, изменение, удаление банковских реквизитов bankAccount
2022-09-05 15:05:07 +03:00
aalehin
36540fe503 http://jira.mfd.msk:8088/browse/CLS-21
http://jira.mfd.msk:8088/browse/CLS-24
---
company_services: изменение и удаление категории компании clearingMemberCategory
переименовал перфиксы в application.properties
переименовал UtilityServiceImdgConfig
2022-09-05 14:25:40 +03:00
akulikov
aa174fa6c2 reports-service, classes for reports 2022-09-05 11:43:19 +03:00
akurakin
dc9223b470 http://jira.mfd.msk:8088/browse/CLS-33 http://jira.mfd.msk:8088/browse/CLS-34 IMDG новые классы (часть), обновления полей 2022-09-04 23:37:32 +03:00
akurakin
04e6dbadf2 http://jira.mfd.msk:8088/browse/CLS-33 http://jira.mfd.msk:8088/browse/CLS-34 DDL, Meta, IMDG refactoring1 2022-09-04 21:09:17 +03:00
akulikov
fd031f9bd2 reports-service, classes for reports (not complete) 2022-09-02 18:03:34 +03:00
ialbert
2fc1528da3 Merge remote-tracking branch 'origin/dev' into dev 2022-09-02 14:25:12 +03:00
ialbert
84e2bc62d2 Merge branch 'keycloak-extract' into dev 2022-09-02 14:24:20 +03:00
AKurakin
e0353f099b IMDG добавил новых мапсторов. 2022-09-01 19:43:16 +03:00
ialbert
ca94f3a784 http://jira.mfd.msk:8088/browse/CLS-9 --- keycloak custom login/logout endpoint 2022-09-01 18:46:02 +03:00
akulikov
ce1749fe83 reports-service: simple prototype fix 2022-09-01 18:32:36 +03:00
akulikov
38e0bd5790 reports-service created (prototype xml read with XStream) 2022-09-01 18:12:55 +03:00
aalehin
c23e605fa5 http://jira.mfd.msk:8088/browse/CLS-21
---
company_services: реализовал изменение контактов (contact)
2022-09-01 15:30:44 +03:00
aalehin
6773871d26 http://jira.mfd.msk:8088/browse/CLS-21
---
company_services: ввел удаление компании company; изменение общей информации о компании companyInfo, ее реквизитов companySymbols
2022-08-31 19:02:15 +03:00
aalehin
3fb0524cc8 http://jira.mfd.msk:8088/browse/CLS-17
---
Переназвал лог файлах в настройках logback.xml модуля utility-service
 securities-service.log -> utility-service.log
2022-08-31 16:50:28 +03:00
aalehin
2c98ca87fa рефакторинг нейминга пакетов 2022-08-30 18:53:18 +03:00
aalehin
9bdce4dfb6 http://jira.mfd.msk:8088/browse/CLS-17
---
 реализовал обработку команд добавления, изменения, удаления Ключевой ставки ЦБ.
2022-08-30 18:34:11 +03:00
ialbert
8fa93e924b fix imdg build 2022-08-29 20:00:35 +03:00
ialbert
a378efdb0b example authenticating to keycloak though login endpoint and session 2022-08-29 19:59:38 +03:00
ialbert
0170065ddb fixed default controller, fixed post methods 2022-08-26 18:19:34 +03:00
ialbert
6bc177d506 kafka settings constants 2022-08-23 17:42:17 +03:00
ialbert
57072f3cff http://jira.mfd.msk:8088/browse/CLS-22 2022-08-23 12:31:20 +03:00
ialbert
6ea1f5b1fd http://jira.mfd.msk:8088/browse/CLS-19 2022-08-22 19:16:27 +03:00
ialbert
69d03bba98 Merge remote-tracking branch 'origin/dev' into dev 2022-08-22 12:55:06 +03:00
ialbert
ed505da559 fixed imdg build name 2022-08-22 12:54:58 +03:00
AKurakin
eef8c543cf IMDG добавил все Dictionary по meta 19.08.2022 (2 закоментированные) 2022-08-19 17:22:44 +03:00
ialbert
bdfe68c091 http://jira.mfd.msk:8088/browse/CLS-16 2022-08-19 17:00:00 +03:00
AKurakin
601417b833 IMDG refactoring 2022-08-19 16:19:24 +03:00
AKurakin
8066e6f270 Актуализация меты на 19.08.2022. (в мету я добавил к типам SQL типы в Java) 2022-08-19 12:46:49 +03:00
ialbert
3c65d00bfb http://jira.mfd.msk:8088/browse/CLS-14 2022-08-18 19:10:30 +03:00
ialbert
a4de8e691b http://jira.mfd.msk:8088/browse/CLS-16 2022-08-18 17:20:00 +03:00
ialbert
394bb7477c http://jira.mfd.msk:8088/browse/CLS-16 2022-08-17 19:28:33 +03:00
ialbert
a127b85e12 http://jira.mfd.msk:8088/browse/CLS-16 2022-08-17 19:20:55 +03:00
ialbert
52b928cca6 http://jira.mfd.msk:8088/browse/CLS-16 2022-08-17 16:22:55 +03:00
ialbert
e266c85bf2 http://jira.mfd.msk:8088/browse/CLS-16 2022-08-17 16:20:04 +03:00
ialbert
6f6ace106d http://jira.mfd.msk:8088/browse/CLS-16 2022-08-17 16:18:01 +03:00
ialbert
0a9af63689 http://jira.mfd.msk:8088/browse/CLS-16 2022-08-16 17:37:06 +03:00
ialbert
1dce58b76c http://jira.mfd.msk:8088/browse/CLS-16 2022-08-15 19:28:11 +03:00
ialbert
baf625f959 http://jira.mfd.msk:8088/browse/CLS-16 2022-08-15 15:03:26 +03:00
ialbert
c49fc00d0e http://jira.mfd.msk:8088/browse/CLS-16 2022-08-15 14:58:11 +03:00
ialbert
38a50d1775 http://jira.mfd.msk:8088/browse/CLS-16 2022-08-15 13:14:28 +03:00
ialbert
b70683d765 http://jira.mfd.msk:8088/browse/CLS-16 2022-08-12 18:41:30 +03:00
AKurakin
e44435b54d fix storage SQL: авычки... 2022-08-12 15:39:14 +03:00
ialbert
6ad470b67f http://jira.mfd.msk:8088/browse/CLS-16 2022-08-12 15:24:56 +03:00
ialbert
05d015fd26 Merge remote-tracking branch 'origin/dev' into dev 2022-08-12 14:51:50 +03:00
ialbert
780279fdcb http://jira.mfd.msk:8088/browse/CLS-16 2022-08-12 14:51:42 +03:00
akulikov
2ddd2712ee fix after review 2022-08-12 14:39:52 +03:00
ialbert
a8c6ca0945 http://jira.mfd.msk:8088/browse/CLS-16 2022-08-12 13:17:55 +03:00
AKurakin
007072afa6 http://jira.mfd.msk:8088/browse/CLS-13 добавил мапсторы (не все), рефакторинг 2022-08-12 12:21:36 +03:00
akulikov
7009933409 dbf exporter and fix dbf importer 2022-08-11 19:48:01 +03:00
ialbert
bbd7fb2989 Merge remote-tracking branch 'origin/dev' into dev 2022-08-11 19:37:00 +03:00
ialbert
ef1492822f http://jira.mfd.msk:8088/browse/CLS-16 2022-08-11 19:36:49 +03:00
akulikov
721c8ff569 dbf exporter (incomplete) 2022-08-11 16:45:42 +03:00
akulikov
80eec5be9b dbf exporter (incomplete) 2022-08-11 16:45:04 +03:00
ialbert
5a7ac0f2b1 Merge remote-tracking branch 'origin/dev' into dev 2022-08-11 15:53:14 +03:00
ialbert
db5171f3b2 http://jira.mfd.msk:8088/browse/CLS-16 2022-08-11 15:53:05 +03:00
AKurakin
c11640103d http://jira.mfd.msk:8088/browse/CLS-13 добавил классов 2022-08-11 15:22:50 +03:00
AKurakin
4bda732920 IMDG рефакторинг, подготовка к замене на автогенерацию классов 2022-08-11 15:22:50 +03:00
ialbert
5e56ac91d7 http://jira.mfd.msk:8088/browse/CLS-16 2022-08-11 15:07:10 +03:00
akulikov
845d38167b dbf importer small fix 2022-08-11 14:44:12 +03:00
akulikov
c3fb5a8dc7 dbf importer fix after review 2022-08-11 14:07:15 +03:00
akulikov
18b7909e36 dbf importer small fix 2022-08-11 13:52:33 +03:00
akulikov
2c01a624af dbf importer, work with sonar 2022-08-11 13:44:05 +03:00
akulikov
a07a31914b dbf importer add logs 2022-08-11 13:28:27 +03:00
akulikov
0d607ebf52 dbf importer (in progress)
(cherry picked from commit 6cd07131b209f002d3fa32ba850c7371b1700179)
2022-08-11 13:14:59 +03:00
ialbert
ed8b6dba91 http://jira.mfd.msk:8088/browse/CLS-16 2022-08-11 13:11:42 +03:00
ialbert
1d33e0cd3b http://jira.mfd.msk:8088/browse/CLS-11 2022-08-09 20:53:33 +03:00
ialbert
4f199c3d37 http://jira.mfd.msk:8088/browse/CLS-9 2022-08-09 14:41:52 +03:00
AKurakin
f802c3f69d Поправил комментарии, чуть пофиксил сторадж для update команд. 2022-08-09 11:39:52 +03:00
AKurakin
e37357ebc1 meta: поправил опечатку латиница-кирилица C 2022-08-09 10:43:30 +03:00
1989 changed files with 222987 additions and 5524 deletions

4
.gitignore vendored
View file

@ -1,3 +1,7 @@
target
/.idea/
*.iml
logs
tmp_notes.**
tmp
clearing-parent/backend-api/src/main/resources/meta.json

2
build_without_tests.cmd Normal file
View file

@ -0,0 +1,2 @@
start mvn clean install -Dmaven.test.skip=true -P distributive
pause

View file

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-1.0.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>account-service</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-messaging</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-imdg-api-hazelcast-impl</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-enum</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>security-util</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- TEST -->
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>test-clearing</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>application.properties</exclude>
</excludes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.2.0-M1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0-M1</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>

View file

@ -0,0 +1,12 @@
package ru.spcex.clearing.account;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AccountServiceApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(AccountServiceApplication.class);
springApplication.run(args);
}
}

View file

@ -0,0 +1,47 @@
package ru.spcex.clearing.account.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import ru.spcex.clearing.account.config.settings.AccountServiceSettings;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
@Configuration
public class AccountServiceImdgConfig {
private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) {
ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
if (maxPoolSz > 2) {
pool.setKeepAliveSeconds(60);
pool.setAllowCoreThreadTimeOut(true);
}
pool.setCorePoolSize(maxPoolSz);
pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion);
return pool;
}
@Bean(name = "taskExecutorHazelcastClientInitializer")
public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() {
return createThreadPoolTaskExecutor(1, true);
}
@Bean(name = "taskExecutorIdGeneratorAwaiter")
public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() {
return createThreadPoolTaskExecutor(1, false);
}
@Autowired
@Bean
public ImdgProvider imdgProvider(
@Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer,
@Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter,
AccountServiceSettings settings
) {
return new HazelcastService(taskExecutorHazelcastClientInitializer,
taskExecutorIdGeneratorAwaiter,
settings.getHazelcast());
}
}

View file

@ -0,0 +1,33 @@
package ru.spcex.clearing.account.config;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.IMDGMessageResolver;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.platform.enumeration.UserRole;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
@Configuration
public class BeanConfiguration {
@Bean
public IMessageResolver messageResolver(ImdgProvider imdgProvider) {
return new IMDGMessageResolver(imdgProvider);
}
@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public RequestHelper requestHelper(IMessageResolver messageResolver) {
return new RequestHelper(messageResolver, AccountError.GeneralError);
}
@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public UserRoleVerification userRoleVerification(ImdgProvider imdgProvider, IMessageResolver messageResolver) {
return new UserRoleVerification(imdgProvider, messageResolver, UserRole.Admin, AccountError.UserVerifyDenial);
}
}

View file

@ -0,0 +1,64 @@
package ru.spcex.clearing.account.config;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import ru.spcex.clearing.account.config.settings.AccountServiceSettings;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory;
import ru.spcex.clearing.platform.messaging.config.KafkaProducerFactory;
import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings;
import ru.spcex.clearing.platform.messaging.service.RequestInfo;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Configuration
public class KafkaConfig {
@Autowired
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Bean
public Consumer<String, Object> createConsumer(AccountServiceSettings settings) {
return KafkaConsumerFactory.consumer(settings.getKafkaConsumer());
}
@Autowired
@Bean
public Producer<String, Object> createProducer(AccountServiceSettings settings) {
return KafkaProducerFactory.producer(settings.getKafkaProducer());
}
@Bean
public ProducerFactory<String, Object> pf(AccountServiceSettings settings) {
KafkaProducerSettings kafkaSettings = settings.getKafkaProducer();
return KafkaProducerFactory.producerFactory(kafkaSettings);
}
@Bean
public KafkaTemplate<String, Object> kafkaTemplate(ProducerFactory<String, Object> pf) {
return new KafkaTemplate<>(pf);
}
@Autowired
@Bean
public KafkaSender kafkaSender(KafkaTemplate<String, Object> kafkaTemplate, ImdgProvider imdgProvider) {
ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator();
return KafkaSender
.setup()
.setKafkaTemplate(kafkaTemplate)
.idGenerator(imdgIdGenerator::nextId)
.imdgProvider(s -> {
Imdg<RequestInfo> imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class);
return imdg::insert;
})
.build();
}
}

View file

@ -0,0 +1,41 @@
package ru.spcex.clearing.account.config.settings;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings;
import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings;
import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams;
@Component
@PropertySource("file:${spring.config.location}/application.properties")
@ConfigurationProperties("account-service")
public class AccountServiceSettings {
private HazelcastClientParams hazelcast;
private KafkaConsumerSettings kafkaConsumer;
private KafkaProducerSettings kafkaProducer;
public HazelcastClientParams getHazelcast() {
return hazelcast;
}
public void setHazelcast(HazelcastClientParams hazelcast) {
this.hazelcast = hazelcast;
}
public KafkaConsumerSettings getKafkaConsumer() {
return kafkaConsumer;
}
public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) {
this.kafkaConsumer = kafkaConsumer;
}
public KafkaProducerSettings getKafkaProducer() {
return kafkaProducer;
}
public void setKafkaProducer(KafkaProducerSettings kafkaProducer) {
this.kafkaProducer = kafkaProducer;
}
}

View file

@ -0,0 +1,101 @@
package ru.spcex.clearing.account.config.validation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.AccountSymbols;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountSymbolsNewRequest;
import ru.spcex.clearing.validation.common.rules.FieldNotBlankRequiredRule;
import ru.spcex.clearing.validation.common.rules.IdPresentRule;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
@Configuration
public class AccountSymbolsValidationConfig {
@Bean("accountSymbolsDepoNewRequest")
public Function<AccountSymbolsNewRequest, IValidator> accountSymbolsDepoNewRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return accountSymbolsNewRequest -> {
ImdgValidationContext<AccountSymbolsNewRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(accountSymbolsNewRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_AccountSymbols);
return new ValidatorImpl<>(context,
IdPresentRule.instance("accountId",
AccountSymbolsNewRequest::getAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
true,
(Account account) -> {
if (AccountType.Depo.equalsByKey(account.getAccountType())) {
return null;
} else {
return AccountError.AccountDepoTypeRequired;
}
}
),
FieldNotBlankRequiredRule.instance("accountSymbolValue",
AccountSymbolsNewRequest::getAccountSymbolValue,
AccountError.RequiredFieldEmpty, true),
new DuplicateAccountSymbolsRule()
);
};
}
static class DuplicateAccountSymbolsRule implements IValidationRule<ImdgValidationContext<AccountSymbolsNewRequest>> {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<AccountSymbolsNewRequest> context) {
AccountSymbolsNewRequest validatedObject = context.getValidatedObject();
Imdg<AccountSymbols> accountSymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
ImdgPredicateBuilder pb = accountSymbolsImdg.predicateBuilder();
ImdgPredicate query = pb.or(
pb.equals("accountId", validatedObject.getAccountId()),
pb.equals("accountSymbolValue", validatedObject.getAccountSymbolValue())
);
Collection<AccountSymbols> existAccSymbols = accountSymbolsImdg.getCollectionObjectsByPredicate(query);
if (existAccSymbols.isEmpty()) {
return empty();
} else {
AccountSymbols existAS = existAccSymbols.iterator().next();
String duplicateMsg = "";
if (validatedObject.getAccountId() != null && validatedObject.getAccountId().equals(existAS.getAccountId())) {
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
Account linkedAccount = accountImdg.getSingleObjectByID(existAS.getAccountId());
if (linkedAccount != null) {
duplicateMsg = linkedAccount.getAccount();
} else {
duplicateMsg = "" + existAS.getAccountId();
}
}
if (validatedObject.getAccountSymbolValue() != null &&
validatedObject.getAccountSymbolValue().equals(existAS.getAccountSymbolValue())) {
if (!duplicateMsg.isEmpty())
duplicateMsg += ", ";
duplicateMsg += existAS.getAccountSymbolValue();
}
return of(AccountError.AccountAlreadyExist, duplicateMsg);
}
}
}
}

View file

@ -0,0 +1,193 @@
package ru.spcex.clearing.account.config.validation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.platform.dictionary.AccountTypeDictionary;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.CorrespondentAccountNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.CorrespondentAccountUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest;
import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule;
import ru.spcex.clearing.validation.common.rules.IdPresentRule;
import ru.spcex.clearing.validation.common.rules.specific.FieldRequiredSpecificRule;
import ru.spcex.clearing.validation.common.rules.specific.IdPresentSpecificRule;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.AccountStatus;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
@Configuration
public class AccountValidationConfig {
@Bean("correspondentAccountNewRequestValidator")
public Function<CorrespondentAccountNewRequest, IValidator> correspondentAccountNewRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return correspondentAccountNewRequest -> {
ImdgValidationContext<CorrespondentAccountNewRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(correspondentAccountNewRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary);
return new ValidatorImpl<>(context,
IdPresentRule.instance("companyId",
CorrespondentAccountNewRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound
// company -> WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()) ? null : AccountError.CompanyNotActive
),
FieldRequiredSpecificRule.instance("account",
CorrespondentAccountNewRequest::getAccount,
AccountError.AccountFieldNotSet,
false,
accountValue -> {
if ((accountValue == null || accountValue.isBlank()) && AccountType.Info.equalsByKey(context.getValidatedObject().getAccountType())) {
return null;
}
if (accountValue == null || accountValue.isBlank())
return new EnumMessage(AccountError.AccountFieldNotSet, "account");
Imdg<Account> accountImdg = context.obtainMap(
IMDGDistributedNames.Map_Account, Account.class
);
ImdgPredicateBuilder pb = accountImdg.predicateBuilder();
ImdgPredicate accountValuePredicate = pb.equals("account", accountValue);
ImdgPredicate accountStatusPredicate = pb.equals("status", AccountStatus.ACTIVE.getKey());
ImdgPredicate finalPredicate = pb.and(accountValuePredicate, accountStatusPredicate);
Collection<Account> accounts = accountImdg.getCollectionObjectsByPredicate(finalPredicate);
if (accounts.isEmpty()) return null;
return new EnumMessage(AccountError.AccountAlreadyExist, accounts.stream().findFirst().get().getAccount());
}),
DictionaryPresentRule.instance("status",
CorrespondentAccountNewRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false
// , statusValue -> {
// if (ServiceStatus.Active.equalsByKey(statusValue.getCode())) return null;
// return AccountError.WrongFieldValue;
// }
),
DictionaryPresentRule.instance("accountType",
CorrespondentAccountNewRequest::getAccountType,
IMDGDistributedNames.Map_AccountTypeDictionary,
AccountTypeDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
accountType -> {
if (IEnumKey.contains(accountType.getCode(), AccountType.Corr, AccountType.Info)) return null;
return AccountError.WrongFieldValue;
}).withMessageDecorator((causeEmpty, errorCode, fieldName, fieldValue) -> {
if (errorCode == AccountError.WrongFieldValue)
return DictionaryPresentRule.FIELD_NOT_FOUND_DECORATOR_1.decorator(causeEmpty, errorCode, fieldName, fieldValue);
else
return DictionaryPresentRule.DICTIONARY_NOT_FOUND_DECORATOR_2.decorator(causeEmpty, errorCode, fieldName, fieldValue);
}
),
new SameAccountValidationRule<>(AccountType.Corr, CorrespondentAccountNewRequest::getAccount)
);
};
}
@Bean("correspondentAccountUpdateRequestValidator")
public Function<CorrespondentAccountUpdateRequest, IValidator> correspondentAccountUpdateRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return correspondentAccountUpdateRequest -> {
ImdgValidationContext<CorrespondentAccountUpdateRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(correspondentAccountUpdateRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary);
return new ValidatorImpl<>(context,
IdPresentRule.instance("id",
CorrespondentAccountUpdateRequest::getId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound),
IdPresentRule.instance("companyId",
CorrespondentAccountUpdateRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound,
false,
company -> {
if (Objects.equals(company.getId(), correspondentAccountUpdateRequest.getCompanyId()))
return null;
return AccountError.WrongFieldValue;
}),
DictionaryPresentRule.instance("status",
CorrespondentAccountUpdateRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false),
DictionaryPresentRule.instance("accountType",
CorrespondentAccountUpdateRequest::getAccountType,
IMDGDistributedNames.Map_AccountTypeDictionary,
AccountTypeDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false
// accountType -> {
// if (AccountType.Corr.equalsByKey(accountType.getCode())) return null;
// return AccountError.WrongFieldValue;
// }
)
);
};
}
@Bean("correspondentAccountBlockRequestValidator")
public Function<CommonIdRequest, IValidator> correspondentAccountBlockRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return correspondentAccountBlockRequest -> {
ImdgValidationContext<CommonIdRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(correspondentAccountBlockRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_Account);
return new ValidatorImpl<>(context,
IdPresentSpecificRule.instance("id",
CommonIdRequest::getId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
account -> {
if (AccountStatus.BLOCKED.equalsByKey(account.getStatus()))
return new EnumMessage(AccountError.AccountNotActive, account.getAccount());
return null;
})
);
};
}
}

View file

@ -0,0 +1,160 @@
package ru.spcex.clearing.account.config.validation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.BankAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.platform.dictionary.CurrencyCodeDictionary;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest;
import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule;
import ru.spcex.clearing.validation.common.rules.FieldNotBlankRequiredRule;
import ru.spcex.clearing.validation.common.rules.FieldRequiredRule;
import ru.spcex.clearing.validation.common.rules.IdPresentRule;
import ru.spcex.clearing.validation.common.rules.specific.FieldRequiredSpecificRule;
import ru.spcex.clearing.validation.common.rules.specific.IdPresentSpecificRule;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.AccountStatus;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl;
import java.util.Collection;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
@Configuration
public class BankAccountValidationConfig {
@Bean("bankAccountNewRequestValidator")
public Function<BankAccountNewRequest, IValidator> bankAccountNewRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return bankAccountNewRequest -> {
ImdgValidationContext<BankAccountNewRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(bankAccountNewRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_BankAccount);
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary);
return new ValidatorImpl<>(context,
IdPresentRule.instance("companyId",
BankAccountNewRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound,
false),
FieldNotBlankRequiredRule.instance("account",
BankAccountNewRequest::getAccount,
AccountError.RequiredFieldEmpty
),
new SameAccountValidationRule<>(AccountType.Bank, BankAccountNewRequest::getAccount),
DictionaryPresentRule.instance("currency",
BankAccountNewRequest::getCurrency,
IMDGDistributedNames.Map_CurrencyCodeDictionary,
CurrencyCodeDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound),
FieldRequiredRule.instance("bankIdentificationCode",
BankAccountNewRequest::getBankIdentificationCode,
AccountError.RequiredFieldEmpty),
FieldRequiredRule.instance("bankName",
BankAccountNewRequest::getBankName,
AccountError.RequiredFieldEmpty),
DictionaryPresentRule.instance("status",
BankAccountNewRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
);
};
}
@Bean("bankAccountUpdateRequestValidator")
public Function<BankAccountUpdateRequest, IValidator> bankAccountUpdateRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return bankAccountUpdateRequest -> {
ImdgValidationContext<BankAccountUpdateRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(bankAccountUpdateRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary);
addImdg.accept(IMDGDistributedNames.Map_BankAccount);
addImdg.accept(IMDGDistributedNames.Map_Company);
return new ValidatorImpl<>(context,
IdPresentRule.instance("id",
BankAccountUpdateRequest::getId,
IMDGDistributedNames.Map_BankAccount,
BankAccount.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
bankAccount -> {
Long accountId = bankAccount.getAccountId();
Imdg<Account> accountImdg = context.obtainMap(
IMDGDistributedNames.Map_Account, Account.class
);
Account account = accountImdg.getSingleObjectByID(accountId);
if (account == null) return AccountError.AccountNotFound;
// if (!AccountStatus.ACTIVE.equalsByKey(account.getStatus())) return AccountError.AccountNotActive;
return null;
}),
DictionaryPresentRule.instance("currency",
BankAccountUpdateRequest::getCurrency,
IMDGDistributedNames.Map_CurrencyCodeDictionary,
CurrencyCodeDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
);
};
}
@Bean("bankAccountBlockRequestValidator")
public Function<CommonIdRequest, IValidator> bankAccountBlockRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return bankAccountBlockRequest -> {
ImdgValidationContext<CommonIdRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(bankAccountBlockRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_BankAccount);
addImdg.accept(IMDGDistributedNames.Map_Account);
return new ValidatorImpl<>(context,
IdPresentSpecificRule.instance("id",
CommonIdRequest::getId,
IMDGDistributedNames.Map_BankAccount,
BankAccount.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
bankAccount -> {
Long accountId = bankAccount.getAccountId();
Imdg<Account> accountImdg = context.obtainMap(
IMDGDistributedNames.Map_Account, Account.class
);
Account account = accountImdg.getSingleObjectByID(accountId);
if (account == null)
return new EnumMessage(AccountError.AccountNotFound, accountId);
if (AccountStatus.BLOCKED.equalsByKey(account.getStatus()))
return new EnumMessage(AccountError.AccountNotActive, account.getAccount());
return null;
})
);
};
}
}

View file

@ -0,0 +1,135 @@
package ru.spcex.clearing.account.config.validation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.platform.dictionary.ClearingAccountTypeDictionary;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountUpdateRequest;
import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule;
import ru.spcex.clearing.validation.common.rules.FieldNotBlankRequiredRule;
import ru.spcex.clearing.validation.common.rules.FieldRequiredRule;
import ru.spcex.clearing.validation.common.rules.IdPresentRule;
import ru.spcex.clearing.validation.common.rules.specific.FieldRequiredSpecificRule;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl;
import java.util.Collection;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
@Configuration
public class ClearingAccountValidationConfig {
@Bean("clearingAccountNewRequestValidator")
public Function<ClearingAccountNewRequest, IValidator> clearingAccountNewRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return clearingAccountNewRequest -> {
ImdgValidationContext<ClearingAccountNewRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(clearingAccountNewRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_ClearingAccount);
addImdg.accept(IMDGDistributedNames.Map_ClearingAccountTypeDictionary);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
return new ValidatorImpl<>(context,
IdPresentRule.instance("companyId",
ClearingAccountNewRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound
// company -> !WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()) ? AccountError.CompanyNotActive : null
),
FieldNotBlankRequiredRule.instance("account",
ClearingAccountNewRequest::getAccount,
AccountError.RequiredFieldEmpty),
new SameAccountValidationRule<>(AccountType.Clrn, ClearingAccountNewRequest::getAccount),
DictionaryPresentRule.instance("clearingAccountType",
ClearingAccountNewRequest::getClearingAccountType,
IMDGDistributedNames.Map_ClearingAccountTypeDictionary,
ClearingAccountTypeDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound),
DictionaryPresentRule.instance("status",
ClearingAccountNewRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
);
};
}
@Bean("clearingAccountUpdateRequestValidator")
public Function<ClearingAccountUpdateRequest, IValidator> clearingAccountUpdateRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return clearingAccountUpdateRequest -> {
ImdgValidationContext<ClearingAccountUpdateRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(clearingAccountUpdateRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_ClearingAccount);
addImdg.accept(IMDGDistributedNames.Map_ClearingAccountTypeDictionary);
return new ValidatorImpl<>(context,
FieldRequiredRule.instance("account",
ClearingAccountUpdateRequest::getAccount,
AccountError.RequiredFieldEmpty,
accountValue -> {
if (accountValue.isBlank())
return AccountError.RequiredFieldEmpty;
Imdg<Account> accountImdg = context.obtainMap(
IMDGDistributedNames.Map_Account, Account.class
);
ImdgPredicateBuilder pb = accountImdg.predicateBuilder();
ImdgPredicate accountValuePredicate = pb.equals("account", accountValue);
ImdgPredicate accountStatusPredicate = pb.equals("status", ServiceStatus.Active.getKey());
ImdgPredicate accountTypePredicate = pb.equals("accountType", AccountType.Clrn.getKey());
ImdgPredicate finalPredicate = pb.and(accountValuePredicate,
accountStatusPredicate,
accountTypePredicate);
Collection<Account> accounts = accountImdg.getCollectionObjectsByPredicate(finalPredicate);
if (accounts.isEmpty()) return AccountError.AccountNotFound;
return null;
}),
FieldRequiredRule.instance("status",
ClearingAccountUpdateRequest::getStatus,
AccountError.RequiredFieldEmpty,
statusValue -> {
if (statusValue == 0 || statusValue == 1 || statusValue == 2) return null;
return AccountError.WrongFieldValue;
}),
FieldRequiredRule.instance("deal",
ClearingAccountUpdateRequest::getDeal,
AccountError.RequiredFieldEmpty,
dealValue -> {
Imdg<Company> companyImdg = context.obtainMap(
IMDGDistributedNames.Map_Company, Company.class
);
Company company = companyImdg.getFirstObjectByFieldValues(Map.of("tradingCode", dealValue));
if (company == null) return AccountError.WrongFieldValue;
return null;
})
);
};
}
}

View file

@ -0,0 +1,161 @@
package ru.spcex.clearing.account.config.validation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule;
import ru.spcex.clearing.validation.common.rules.FieldRequiredRule;
import ru.spcex.clearing.validation.common.rules.IdPresentRule;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
@Configuration
public class ClientCodeValidationConfig {
@Bean("clientCodeNewRequestValidator")
public Function<ClientCodeNewRequest, IValidator> clientCodeNewRequestValidator(Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation) {
return clientCodeUpdateRequest -> {
ImdgValidationContext<ClientCodeNewRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(clientCodeUpdateRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
return new ValidatorImpl<>(context,
FieldRequiredRule.instance("companyId", ClientCodeNewRequest::getCompanyId, AccountError.RequiredFieldEmpty),
IdPresentRule.instance("companyId",
ClientCodeNewRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound),
IdPresentRule.instance("moneyAccountId",
ClientCodeNewRequest::getMoneyAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
false,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
IdPresentRule.instance("depoAccountId",
ClientCodeNewRequest::getDepoAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
false,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
DictionaryPresentRule.instance("stauts",
ClientCodeNewRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
);
};
}
@Bean("clientCodeUpdateRequestValidator")
public Function<ClientCodeUpdateRequest, IValidator> clientCodeUpdateRequestValidator(Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation) {
return clientCodeUpdateRequest -> {
ImdgValidationContext<ClientCodeUpdateRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(clientCodeUpdateRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_ClientCode);
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
return new ValidatorImpl<ImdgValidationContext<ClientCodeUpdateRequest>>(context,
IdPresentRule.instance("id",
ClientCodeUpdateRequest::getId,
IMDGDistributedNames.Map_ClientCode,
ClientCode.class,
AccountError.RequiredFieldEmpty,
AccountError.RecordNotFound
),
FieldRequiredRule.instance("companyId", ClientCodeUpdateRequest::getCompanyId, AccountError.RequiredFieldEmpty),
IdPresentRule.instance("companyId",
ClientCodeUpdateRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound),
IdPresentRule.instance("moneyAccountId",
ClientCodeUpdateRequest::getMoneyAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
false,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
IdPresentRule.instance("depoAccountId",
ClientCodeUpdateRequest::getDepoAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
false,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
DictionaryPresentRule.instance("stauts",
ClientCodeUpdateRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
);
};
}
@Bean("clientCodeDeleteRequestValidator")
public Function<CommonDeleteRequest, IValidator> clientCodeDeleteRequestValidator(Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation) {
return companyDeleteRequest -> {
ImdgValidationContext<CommonDeleteRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(companyDeleteRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_ClientCode);
return new ValidatorImpl<>(context,
// FieldRequiredRule.instance("id", CommonDeleteRequest::getId, CompanyErrors.RequiredFieldEmpty),
IdPresentRule.instance("id",
CommonDeleteRequest::getId,
IMDGDistributedNames.Map_ClientCode,
ClientCode.class,
AccountError.RequiredFieldEmpty,
AccountError.RecordNotFound)
);
};
}
}

View file

@ -0,0 +1,71 @@
package ru.spcex.clearing.account.config.validation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.DepoAccountNewRequest;
import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule;
import ru.spcex.clearing.validation.common.rules.FieldNotBlankRequiredRule;
import ru.spcex.clearing.validation.common.rules.FieldRequiredRule;
import ru.spcex.clearing.validation.common.rules.IdPresentRule;
import ru.spcex.clearing.validation.common.rules.specific.FieldRequiredSpecificRule;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl;
import java.util.Collection;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
@Configuration
public class DepoAccountValidationConfig {
@Bean("depoAccountNewRequestValidator")
public Function<DepoAccountNewRequest, IValidator> depoAccountNewRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return depoAccountNewRequest -> {
ImdgValidationContext<DepoAccountNewRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(depoAccountNewRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_DepoAccount);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
return new ValidatorImpl<>(context,
IdPresentRule.instance("companyId",
DepoAccountNewRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound
// company -> !WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()) ? AccountError.CompanyNotActive : null
),
FieldNotBlankRequiredRule.instance("account",
DepoAccountNewRequest::getAccount,
AccountError.RequiredFieldEmpty),
new SameAccountValidationRule<>(AccountType.Depo, DepoAccountNewRequest::getAccount),
FieldRequiredRule.instance("depoAccountType",
DepoAccountNewRequest::getDepoAccountType,
AccountError.RequiredFieldEmpty),
DictionaryPresentRule.instance("status",
DepoAccountNewRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
);
};
}
}

View file

@ -0,0 +1,67 @@
package ru.spcex.clearing.account.config.validation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.platform.dictionary.AccountTypeDictionary;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.InformationAccountNewRequest;
import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule;
import ru.spcex.clearing.validation.common.rules.FieldNotBlankRequiredRule;
import ru.spcex.clearing.validation.common.rules.IdPresentRule;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
@Configuration
public class InformationAccountValidationConfig {
@Bean("informationAccountNewRequestValidator")
public Function<InformationAccountNewRequest, IValidator> informationAccountNewRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return informationAccountNewRequest -> {
ImdgValidationContext<InformationAccountNewRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(informationAccountNewRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_InformationAccount);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary);
addImdg.accept(IMDGDistributedNames.Map_Account);
return new ValidatorImpl<>(context,
IdPresentRule.instance("companyId",
InformationAccountNewRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound,
company -> {
if (!WorkflowStatus.Active.equalsByKey(company.getWorkflowStatus()))
return AccountError.CompanyNotActive;
return null;
}),
FieldNotBlankRequiredRule.instance("account", InformationAccountNewRequest::getAccount,
AccountError.RequiredFieldEmpty),
DictionaryPresentRule.instance("status", InformationAccountNewRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary, ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty, AccountError.DictionaryNotFound, false),
DictionaryPresentRule.instance("accountType", InformationAccountNewRequest::getAccountType,
IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class,
AccountError.RequiredFieldEmpty, AccountError.DictionaryNotFound, false),
new SameAccountValidationRule<>(AccountType.Info, InformationAccountNewRequest::getAccount)
);
};
}
}

View file

@ -0,0 +1,46 @@
package ru.spcex.clearing.account.config.validation;
import ru.clearing.classes.statics.data.account.Account;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;
class SameAccountValidationRule<R> implements IValidationRule<ImdgValidationContext<R>> {
final String accountType;
final Function<R, String> accountGetter;
public SameAccountValidationRule(AccountType accountType, Function<R, String> accountGetter) {
this.accountType = accountType.getKey(); // or req.getAccountType()
this.accountGetter = accountGetter;
Objects.requireNonNull(accountGetter);
}
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<R> context) {
R req = context.getValidatedObject();
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
ImdgPredicateBuilder pb = accountImdg.predicateBuilder();
ImdgPredicate query = pb.and(
pb.equals("account", accountGetter.apply(req)), // req.getAccount()
// pb.equals("accountType", accountType), имена всех счетов уникальны, вне зависимости от типа
pb.in("status", ServiceStatus.Active.getKey(), ServiceStatus.Reopened.getKey(), ServiceStatus.Appl.getKey())
);
Account existAccount = accountImdg.getFirstObjectByPredicate(query);
if (existAccount != null) {
return of(AccountError.AccountAlreadyExist, existAccount.getAccount());
}
return empty();
}
}

View file

@ -0,0 +1,217 @@
package ru.spcex.clearing.account.config.validation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryUpdateRequest;
import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule;
import ru.spcex.clearing.validation.common.rules.FieldRequiredRule;
import ru.spcex.clearing.validation.common.rules.IdPresentRule;
import ru.spcex.clearing.validation.common.rules.specific.IdPresentSpecificRule;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
@Configuration
public class TradingClearingRegistryValidationConfig {
@Bean("tradingClearingRegistryNewRequest")
public Function<TradingClearingRegistryNewRequest, IValidator> tradingClearingRegistryNewRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return tradingClearingRegistryNewRequest -> {
ImdgValidationContext<TradingClearingRegistryNewRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(tradingClearingRegistryNewRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_CompanySymbols);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_ClearingAccount);
addImdg.accept(IMDGDistributedNames.Map_DepoAccount);
addImdg.accept(IMDGDistributedNames.Map_InformationAccount);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
return new ValidatorImpl<>(context,
IdPresentSpecificRule.instance("companyId",
TradingClearingRegistryNewRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound,
true,
company -> {
Imdg<CompanySymbols> companySymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
CompanySymbols symbol = companySymbolsImdg.getFirstObjectByFieldValues(Map.of(
"companyId", company.getId(),
"companySymbol", CompanySymbol.CLRC.getKey()
));
if (symbol == null)
return new EnumMessage(AccountError.ClearingCompanySymbolNotFound, company.getShortName());
return null;
}),
FieldRequiredRule.instance("moneyAccountId",
TradingClearingRegistryNewRequest::getMoneyAccountId,
AccountError.RequiredFieldEmpty,
moneyAccountId -> {
Imdg<Account> accountImdg = context.obtainMap(
IMDGDistributedNames.Map_Account, Account.class
);
Account account = accountImdg.getSingleObjectByID(moneyAccountId);
if (account == null) {
return AccountError.AccountNotFound;
} else {
if (AccountType.Clrn.equalsByKey(account.getAccountType()) || AccountType.Info.equalsByKey(account.getAccountType())) {
// ok
} else {
// неправильный тип
return AccountError.AccountNotFound;
}
}
// Imdg<ClearingAccount> clearingAccountImdg = context.obtainMap(
// IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class
// );
// ClearingAccount clearingAccount = clearingAccountImdg.getSingleObjectByFieldValues(
// Map.of("accountId",moneyAccountId)
// );
// if (clearingAccount == null) {
// Imdg<InformationAccount> informationAccountImdg = context.obtainMap(
// IMDGDistributedNames.Map_InformationAccount, InformationAccount.class
// );
// InformationAccount infoAccount = informationAccountImdg.getSingleObjectByFieldValues(
// Map.of("accountId",moneyAccountId));
// if (infoAccount == null) return AccountError.AccountNotFound;
// }
return null;
}),
FieldRequiredRule.instance("depoAccountId",
TradingClearingRegistryNewRequest::getDepoAccountId,
AccountError.RequiredFieldEmpty,
false,
depoAccountId -> {
if (depoAccountId == null) return null;
Imdg<DepoAccount> depoAccountImdg = context.obtainMap(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
DepoAccount depoAccount = depoAccountImdg.getFirstObjectByFieldValues(
Map.of("accountId", depoAccountId)
);
if (depoAccount == null) return AccountError.AccountNotFound;
return null;
}),
DictionaryPresentRule.instance("status",
TradingClearingRegistryNewRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false),
new newTCRDuplicateCheck()
);
};
}
static class newTCRDuplicateCheck implements IValidationRule<ImdgValidationContext<TradingClearingRegistryNewRequest>> {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TradingClearingRegistryNewRequest> context) {
TradingClearingRegistryNewRequest validatedObject = context.getValidatedObject();
Imdg<TradingClearingRegistry> tcrMap = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
if (validatedObject.getMoneyAccountId() == null) {
return of(AccountError.RequiredFieldEmpty, "MoneyAccountId");
}
//Map<String, Comparable<?>> query = new HashMap<>();
// query.put("moneyAccountId", validatedObject.getMoneyAccountId());
// if (validatedObject.getDepoAccountId() != null) {
// query.put("depoAccountId", validatedObject.getDepoAccountId());
// }
ImdgPredicateBuilder pb = tcrMap.predicateBuilder();
ImdgPredicate query = pb.equals("moneyAccountId", validatedObject.getMoneyAccountId());
if (validatedObject.getDepoAccountId() != null) {
query = pb.or(query, pb.equals("depoAccountId", validatedObject.getDepoAccountId()));
}
Collection<TradingClearingRegistry> existTCR = tcrMap.getCollectionObjectsByPredicate(query);
if (existTCR.isEmpty()) {
return empty();
} else {
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
Account account = accountImdg.getSingleObjectByID(validatedObject.getMoneyAccountId());
if (account == null && validatedObject.getDepoAccountId() != null) account = accountImdg.getSingleObjectByID(validatedObject.getDepoAccountId());
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, account.getAccount());
// String tcrIds = existTCR.stream().map(tcr -> String.valueOf(tcr.getId())).collect(Collectors.joining(";"));
// return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, tcrIds);
}
}
}
@Bean("tradingClearingRegistryUpdateRequest")
public Function<TradingClearingRegistryUpdateRequest, IValidator> tradingClearingRegistryUpdateRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return tradingClearingRegistryUpdateRequest -> {
ImdgValidationContext<TradingClearingRegistryUpdateRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(tradingClearingRegistryUpdateRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
return new ValidatorImpl<>(context,
IdPresentRule.instance("id",
TradingClearingRegistryUpdateRequest::getId,
IMDGDistributedNames.Map_TradingClearingRegistry,
TradingClearingRegistry.class,
AccountError.RequiredFieldEmpty,
AccountError.TradingClearingRegistryNotFound),
DictionaryPresentRule.instance("status",
TradingClearingRegistryUpdateRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
);
};
}
@Bean("tradingClearingRegistryBlockRequest")
public Function<CommonIdRequest, IValidator> tradingClearingRegistryBlockRequestValidator(
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
) {
return tradingClearingRegistryBlockRequest -> {
ImdgValidationContext<CommonIdRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(tradingClearingRegistryBlockRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
return new ValidatorImpl<>(context,
IdPresentRule.instance("id",
CommonIdRequest::getId,
IMDGDistributedNames.Map_TradingClearingRegistry,
TradingClearingRegistry.class,
AccountError.RequiredFieldEmpty,
AccountError.TradingClearingRegistryNotFound)
);
};
}
}

View file

@ -0,0 +1,58 @@
package ru.spcex.clearing.account.config.validation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.*;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.platform.dictionary.*;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
@Configuration
public class ValidationConfig {
@Bean("imdgForValidation")
public Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation(ImdgProvider imdgProvider) {
final Map<String, Imdg<? extends SpcexObjectBase>> imdg = new HashMap<>();
BiConsumer<String, Class<? extends SpcexObjectBase>> addImdg = (s, aClass) -> imdg.put(s, imdgProvider.getImdg(s, aClass));
addImdg.accept(IMDGDistributedNames.Map_Company, Company.class);
addImdg.accept(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
addImdg.accept(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
addImdg.accept(IMDGDistributedNames.Map_ClearingAccountTypeDictionary, ClearingAccountTypeDictionary.class);
addImdg.accept(IMDGDistributedNames.Map_Account, Account.class);
addImdg.accept(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class);
addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class);
addImdg.accept(IMDGDistributedNames.Map_BankAccount, BankAccount.class);
addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class);
addImdg.accept(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
addImdg.accept(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary, ServiceStatusDictionary.class);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
addImdg.accept(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
//for ClientCodeValidationConfig
addImdg.accept(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
return imdg;
}
@Bean("validationHelper")
public ValidationHelper validationHelper(IMessageResolver messageResolver) {
return new ValidationHelper(messageResolver);
}
}

View file

@ -0,0 +1,39 @@
package ru.spcex.clearing.account.errors;
import ru.spcex.platform.utils.enumeration.IErrorEnumId;
public enum AccountError implements IErrorEnumId {
GeneralError(5000L),
UserVerifyDenial(5001L),
RequiredFieldEmpty(5002L),
DictionaryNotFound(5003L),
WrongFieldValue(5004L),
RecordNotFound(5006L),
AccountAlreadyExist(5010L),
AccountNotFound(5011L),
AccountNotActive(5012L),
CompanyNotFound(5013L),
CompanyNotActive(5014L),
InfoAccountAlreadyExist(5015L),
TradingClearingRegistryAlreadyExist(5016L),
DepoAccountNotFound(5017L),
MoneyAccountNotFound(5018L),
ClearingCategoryNotFound(5019L),
ClearingCompanySymbolNotFound(5022L), // Для компании %s отсутствует клиринговый код».
AccountForTradingClearingRegistryAlreadyUsed(5023L),
AccountFieldNotSet(5024L),
AccountDepoTypeRequired(5025L),
TradingClearingRegistryNotFound(3022L),
;
private final Long id;
AccountError(Long id) {
this.id = id;
}
@Override
public Long getId() {
return id;
}
}

View file

@ -0,0 +1,106 @@
package ru.spcex.clearing.account.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.Status;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import java.util.Collection;
@Service
public class AccountHelper {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<ClearingMemberCategory> clearingMemberCategoryMap;
private final Imdg<Relation> relationMap;
private final IMessageResolver messageResolver;
@Autowired
public AccountHelper(ImdgProvider imdgProvider,
IMessageResolver messageResolver) {
this.clearingMemberCategoryMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class
);
this.relationMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_Relation, Relation.class
);
this.messageResolver = messageResolver;
}
/**
* Заполняет поля relationId и companyId из соответствующей записи Relation
*
* @param requestId Идентификатор запроса для вывода лога
*/
public RequestInfoUpdate fillAccountFromRelation(Account account, Long requestId, boolean checkClearingMemberCategory) {
Long companyId = account.getCompanyId();
Collection<Relation> relations;
ImdgPredicateBuilder relationPredicateBuilder = relationMap.predicateBuilder();
ImdgPredicate finalRelationPredicate;
if (checkClearingMemberCategory) {
ImdgPredicateBuilder clearingMemberCategoryPredicateBuilder = clearingMemberCategoryMap.predicateBuilder();
ImdgPredicate companyIdEquals = clearingMemberCategoryPredicateBuilder.equals("companyId", companyId);
Collection<ClearingMemberCategory> clearingMemberCategories = clearingMemberCategoryMap.getCollectionObjectsByPredicate(companyIdEquals);
if (clearingMemberCategories.isEmpty())
return makeError(requestId, AccountError.ClearingCategoryNotFound, companyId, "(any)");
if (clearingMemberCategories.size() > 1)
log.warn("ClearingMemberCategory for companyId {} contains multiply elements, use first", companyId);
ClearingMemberCategory clearingMemberCategory = clearingMemberCategories.iterator().next();
ImdgPredicate consumerIdPredicate = relationPredicateBuilder.equals("consumerId", companyId);
ImdgPredicate servicePredicate;
String clearingCategoryValue = clearingMemberCategory.getClearingMemberCategory();
if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.B, ClearingCategory.I, ClearingCategory.V)) {
servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.MKR.getKey());
} else if (IEnumKey.contains(clearingCategoryValue, ClearingCategory.F, ClearingCategory.C)) {
servicePredicate = relationPredicateBuilder.equals("service", ru.spcex.platform.enumeration.Service.FOND.getKey());
} else {
log.info("ClearingCategoryNotFound with clearingCategoryValue={} not implemented. Do not search Relation.", clearingCategoryValue);
return null;
//return makeError(requestId, AccountError.ClearingCategoryNotFound, companyId, clearingCategoryValue + " (case not implemented)");
}
finalRelationPredicate = relationPredicateBuilder.and(consumerIdPredicate, servicePredicate);
relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate);
} else {
finalRelationPredicate = relationPredicateBuilder.equals("consumerId", companyId);
relations = relationMap.getCollectionObjectsByPredicate(finalRelationPredicate);
}
if (relations.isEmpty()) {
//return makeError(requestId, AccountError.WrongFieldValue, "companyId", finalRelationPredicate.toString());
log.info("Relation not found: {}", finalRelationPredicate.toString());
return null;
}
if (relations.size() > 1)
log.warn("Relation for consumerId {} contains multiply elements, use first", companyId);
Relation relation = relations.iterator().next();
account.setRelationId(relation.getId());
return null;
}
public RequestInfoUpdate makeError(Long reqId, AccountError accountError, Object... args) {
String errMsg = messageResolver.resolve(new EnumMessage(accountError, args));
return new RequestInfoUpdate()
.setId(reqId)
.setStatus(Status.Error)
.setMessage(errMsg);
}
}

View file

@ -0,0 +1,334 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.CorrespondentAccountNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.CorrespondentAccountUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountTerminationRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.Status;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.ImdgTransaction;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
import java.util.function.Function;
@Service
public class AccountService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImdgProvider imdgProvider;
private final Imdg<Account> accountMap;
private final Imdg<ClearingMemberCategory> clearingMemberCategoryMap;
private final Imdg<Relation> relationMap;
private final KafkaSender kafkaSender;
private final IMessageResolver messageResolver;
private final UserRoleVerification userRoleVerification;
private final ValidationHelper validationHelper;
private final AccountHelper accountHelper;
private final InformationAccountService informationAccountService;
private final Function<CorrespondentAccountNewRequest, IValidator> accountNewRequestValidator;
private final Function<CorrespondentAccountUpdateRequest, IValidator> accountUpdateRequestValidator;
private final Function<CommonIdRequest, IValidator> accountBlockRequestValidator;
@Autowired
public AccountService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
ImdgProvider imdgProvider,
KafkaSender kafkaSender,
IMessageResolver messageResolver,
UserRoleVerification userRoleVerification,
ValidationHelper validationHelper,
AccountHelper accountHelper,
InformationAccountService informationAccountService,
@Qualifier("correspondentAccountNewRequestValidator")
Function<CorrespondentAccountNewRequest, IValidator> accountNewRequestValidator,
@Qualifier("correspondentAccountUpdateRequestValidator")
Function<CorrespondentAccountUpdateRequest, IValidator> accountUpdateRequestValidator,
@Qualifier("correspondentAccountBlockRequestValidator")
Function<CommonIdRequest, IValidator> accountBlockRequestValidator) {
super(kafkaQueue, kafkaProducer);
this.accountHelper = accountHelper;
this.imdgProvider = imdgProvider;
this.accountMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_Account, Account.class
);
this.clearingMemberCategoryMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class
);
this.relationMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_Relation, Relation.class
);
this.kafkaSender = kafkaSender;
this.messageResolver = messageResolver;
this.userRoleVerification = userRoleVerification;
this.validationHelper = validationHelper;
this.informationAccountService = informationAccountService;
this.accountNewRequestValidator = accountNewRequestValidator;
this.accountUpdateRequestValidator = accountUpdateRequestValidator;
this.accountBlockRequestValidator = accountBlockRequestValidator;
}
@Override
public void afterPropertiesSet() {
imdgProvider.waitAvailable();
callback(CorrespondentAccountNewRequest.class)
.setFunction(this::accountCorrespondentNew)
.forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_NEW, callbacks::put);
callback(CorrespondentAccountUpdateRequest.class)
.setFunction(this::correspondentAccountUpdate)
.forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_UPDATE, callbacks::put);
callback(CommonIdRequest.class)
.setFunction(this::correspondentAccountBlock)
.forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_BLOCK, callbacks::put);
callback(AccountTerminationRequest.class)
.setFunction(this::accountTerminationForCompany)
.forDestination(Consts.ACCOUNT_TERMINATION, callbacks::put);
init();
}
public RequestInfoUpdate accountCorrespondentNew(BaseRequest<CorrespondentAccountNewRequest> userRequest) {
log.debug("CorrespondentAccountNewRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountNewRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
CorrespondentAccountNewRequest req = userRequest.getRequestPayload();
Instant now = Instant.now();
Account account = new Account();
account.setCompanyId(req.getCompanyId());
account.setAccount(req.getAccount());
if (AccountType.Info.equalsByKey(req.getAccountType())) {
Long infoSequenceId = informationAccountService.accountNextId();
String accountValue = informationAccountService.generateInfoAccount(infoSequenceId);
log.trace("New info-account SequenceId={} account={}", infoSequenceId, accountValue);
account.setAccount(accountValue);
}
account.setAccountType(req.getAccountType());
if (req.getStatus() == null) {
account.setStatus(WorkflowStatus.Active.getKey());
log.trace("Status not set in request. Use default: {}", account.getStatus());
} else {
account.setStatus(req.getStatus());
}
account.setCreated(now);
account.setUpdated(now);
requestInfoUpdate = accountHelper.fillAccountFromRelation(account, userRequest.getId(), false);
if (requestInfoUpdate != null) return requestInfoUpdate;
Long newId = null;
if (AccountType.Corr.equalsByKey(account.getAccountType())) {
// default, дополнительные таблицы не требуются
newId = accountMap.insert(account);
} else {
// Транзакцией
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
imdgTransaction.beginTransaction();
boolean txOk = false;
try {
Imdg<Account> accountMap = imdgTransaction.getImdg(IMDGDistributedNames.Map_Account, Account.class);
newId = accountMap.insert(account);
if (AccountType.Corr.equalsByKey(account.getAccountType())) {
// default, дополнительные таблицы не требуются
} else if (AccountType.Info.equalsByKey(account.getAccountType()))
makeInfoPart(imdgTransaction, account);
else if (AccountType.Depo.equalsByKey(account.getAccountType()))
makeDepoPart(imdgTransaction, account, req);
else if (AccountType.Clrn.equalsByKey(account.getAccountType()))
makeClrnPart(imdgTransaction, account);
else {
log.warn("Unexpected AccountType={}. Do not create additional record to other table's", account.getAccountType());
}
txOk = true;
} finally {
if (txOk) {
imdgTransaction.commitTransaction();
} else {
log.debug("failed insert, new account id {} rollback", newId);
imdgTransaction.rollbackTransaction();
}
}
}
log.debug("successfully processed, new account id {}", newId);
return null;
}
protected void makeInfoPart(ImdgTransaction imdgTransaction, Account account) {
Imdg<InformationAccount> informationAccountMap = imdgTransaction.getImdg(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class);
InformationAccount infoAcc = new InformationAccount();
infoAcc.setAccountId(account.getId());
Account firstAccountAntl = accountMap.getFirstObjectByFieldValues(Map.of(
"companyId", Sender.One.getId(),
"accountType", AccountType.Anlt.getKey()
));
if (firstAccountAntl == null) {
log.warn("Can not find 1 ANTL account for fill information ClearingAccountId.");
} else {
infoAcc.setClearingAccountId(firstAccountAntl.getId());
}
infoAcc.setCompanyId(account.getCompanyId());
Long infoId = informationAccountMap.insert(infoAcc);
log.debug("For account id={} make InformationAccount id={}", account.getId(), infoId);
}
protected void makeDepoPart(ImdgTransaction imdgTransaction, Account account, CorrespondentAccountNewRequest req) {
Imdg<DepoAccount> depoAccountMap = imdgTransaction.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
DepoAccount depoAcc = new DepoAccount();
depoAcc.setAccountId(account.getId());
depoAcc.setCompanyId(account.getCompanyId());
if (account.getAccount() != null && account.getAccount().contains("BC")) {
depoAcc.setDepoAccountType(DepoAccountType.C.getKey());
} else {
//todo в реквесте нет поля depoAcc.setDepoAccountType(req.getDepoAccountType());
}
Long depoId = depoAccountMap.insert(depoAcc);
log.debug("For account id={} make DepoAccount id={}", account.getId(), depoId);
}
protected void makeClrnPart(ImdgTransaction imdgTransaction, Account account) {
Imdg<ClearingAccount> clearingAccountMap = imdgTransaction.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
ClearingAccount clnrAcc = new ClearingAccount();
clnrAcc.setAccountId(account.getId());
clnrAcc.setCompanyId(account.getCompanyId());
Long clrnId = clearingAccountMap.insert(clnrAcc);
log.debug("For account id={} make ClearingAccount id={}", account.getId(), clrnId);
}
public RequestInfoUpdate correspondentAccountUpdate(BaseRequest<CorrespondentAccountUpdateRequest> userRequest) {
log.debug("CorrespondentAccountUpdateRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountUpdateRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
CorrespondentAccountUpdateRequest request = userRequest.getRequestPayload();
Account account = accountMap.getSingleObjectByID(request.getId());
if (request.getAccountType() != null && !request.getAccountType().equals(account.getAccountType())) {
requestInfoUpdate = makeError(userRequest.getId(), AccountError.WrongFieldValue, "accountType");
return requestInfoUpdate;
}
if (request.getStatus() != null) account.setStatus(request.getStatus());
account.setUpdated(Instant.now());
accountMap.update(account);
log.debug("successfully processed, update account id {}", account.getId());
return null;
}
public RequestInfoUpdate correspondentAccountBlock(BaseRequest<CommonIdRequest> userRequest) {
log.debug("AccountBlockRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountBlockRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
CommonIdRequest request = userRequest.getRequestPayload();
Account account = accountMap.getSingleObjectByID(request.getId());
account.setStatus(ServiceStatus.Blocked.getKey());
account.setUpdated(Instant.now());
accountMap.update(account);
log.debug("successfully processed, block account id {}", account.getId());
return null;
}
public RequestInfoUpdate accountTerminationForCompany(BaseRequest<AccountTerminationRequest> userRequest) {
log.debug("AccountTerminationRequest received, id={}", userRequest.getId());
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate; // never - system
AccountTerminationRequest req = userRequest.getRequestPayload();
final Long companyId = req.getCompanyId();
Collection<Account> accounts = accountMap.getCollectionObjectsBySQL("companyId=" + companyId);
log.trace("Found {} accounts (will be terminated) by company {}", accounts.size(), companyId);
int blockCount = 0;
ImdgTransaction tx = imdgProvider.newTransaction();
boolean txOk = false;
try {
tx.beginTransaction();
for (Account account : accounts) {
//Account account = accountMap.getSingleObjectByID(request.getId());
if (!ServiceStatus.Blocked.equalsByKey(account.getStatus())) {
account.setStatus(ServiceStatus.Blocked.getKey());
account.setUpdated(Instant.now());
accountMap.update(account);
blockCount++;
}
}
txOk = true;
} finally {
if (txOk)
tx.commitTransaction();
else
tx.beginTransaction();
}
log.debug("For company {} block {} account (of {} account)", companyId, blockCount, accounts.size());
Long reqId = kafkaSender.sendRequestToQueue(Consts.ACCOUNT_TERMINATION_STEP2, req);
log.info("On termination request id={} send to next step {} new request id={}",
userRequest.getId(), Consts.ACCOUNT_TERMINATION_STEP2, reqId);
log.debug("successfully processed, account termination");
return null;
}
private RequestInfoUpdate makeError(Long reqId, AccountError accountError, Object... args) {
String errMsg = messageResolver.resolve(new EnumMessage(accountError, args));
return new RequestInfoUpdate()
.setId(reqId)
.setStatus(Status.Error)
.setMessage(errMsg);
}
}

View file

@ -0,0 +1,122 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.*;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountSymbolsNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator;
import java.util.function.Function;
@Service
public class AccountSymbolsService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ValidationHelper validationHelper;
private final UserRoleVerification userRoleVerification;
private final ImdgProvider imdgProvider;
private final Imdg<AccountSymbols> accountSymbolsImdg;
private final RequestHelper requestHelper;
private final Function<AccountSymbolsNewRequest, IValidator> accountSymbolsNewRequestValidator;
private final IMessageResolver messageResolver;
private final Producer<String, Object> kafkaProducer;
private final KafkaSender kafkaSender;
public AccountSymbolsService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
KafkaSender kafkaSender,
ImdgProvider imdgProvider,
ValidationHelper validationHelper,
UserRoleVerification userRoleVerification,
IMessageResolver messageResolver,
RequestHelper requestHelper,
@Qualifier("accountSymbolsDepoNewRequest")
Function<AccountSymbolsNewRequest, IValidator> accountSymbolsNewRequestValidator
) {
super(kafkaQueue, kafkaProducer);
this.kafkaProducer = kafkaProducer;
this.kafkaSender = kafkaSender;
this.validationHelper = validationHelper;
this.userRoleVerification = userRoleVerification;
this.requestHelper = requestHelper;
this.imdgProvider = imdgProvider;
this.accountSymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
this.accountSymbolsNewRequestValidator = accountSymbolsNewRequestValidator;
this.messageResolver = messageResolver;
}
@Override
public void afterPropertiesSet() throws Exception {
imdgProvider.waitAvailable();
callback(AccountSymbolsNewRequest.class)
.setFunction(this::accountSymbolsNew)
.forDestination(Consts.DESTINATION_DEPO_ACCOUNT_SYMBOLS_NEW, callbacks::put);
callback(CommonIdRequest.class)
.setFunction(this::accountSymbolsDelete)
.forDestination(Consts.DESTINATION_DEPO_ACCOUNT_SYMBOLS_DELETE, callbacks::put);
init();
}
protected RequestInfoUpdate accountSymbolsNew(BaseRequest<AccountSymbolsNewRequest> userRequest) {
log.debug("AccountSymbolsNewRequest received, id={}", userRequest.getId());
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountSymbolsNewRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
AccountSymbolsNewRequest req = userRequest.getRequestPayload();
Long id = accountSymbolsImdg.nextIDSequenceFor();
AccountSymbols accountSymbols = new AccountSymbols();
accountSymbols.setId(id);
accountSymbols.setAccountId(req.getAccountId());
accountSymbols.setAccountSymbolValue(req.getAccountSymbolValue());
accountSymbolsImdg.insert(accountSymbols);
log.debug("successfully processed, id {}. New accountSymbols.id={} was created", id, accountSymbols.getId());
return null;
}
protected RequestInfoUpdate accountSymbolsDelete(BaseRequest<CommonIdRequest> userRequest) {
log.debug("AccountSymbolsDeleteRequest(CommonIdRequest) received, id={}", userRequest.getId());
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
CommonIdRequest req = userRequest.getRequestPayload();
AccountSymbols accountSymbols = accountSymbolsImdg.getSingleObjectByID(req.getId());
if (accountSymbols == null) {
return requestHelper.makeErrorResponse(userRequest, AccountError.AccountNotFound, req.getId());
}
accountSymbolsImdg.delete(accountSymbols);
log.debug("successfully processed, id {}. New accountSymbols.id={} was deleted", userRequest.getId(), accountSymbols.getId());
return null;
}
}

View file

@ -0,0 +1,230 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.BankAccount;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.ImdgTransaction;
import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.function.Function;
@Service
public class BankAccountService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Imdg<BankAccount> bankAccountMap;
private final Imdg<Account> accountMap;
private final ImdgProvider imdgProvider;
private final UserRoleVerification userRoleVerification;
private final ValidationHelper validationHelper;
private final AccountHelper accountService;
private final Function<BankAccountNewRequest, IValidator> bankAccountNewRequestValidator;
private final Function<BankAccountUpdateRequest, IValidator> bankAccountUpdateRequestValidator;
private final Function<CommonIdRequest, IValidator> bankAccountBlockRequestValidator;
@Autowired
public BankAccountService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
ImdgProvider imdgProvider,
UserRoleVerification userRoleVerification,
ValidationHelper validationHelper,
AccountHelper accountService,
@Qualifier("bankAccountNewRequestValidator")
Function<BankAccountNewRequest, IValidator> bankAccountNewRequestValidator,
@Qualifier("bankAccountUpdateRequestValidator")
Function<BankAccountUpdateRequest, IValidator> bankAccountUpdateRequestValidator,
@Qualifier("bankAccountBlockRequestValidator")
Function<CommonIdRequest, IValidator> bankAccountBlockRequestValidator) {
super(kafkaQueue, kafkaProducer);
this.bankAccountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_BankAccount, BankAccount.class);
this.accountMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.imdgProvider = imdgProvider;
this.userRoleVerification = userRoleVerification;
this.validationHelper = validationHelper;
this.accountService = accountService;
this.bankAccountNewRequestValidator = bankAccountNewRequestValidator;
this.bankAccountUpdateRequestValidator = bankAccountUpdateRequestValidator;
this.bankAccountBlockRequestValidator = bankAccountBlockRequestValidator;
}
@Override
public void afterPropertiesSet() {
callback(BankAccountNewRequest.class)
.setFunction(this::bankAccountNew)
.forDestination(Consts.DESTINATION_BANK_ACCOUNT_NEW, callbacks::put);
callback(BankAccountUpdateRequest.class)
.setFunction(this::bankAccountUpdate)
.forDestination(Consts.DESTINATION_BANK_ACCOUNT_UPDATE, callbacks::put);
callback(CommonIdRequest.class)
.setFunction(this::bankAccountBlock)
.forDestination(Consts.DESTINATION_BANK_ACCOUNT_BLOCK, callbacks::put);
init();
}
public RequestInfoUpdate bankAccountNew(BaseRequest<BankAccountNewRequest> userRequest) {
log.debug("BankAccountNewRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, bankAccountNewRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
BankAccountNewRequest req = userRequest.getRequestPayload();
Instant now = Instant.now();
Account account = new Account();
account.setAccount(req.getAccount());
account.setAccountType(AccountType.Bank.getKey());
if (req.getStatus() == null) {
log.trace("Status not set in request. Use default: {}", account.getStatus());
account.setStatus(WorkflowStatus.Active.getKey());
} else {
account.setStatus(req.getStatus());
}
account.setCompanyId(req.getCompanyId());
account.setCreated(now);
account.setUpdated(now);
requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId(), false);
if (requestInfoUpdate != null) return requestInfoUpdate;
Long bankAccountId = -1L;
Long accountId = -1L;
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
boolean txOk = false;
imdgTransaction.beginTransaction();
try {
Imdg<BankAccount> bankAccountMap = imdgTransaction.getImdg(IMDGDistributedNames.Map_BankAccount, BankAccount.class);
Imdg<Account> accountMap = imdgTransaction.getImdg(IMDGDistributedNames.Map_Account, Account.class);
accountId = accountMap.insert(account);
BankAccount bankAccount = new BankAccount();
bankAccount.setBankIdentificationCode(req.getBankIdentificationCode());
bankAccount.setBankName(req.getBankName());
bankAccount.setCorrespondentAccount(req.getCorrespondentAccount());
bankAccount.setCorrespondentAccountName(req.getCorrespondentAccountName());
bankAccount.setCurrency(req.getCurrency());
bankAccount.setDestination(req.getDestination());
bankAccount.setTaxpayerIdentificationNumber(req.getTaxpayerIdentificationNumber());
bankAccount.setTaxRegistrationReasonCode(req.getTaxRegistrationReasonCode());
bankAccount.setAccount(req.getAccount());
bankAccount.setCompanyId(req.getCompanyId());
bankAccount.setAccountId(accountId);
bankAccountId = bankAccountMap.insert(bankAccount);
txOk = true;
} finally {
if (txOk) {
imdgTransaction.commitTransaction();
log.debug("successfully processed, new bank account id {}, account id {}", bankAccountId, accountId);
} else {
log.debug("failed insert, new bank account id {}, new account id {} (if id = -1 then insert is failed)",
bankAccountId,
accountId);
imdgTransaction.rollbackTransaction();
}
}
return null;
}
private RequestInfoUpdate bankAccountUpdate(BaseRequest<BankAccountUpdateRequest> userRequest) {
BankAccountUpdateRequest req = userRequest.getRequestPayload();
log.debug("BankAccountUpdateRequest received id = {}", req.getId());
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, bankAccountUpdateRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
BankAccount bankAccount = bankAccountMap.getSingleObjectByID(req.getId());
bankAccount.setBankIdentificationCode(req.getBankIdentificationCode());
bankAccount.setBankName(req.getBankName());
bankAccount.setCorrespondentAccount(req.getCorrespondentAccount());
bankAccount.setCorrespondentAccountName(req.getCorrespondentAccountName());
bankAccount.setCurrency(req.getCurrency());
bankAccount.setDestination(req.getDestination());
bankAccount.setTaxpayerIdentificationNumber(req.getTaxpayerIdentificationNumber());
bankAccount.setTaxRegistrationReasonCode(req.getTaxRegistrationReasonCode());
bankAccount.setAccount(req.getAccount());
Account account = accountMap.getSingleObjectByID(bankAccount.getAccountId());
account.setAccount(req.account);
account.setUpdated(Instant.now());
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
boolean txOk = false;
imdgTransaction.beginTransaction();
try {
Imdg<BankAccount> bankAccountMap = imdgTransaction.getImdg(IMDGDistributedNames.Map_BankAccount, BankAccount.class);
Imdg<Account> accountMap = imdgTransaction.getImdg(IMDGDistributedNames.Map_Account, Account.class);
accountMap.update(account);
bankAccountMap.update(bankAccount);
txOk = true;
} finally {
if (txOk) {
imdgTransaction.commitTransaction();
log.debug("successfully processed, new bank account id {}, account id {}",
bankAccount.getId(),
account.getId());
} else {
log.debug("failed update, bank account id {}, new account id {}",
bankAccount.getId(),
account.getId());
imdgTransaction.rollbackTransaction();
}
}
log.debug("successfully update, existing bankAccount with id {}", bankAccount.getId());
return null;
}
private RequestInfoUpdate bankAccountBlock(BaseRequest<CommonIdRequest> userRequest) {
CommonIdRequest req = userRequest.getRequestPayload();
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, bankAccountBlockRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
log.debug("CommonIdRequest received id = {}", req.getId());
BankAccount bankAccount = bankAccountMap.getSingleObjectByID(req.getId());
Account account = accountMap.getSingleObjectByID(bankAccount.getAccountId());
account.setStatus(ServiceStatus.Blocked.getKey());
account.setUpdated(Instant.now());
accountMap.update(account);
//без изменений bankAccountMap.update(bankAccount);
log.debug("successfully block, existing bankAccount with id {}", bankAccount.getId());
return null;
}
}

View file

@ -0,0 +1,617 @@
package ru.spcex.clearing.account.service;
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.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.classes.statics.data.misc.Notification;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.sdf.SDf52;
import ru.clearing.platform.dictionary.ClearingCategoryDictionary;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf01Request;
import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.AccountSdfToStatementRequestPart;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.NotificationFeedbackRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.NotificationNewRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.ImdgTransaction;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.collection.Pair;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IErrorEnumId;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
@Service
public class ClearingAccountService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final KafkaSender kafkaSender;
private final AccountHelper accountService;
private final SDFProcessService sdfProcessService;
private final ValidationHelper validationHelper;
private final ImdgProvider imdgProvider;
private final IMessageResolver messageResolver;
private final RequestHelper requestHelper;
private final Function<ClearingAccountNewRequest, IValidator> clearingAccountNewRequestValidator;
private final Function<ClearingAccountUpdateRequest, IValidator> clearingAccountUpdateRequestValidator;
private final Imdg<Account> accountImdg;
private final Imdg<ClearingAccount> clearingAccountImdg;
private final Imdg<Company> companyImdg;
private final Imdg<Relation> relationImdg;
private final Imdg<ClearingMemberCategory> clearingMemberCategoryImdg;
private final Imdg<ClearingCategoryDictionary> clearingCategoryImdg;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<Notification> notificationImdg;
@Autowired
public ClearingAccountService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaResponseQueue,
KafkaSender kafkaSender,
AccountHelper accountService,
SDFProcessService sdfProcessService,
ValidationHelper validationHelper,
ImdgProvider imdgProvider,
IMessageResolver messageResolver,
RequestHelper requestHelper,
@Qualifier("clearingAccountNewRequestValidator")
Function<ClearingAccountNewRequest, IValidator> clearingAccountNewRequestValidator,
@Qualifier("clearingAccountUpdateRequestValidator")
Function<ClearingAccountUpdateRequest, IValidator> clearingAccountUpdateRequestValidator) {
super(kafkaQueue, kafkaResponseQueue);
this.kafkaSender = kafkaSender;
this.accountService = accountService;
this.sdfProcessService = sdfProcessService;
this.validationHelper = validationHelper;
this.imdgProvider = imdgProvider;
this.messageResolver = messageResolver;
this.requestHelper = requestHelper;
this.clearingAccountNewRequestValidator = clearingAccountNewRequestValidator;
this.clearingAccountUpdateRequestValidator = clearingAccountUpdateRequestValidator;
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.relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class);
this.clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
this.clearingCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingCategoryDictionary, ClearingCategoryDictionary.class);
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.notificationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Notification, Notification.class);
}
@Override
public void afterPropertiesSet() throws Exception {
callback(ClearingAccountNewRequest.class)
.setFunction(this::clearingAccountNew)
.forDestination(Consts.DESTINATION_CLEARING_ACCOUNT_NEW, callbacks::put);
callback(ClearingAccountUpdateRequest.class)
.setFunction(this::clearingAccountUpdate)
.forDestination(Consts.DESTINATION_CLEARING_ACCOUNT_UPDATE, callbacks::put);
callback(AccountSdf01Request.class)
.setFunction(this::accountNewSdf01)
.forDestination(Consts.ACCOUNT_NEW_SDF01, callbacks::put);
callback(StatementRequest.class)
.setFunction(this::accountUpdateSdf52)
.forDestination(Consts.ACCOUNT_PROCESS_SDF52, callbacks::put);
callback(NotificationFeedbackRequest.class)
.setFunction(this::accountUpdateSdf52_part2Notification)
.forDestination(Consts.ACCOUNT_NOTIFICATION_FEEDBACK, callbacks::put);
init();
}
public RequestInfoUpdate clearingAccountNew(BaseRequest<ClearingAccountNewRequest> userRequest) {
RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(
userRequest, clearingAccountNewRequestValidator
);
if (requestInfoUpdate != null) return requestInfoUpdate;
ClearingAccountNewRequest req = userRequest.getRequestPayload();
Instant now = Instant.now();
Account account = new Account();
account.setAccount(req.getAccount());
account.setAccountType(AccountType.Clrn.getKey());
if (req.getStatus() == null) {
account.setStatus(WorkflowStatus.Active.getKey());
log.trace("Status not set in request. Use default: {}", account.getStatus());
} else {
account.setStatus(req.getStatus());
}
account.setCompanyId(req.getCompanyId());
account.setCreated(now);
account.setUpdated(now);
requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId(), true);
if (requestInfoUpdate != null) return requestInfoUpdate;
Long clearingAccountId = -1L;
Long accountId = -1L;
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
boolean txOk = false;
imdgTransaction.beginTransaction();
ClearingAccount clearingAccount = null;
try {
Imdg<Account> accountImdg = imdgTransaction.getImdg(IMDGDistributedNames.Map_Account, Account.class);
Imdg<ClearingAccount> clearingAccountImdg = imdgTransaction.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
accountId = accountImdg.insert(account);
clearingAccount = new ClearingAccount();
clearingAccount.setCompanyId(req.getCompanyId());
clearingAccount.setAccountId(accountId);
clearingAccount.setClearingAccountType(req.getClearingAccountType());
clearingAccountId = clearingAccountImdg.insert(clearingAccount);
txOk = true;
} finally {
if (txOk) {
imdgTransaction.commitTransaction();
log.debug("successfully processed, new clearing account id {}, account id {}", clearingAccountId, accountId);
} else {
log.debug("failed insert, new clearing account id {}, new account id {} (if id = -1 then insert is failed)",
clearingAccountId,
accountId);
imdgTransaction.rollbackTransaction();
}
}
return null;
}
public RequestInfoUpdate clearingAccountUpdate(BaseRequest<ClearingAccountUpdateRequest> userRequest) {
RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(
userRequest, clearingAccountUpdateRequestValidator
);
if (requestInfoUpdate != null) return requestInfoUpdate;
ClearingAccountUpdateRequest req = userRequest.getRequestPayload();
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
boolean txOk = false;
imdgTransaction.beginTransaction();
try {
Imdg<Account> accountImdg = imdgTransaction.getImdg(IMDGDistributedNames.Map_Account, Account.class);
Imdg<ClearingAccount> clearingAccountImdg = imdgTransaction.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
ImdgPredicateBuilder pb = accountImdg.predicateBuilder();
ImdgPredicate accountValuePredicate = pb.equals("account", req.getAccount());
ImdgPredicate accountStatusPredicate = pb.equals("status", ServiceStatus.Active.getKey());
ImdgPredicate accountTypePredicate = pb.equals("accountType", AccountType.Clrn.getKey());
ImdgPredicate finalPredicate = pb.and(accountValuePredicate,
accountStatusPredicate,
accountTypePredicate);
Account account = accountImdg.getCollectionObjectsByPredicate(finalPredicate).iterator().next();
Long accountId = account.getId();
ClearingAccount clearingAccount = clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", accountId));
if (clearingAccount == null)
return requestHelper.makeErrorResponse(userRequest, AccountError.AccountNotFound, account.getAccount());
Integer statusValue = req.getStatus();
if (statusValue == 0) account.setStatus(ServiceStatus.Blocked.getKey());
else if (statusValue == 1) account.setStatus(ServiceStatus.Active.getKey());
else if (statusValue == 2) account.setStatus(ServiceStatus.Closed.getKey());
account.setUpdated(Instant.now());
accountImdg.update(account);
txOk = true;
} finally {
if (txOk) imdgTransaction.commitTransaction();
else imdgTransaction.rollbackTransaction();
}
return null;
}
public RequestInfoUpdate accountNewSdf01(BaseRequest<AccountSdf01Request> userRequest) {
log.debug("AccountSdf01Request received, id={}", userRequest.getId());
AccountSdf01Request req = userRequest.getRequestPayload();
List<AccountSdfToStatementRequestPart> accountToStatement = new ArrayList<>();
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
boolean txOk = false;
imdgTransaction.beginTransaction();
try {
Imdg<Account> accountImdg = imdgTransaction.getImdg(IMDGDistributedNames.Map_Account, Account.class);
Imdg<ClearingAccount> clearingAccountImdg = imdgTransaction.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
accountsLoop:
for (AccountSdfRequestPart accountReq : req.getAccounts()) {
Instant now = Instant.now();
Account account = new Account();
account.setAccount(accountReq.getAccount());
account.setAccountType(AccountType.Clrn.getKey());
account.setStatus(ServiceStatus.Active.getKey());
account.setCompanyId(accountReq.getCompanyId());
account.setCreated(now);
account.setUpdated(now);
RequestInfoUpdate requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId(), true);
if (requestInfoUpdate != null) {
log.warn("Error fill new account from relation. {}", /*account.getId(),*/ requestInfoUpdate.getMessage());
{
AccountSdfToStatementRequestPart responsePart = new AccountSdfToStatementRequestPart();
responsePart.setSdfId(accountReq.getSdfId());
responsePart.setErrorCode(AccountError.ClearingCategoryNotFound.getId()); // see accountService.fillAccountFromRelation
responsePart.setErrorText(requestInfoUpdate.getMessage());
accountToStatement.add(responsePart);
continue accountsLoop;
}
}
if (accountImdg.getFirstObjectBySQL("account = '%s'".formatted(accountReq.getAccount())) != null) {
log.debug("Account {} already exists", accountReq.getAccount());
{
AccountSdfToStatementRequestPart responsePart = new AccountSdfToStatementRequestPart();
responsePart.setSdfId(accountReq.getSdfId());
responsePart.setErrorCode(null);
responsePart.setErrorText(null);
accountToStatement.add(responsePart);
continue accountsLoop;
}
}
Long clearingAccountId = -1L;
Long accountId = -1L;
ClearingAccount clearingAccount = null;
accountId = accountImdg.insert(account);
clearingAccount = new ClearingAccount();
clearingAccount.setCompanyId(accountReq.getCompanyId());
clearingAccount.setAccountId(accountId);
clearingAccount.setClearingAccountType(accountReq.getAccountType());
clearingAccountId = clearingAccountImdg.insert(clearingAccount);
log.debug("New account {}, clearingAccount {} was created.", accountId, clearingAccountId);
{
AccountSdfToStatementRequestPart responsePart = new AccountSdfToStatementRequestPart();
responsePart.setSdfId(accountReq.getSdfId());
responsePart.setErrorCode(null);
responsePart.setErrorText(null);
accountToStatement.add(responsePart);
}
}
txOk = true;
} finally {
if (txOk) {
imdgTransaction.commitTransaction();
} else {
log.debug("failed insert, new clearing accounts. Request id={}", userRequest.getId());
imdgTransaction.rollbackTransaction();
}
}
sendStatementRequestBack(req.getGroupingSdf01Id(), req.getGroupingSdf02Id(), accountToStatement);
log.debug("successfully processed, grouping id={}, processed number={}", req.getGroupingSdf01Id(), accountToStatement.size());
return null;
}
public RequestInfoUpdate accountUpdateSdf52(BaseRequest<StatementRequest> systemRequest) {
log.debug("accountUpdateSdf52 StatementRequest received, id={}", systemRequest.getId());
StatementRequest req = systemRequest.getRequestPayload();
Long groupId = req.getGroupId();
if (SdfTable.SDF_52 != req.getTable()) {
log.warn("Unsupported table {} received on accountUpdateSdf52. Expected only {}.",
req.getTable(), SdfTable.SDF_52);
}
Collection<SDf52> sdfs = sdfProcessService.sdfsByGroupId(groupId);
if (sdfs.isEmpty()) {
log.info("Do not processing SDF52: S_DF52 not found by groupId={}", groupId);
return null;
}
log.info("start processing {} SDF52: groupId={}", sdfs.size(), groupId);
List<Pair<SDf52, Account>> toUpdate = new ArrayList<>();
List<Triple<SDf52, Account, String>> toProcessSDF53 = new ArrayList<>();
{ // 1. Выборка данных
for (SDf52 sDf52 : sdfs) {
if (sdfProcessService.parseSdf52Status(sDf52.getStatus()) == null) {
String msg = messageResolver.resolve(new EnumMessage(AccountError.WrongFieldValue, "status"));
log.warn("By generationId={} s_df52[{}] error: {}", groupId, sDf52.getId(), msg);
toProcessSDF53.add(new MutableTriple<>(sDf52, null,
makeSdfErrorText(AccountError.WrongFieldValue, SDFProcessService.SDF_STATUS_ERROR)));
continue;
}
Company company = sDf52.getDeal() == null ? null : companyImdg.getSingleObjectByFieldValues(Map.of("tradingCode", sDf52.getDeal()));
if (company == null) {
String msg = messageResolver.resolve(new EnumMessage(AccountError.CompanyNotFound, sDf52.getDeal()));
log.warn("By generationId={} s_df52[{}] error: {}", groupId, sDf52.getId(), msg);
toProcessSDF53.add(new MutableTriple<>(sDf52, null,
makeSdfErrorText(AccountError.CompanyNotFound, SDFProcessService.SDF_STATUS_ERROR_COMPANY_NOT_FOUND)));
continue;
}
Map<String, Comparable<?>> accountQuery = Map.of(
"accountType", AccountType.Clrn.getKey(),
"account", sDf52.getAccount(),
"companyId", company.getId()
);
Account account = sDf52.getAccount() == null ? null : accountImdg.getFirstObjectByFieldValues(accountQuery);
if (account == null) {
if (SDFProcessService.SDF52_STATUS_3Open.equals(sDf52.getStatus())) {
log.debug("By generationId={} s_df52[{}].status={}, but account not found (query: {}). COntinuse with result OK for status 3",
groupId, sDf52.getId(), sDf52.getStatus(), accountQuery);
} else {
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));
toUpdate.add(new Pair<>(sDf52, account));
}
}
log.debug("Selected to update {} account's", toUpdate.size());
// 4. to notification
List<Long> notificationAccountIds = new ArrayList<>();
for (Pair<SDf52, Account> item : toUpdate) {
SDf52 sdf = item.getFirst();
Account account = item.getSecond();
AccountStatus newStatus = sdfProcessService.parseSdf52Status(sdf.getStatus());
if (newStatus == null) { // never
throw new IllegalArgumentException("Can not parse sdf status " + sdf.getStatus());
}
if (newStatus.equalsByKey(account.getStatus())) {
// одинаковых обычно не бывает.
continue;
}
if (AccountStatus.BLOCKED == newStatus || AccountStatus.CLOSE == newStatus) { // статус 0/2
sendNotificationRequest(ObjectType.account_block, account, newStatus);
notificationAccountIds.add(account.getId());
putNotificationWaiting(systemRequest, item.getFirst(), item.getSecond());
}
if (AccountStatus.ACTIVE == newStatus) { // статус 1/3
sendNotificationRequest(ObjectType.account_active, account, newStatus);
notificationAccountIds.add(account.getId());
putNotificationWaiting(systemRequest, item.getFirst(), item.getSecond());
}
}
sdfProcessService.process(req, toProcessSDF53);
log.info("{} account's need wait accept over notification. GroupId={}", notificationAccountIds.size(), groupId);
log.debug("successfully processed, grouping id={} with {} accounts.",
groupId, toUpdate.size());
return null;
}
protected RequestInfoUpdate accountUpdateSdf52_part2Notification(BaseRequest<NotificationFeedbackRequest> secondSystemRequest2) {
log.debug("accountUpdateSdf52 NotificationFeedbackRequest received, id={}", secondSystemRequest2.getId());
SDF52WaitingData trigger = onNotificationResponse(secondSystemRequest2.getRequestPayload());
if (trigger == null) {
log.trace("Not triggered, continue waiting");
return null;
} else {
log.debug("Triggered, groupId={}, notification's status: {}, last notification user id={}",
trigger.getGroupId(), trigger.globalStatus, secondSystemRequest2.getUserId());
if (NotificationStatus.ACPT.equalsByKey(trigger.globalStatus)) {
return accountUpdateSdf52_part2(trigger.systemRequest, trigger.sdf, trigger.account, secondSystemRequest2);
} else if (NotificationStatus.CNCL.equalsByKey(trigger.globalStatus)) {
log.debug("groupId={} rejected by user {}.", trigger.getGroupId(), secondSystemRequest2.getUserId());
return null;
} else {
log.warn("Unknown waiting group status \"{}\"", trigger.globalStatus);
return null;
}
}
}
protected RequestInfoUpdate accountUpdateSdf52_part2(BaseRequest<StatementRequest> systemRequest1,
SDf52 sdf, Account account,
BaseRequest<NotificationFeedbackRequest> secondSystemRequest2) {
// 5. from notification:
StatementRequest req = systemRequest1.getRequestPayload();
Long groupId = req.getGroupId();
log.info("Continue Sdf52 groupId={}, first request id={}, second request id={}",
groupId, systemRequest1 == null ? null : systemRequest1.getId(), secondSystemRequest2 == null ? null : secondSystemRequest2.getId());
int countOfUpdated = 0;
// 2. обновление данных
Instant now = Instant.now();
AccountStatus newStatus = sdfProcessService.parseSdf52Status(sdf.getStatus());
if (newStatus == null) {
throw new IllegalArgumentException("Can not parse sdf status " + sdf.getStatus());
}
// За долгое время ожидания пользователя счёт мог быть обновлён, прочитать его ещё раз
account = accountImdg.getSingleObjectByID(account.getId());
if (!newStatus.equalsByKey(account.getStatus())) {
// Обновление счёта
String oldStatus = account.getStatus();
account.setStatus(newStatus.getKey());
account.setUpdated(now);
accountImdg.update(account);
log.trace("S_DF52[{}] do update status to {} for account[{}]",
sdf.getId(), newStatus.getKey(), account.getId());
if (AccountStatus.ACTIVE.equalsByKey(oldStatus) && AccountStatus.ACTIVE != newStatus) { // счёт заблокировали - значит блокируем ТКР, наоборот не надо.
// Отправка в ТКР
TradingClearingRegistryUpdateRequest tcrReq = new TradingClearingRegistryUpdateRequest();
tcrReq.setMoneyAccountId(account.getId());
tcrReq.setCompanyId(account.getCompanyId());
tcrReq.setStatus(account.getStatus());
Map<String, Long> queryTCR = new HashMap<>();
queryTCR.put("moneyAccountId", tcrReq.getMoneyAccountId());
if (tcrReq.getCompanyId() != null)
queryTCR.put("companyId", tcrReq.getCompanyId());
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getFirstObjectByFieldValues(queryTCR);
if (tcr == null) {
log.warn("TradingClearingRegistry by {} not found, do not send update TCR.", queryTCR);
} else {
tcrReq.setId(tcr.getId());
String destination = Consts.DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE;
log.debug("Send message to kafka \"{}\": {}", destination, LogFormatter.toStringWrapper(tcrReq));
kafkaSender.sendRequestToQueue(destination, tcrReq);
}
}
countOfUpdated++;
} else {
log.info("Account[{}] \"{}\" do not updated - same status \"{}\"", account.getId(), account.getAccount(), newStatus);
}
log.debug("successfully processed, grouping id={}. Updated {} accounts.",
groupId, countOfUpdated);
return null;
}
protected String makeSdfErrorText(IErrorEnumId clrError, String sdfCode) {
if (clrError == null) return sdfCode;
sdfCode = clrError.getId().toString();
if (sdfCode.length() > 3)
sdfCode = sdfCode.substring(sdfCode.length() - 3);
return sdfCode;
}
public void sendStatementRequestBack(Long groupingSdf01Id, Long groupSdf02Id, List<AccountSdfToStatementRequestPart> results) {
final String destination = Consts.STATEMENT_PROCESS;
StatementRequest request = new StatementRequest();
request.setGroupId(groupingSdf01Id);
request.setChildGenerationId(groupSdf02Id);
request.setAccountCreationResults(results);
request.setContinueSdf(true);
request.setTable(SdfTable.SDF_01); // по нему запрос получили
log.debug("Send message to kafka \"{}\": {}", destination, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(destination, request);
}
public Long sendNotificationRequest(ObjectType objectType, Account account, AccountStatus requestToStatus) {
String statusText = AccountStatus.BLOCKED == requestToStatus ? "Заблокирован"
: AccountStatus.CLOSE == requestToStatus ? "Закрыт"
: AccountStatus.ACTIVE == requestToStatus ? "Разблокирован" :
requestToStatus.getKey();
String message = String.format("Для счета %s будет изменен статус на «%s»", account.getAccount(), statusText);
final String destination = Consts.NOTIFICATION_NEW;
NotificationNewRequest request = new NotificationNewRequest();
request.setObjectType(objectType.getKey());
request.setObjectId(account.getId());
request.setPriority(Priority.HIGH.getKey());
request.setComment(message);
log.debug("Send message to kafka \"{}\": {}", destination, LogFormatter.toStringWrapper(request));
Long rKey = kafkaSender.sendRequestToQueue(destination, request);
log.trace("About account.id={} send notification request id={}", account.getId(), rKey);
return rKey;
}
// --------- notification apply system -----------
public static class SDF52WaitingData {
public BaseRequest<StatementRequest> systemRequest;
public SDf52 sdf;
public Account account;
public Long notAnsweredAccountId;
public String globalStatus;
public SDF52WaitingData(BaseRequest<StatementRequest> systemRequest, SDf52 sdf, Account account) {
this.systemRequest = systemRequest;
this.sdf = sdf;
this.account = account;
this.notAnsweredAccountId = account.getId();
}
public Long getGroupId() {
if (systemRequest != null && systemRequest.getRequestPayload() != null)
return systemRequest.getRequestPayload().getGroupId();
return null;
}
}
protected ConcurrentHashMap<Long, SDF52WaitingData> waitingList = new ConcurrentHashMap<>();
public boolean putNotificationWaiting(BaseRequest<StatementRequest> systemRequest, SDf52 sdf, Account account) {
SDF52WaitingData data = new SDF52WaitingData(systemRequest, sdf, account);
if (waitingList.contains(data.notAnsweredAccountId)) {
log.warn("groupId={} accountId={} already waiting", data.getGroupId(), data.notAnsweredAccountId);
}
data.globalStatus = null;
waitingList.put(data.notAnsweredAccountId, data);
return true;
}
/**
* @return triggered SDF52WaitingData or null
*/
public SDF52WaitingData onNotificationResponse(NotificationFeedbackRequest onNotification) {
if (onNotification.getNotificationId() == null) {
log.trace("notificationId was empty");
return null;
}
Notification notification = notificationImdg.getSingleObjectByID(onNotification.getNotificationId());
if (notification == null) {
log.warn("Notification with id={} not exist", onNotification.getNotificationId());
return null;
}
if (!ObjectType.account_active.equalsByKey(notification.getObjectType()) && !ObjectType.account_block.equalsByKey(notification.getObjectType())) {
log.warn("Notification[{}].objectType={} not supported", notification.getId(), notification.getObjectType());
return null;
}
if (notification.getObjectId() == null) {
log.warn("Notification[{}] with empty objectId", notification.getId());
return null;
}
final Long accountId = notification.getObjectId();
log.trace("Match accountId={} by notificationId={}", accountId, notification.getId());
SDF52WaitingData inWaitingLst = waitingList.get(accountId);
if (inWaitingLst == null) {
log.debug("SDF52 waiting list (count {}) not found for accountId={}", waitingList.size(), accountId);
return null;
}
boolean returnTrigger = false;
if (NotificationStatus.ACPT.equalsByKey(onNotification.getNotificationStatus())) {
log.trace("Triggered ACPT, by accountId={}", accountId);
inWaitingLst.globalStatus = onNotification.getNotificationStatus();
returnTrigger = true;
} else if (NotificationStatus.CNCL.equalsByKey(onNotification.getNotificationStatus())) {
log.trace("Triggered CNCL, by accountId={}", accountId);
inWaitingLst.globalStatus = onNotification.getNotificationStatus();
returnTrigger = true;
} else {
log.warn("Unknown notification[{}] status={}", onNotification.getNotificationId(), onNotification.getNotificationStatus());
}
if (returnTrigger) {
log.debug("Remove from waiting list accountId={} (list groupId={})", accountId, inWaitingLst.getGroupId());
waitingList.remove(inWaitingLst);
}
if (returnTrigger)
return inWaitingLst;
else
return null;
}
}

View file

@ -0,0 +1,440 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.account.errors.AccountError;
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.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryUpdateRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.Status;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.log.ExceptionUtils;
import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.function.Function;
@Service
public class ClientCodeService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final Producer<String, Object> kafkaProducer;
private final ImdgId idGenerator;
private final ImdgProvider imdgProvider;
private final Imdg<ClientCode> clientCodeMap;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryMap;
private final Function<ClientCodeNewRequest, IValidator> clientCodeNewRequestValidator;
private final Function<ClientCodeUpdateRequest, IValidator> clientCodeUpdateRequestValidator;
private final Function<CommonDeleteRequest, IValidator> clientCodeDeleteRequestValidator;
private final ValidationHelper validationHelper;
private final UserRoleVerification userRoleVerification;
private final IMessageResolver messageResolver;
private final RequestHelper requestHelper;
protected TradingClearingRegistryService tradingClearingRegistryService;
@Autowired
public ClientCodeService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
ImdgProvider imdgProvider,
ValidationHelper validationHelper,
IMessageResolver messageResolver,
RequestHelper requestHelper,
TradingClearingRegistryService tradingClearingRegistryService,
UserRoleVerification userRoleVerification,
@Qualifier("clientCodeNewRequestValidator") Function<ClientCodeNewRequest, IValidator> clientCodeNewRequestValidator,
@Qualifier("clientCodeUpdateRequestValidator") Function<ClientCodeUpdateRequest, IValidator> clientCodeUpdateRequestValidator,
@Qualifier("clientCodeDeleteRequestValidator") Function<CommonDeleteRequest, IValidator> clientCodeDeleteRequestValidator) {
super(kafkaQueue, kafkaProducer);
this.kafkaProducer = kafkaProducer;
this.imdgProvider = imdgProvider;
this.idGenerator = imdgProvider.getImdgIdGenerator();
this.clientCodeMap = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
this.tradingClearingRegistryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.clientCodeNewRequestValidator = clientCodeNewRequestValidator;
this.clientCodeUpdateRequestValidator = clientCodeUpdateRequestValidator;
this.clientCodeDeleteRequestValidator = clientCodeDeleteRequestValidator;
this.validationHelper = validationHelper;
this.requestHelper = requestHelper;
this.messageResolver = messageResolver;
this.userRoleVerification = userRoleVerification;
this.tradingClearingRegistryService = tradingClearingRegistryService;
}
@Override
public void afterPropertiesSet() {
imdgProvider.waitAvailable();
callback(ClientCodeNewRequest.class)
.setFunction(this::clientCodeNew)
.forDestination(Consts.DESTINATION_CLIENT_CODE_NEW, callbacks::put);
callback(ClientCodeNewRequest.class)
.setFunction(this::clientCodeNewFromApiUmCompany)
.forDestination(Consts.DESTINATION_CLIENT_CODE_NEW_UM_COMPANY, callbacks::put);
callback(ClientCodeUpdateRequest.class)
.setFunction(this::clientCodeUpdate)
.forDestination(Consts.DESTINATION_CLIENT_CODE_UPDATE, callbacks::put);
callback(CommonDeleteRequest.class)
.setFunction(this::clientCodeDelete)
.forDestination(Consts.DESTINATION_CLIENT_CODE_DELETE, callbacks::put);
init();
}
/**
* Проверки
* 3.5.1 если не была найдена запись в tradingClearingRegistry по companyId, moneyAccountId, depoAccountId и tradingClearingRegistryType=B (п 3.5.1)
* 3.5.2 если не заполнены поля moneyAccountId ИЛИ moneyAccountId и depoAccountId
* @param userRequest
* @param moneyAccountId req.getMoneyAccountId()
* @param depoAccountId req.getDepoAccountId()
* @param companyId req.getCompanyId()
* @return
*/
RequestInfoUpdate crossValidate(BaseRequest<?> userRequest, Long moneyAccountId, Long depoAccountId, Long companyId) {
if (moneyAccountId == null) { // Если не заполнены moneyAccountId ИЛИ moneyAccountId и depoAccountId
EnumMessage error = null;
if (companyId == null) {
error = new EnumMessage(AccountError.RequiredFieldEmpty, "companyId");
} else {
TradingClearingRegistry tcr = tradingClearingRegistryMap.getFirstObjectByFieldValues(Map.of("companyId", companyId));
if (tcr==null) {
error=new EnumMessage(AccountError.TradingClearingRegistryNotFound, companyId);
}
}
if (error != null) {
return requestHelper.makeErrorResponse(userRequest, error);
}
}
return null;
}
protected RequestInfoUpdate clientCodeNew(BaseRequest<ClientCodeNewRequest> userRequest) {
log.debug("ClientCodeNewRequest received {}", userRequest.getId());
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, clientCodeNewRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
ClientCodeNewRequest req = userRequest.getRequestPayload();
// дополнительная проверка
requestInfoUpdate = crossValidate(userRequest, req.getMoneyAccountId(), req.getDepoAccountId(), req.getCompanyId());
if (requestInfoUpdate != null) return requestInfoUpdate;
boolean doCreateTCR = checkNeedCreateTCR(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (doCreateTCR) {
try {
requestInfoUpdate = createAndWaitTCR(userRequest.getId(), null,
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (requestInfoUpdate != null) return requestInfoUpdate;
} catch (Exception e) {
log.error("Can not wait creation of TCR. request id={};CompanyId={}, MoneyAccountId={}, DepoAccountId={}; {}",
userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(),
e.toString());
return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage());
}
}
ClientCode newClientCode = buildClientCode(req);
clientCodeMap.insert(newClientCode);
log.debug("successfully processed, new clientCode id {}", newClientCode.getId());
return null;
}
protected RequestInfoUpdate clientCodeNewFromApiUmCompany(BaseRequest<ClientCodeNewRequest> userRequest) {
log.debug("ClientCodeNewRequest (UM_COMPANY) received {}", userRequest.getId());
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, clientCodeNewRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
ClientCodeNewRequest req = userRequest.getRequestPayload();
// дополнительная проверка
requestInfoUpdate = crossValidate(userRequest, req.getMoneyAccountId(), req.getDepoAccountId(), req.getCompanyId());
if (requestInfoUpdate != null) return requestInfoUpdate;
boolean doCreateTCR = checkNeedCreateTCR(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (doCreateTCR) {
try {
requestInfoUpdate = createAndWaitTCR(userRequest.getId(), null,
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (requestInfoUpdate != null) return requestInfoUpdate;
} catch (Exception e) {
log.error("Can not wait creation of TCR. request id={};CompanyId={}, MoneyAccountId={}, DepoAccountId={}; {}",
userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(),
e.toString());
return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR at this moment" + e.getMessage());
}
}
ClientCode newClientCode = buildClientCode(req);
clientCodeMap.insert(newClientCode);
log.debug("successfully processed, new clientCode id {}", newClientCode.getId());
return null;
}
protected RequestInfoUpdate clientCodeUpdate(BaseRequest<ClientCodeUpdateRequest> userRequest) {
ClientCodeUpdateRequest req = userRequest.getRequestPayload();
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, clientCodeUpdateRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
// дополнительная проверка
requestInfoUpdate = crossValidate(userRequest, req.getMoneyAccountId(), req.getDepoAccountId(), req.getCompanyId());
if (requestInfoUpdate != null) return requestInfoUpdate;
log.debug("ClientCodeUpdateRequest received, id={}", req.getId());
ClientCode clientCode = clientCodeMap.getSingleObjectByID(req.getId());
if (clientCode == null) {
return makeErrorResponse(userRequest, AccountError.RecordNotFound, req.getId());
}
boolean doCreateTCR = checkNeedCreateTCR(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (doCreateTCR) {
try {
requestInfoUpdate = createAndWaitTCR(userRequest.getId(), clientCode.getId(),
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (requestInfoUpdate != null) return requestInfoUpdate;
} catch (Exception e) {
log.error("Can not wait creation of TCR. request id={};CompanyId={}, MoneyAccountId={}, DepoAccountId={}; {}",
userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(),
e.toString());
return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage());
}
}
updateClientCode(clientCode, req);
clientCodeMap.update(clientCode);
log.debug("successfully processed update, id {}", clientCode.getId());
return null;
}
private RequestInfoUpdate makeErrorResponse(BaseRequest<?> req, AccountError err, Object... arg) {
return requestHelper.makeErrorResponse(req, err, arg);
}
protected RequestInfoUpdate clientCodeDelete(BaseRequest<CommonDeleteRequest> userRequest) {
log.debug("CommonDeleteRequest received id = {}", userRequest.getId());
CommonDeleteRequest req = userRequest.getRequestPayload();
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, clientCodeDeleteRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
ClientCode clientCode = clientCodeMap.getSingleObjectByID(req.getId());
if (clientCode.getMoneyAccountId() != null) {
log.debug("Blocking clientCode.id = {}: send message to account-service", clientCode.getId());
sendBlockTCR(clientCode.getTradingClearingRegistryId(), clientCode.getMoneyAccountId());
}
log.debug("Blocking clientCode.id={}", clientCode.getId());
clientCode.setUpdated(Instant.now());
clientCode.setStatus(WorkflowStatus.Blocked.getKey());
clientCodeMap.update(clientCode);
return null;
}
TradingClearingRegistry selectTradingClearingRegistry(Long companyId, Long moneyAccountId, Long depoAccountId) {
Map<String, Comparable<?>> query = new HashMap<>();
query.put("companyId", companyId);
query.put("moneyAccountId", moneyAccountId);
query.put("tradingClearingRegistryType", TradingClearingRegistryType.Client_B.getKey());
if (depoAccountId != null) {
query.put("depoAccountId", depoAccountId);
}
TradingClearingRegistry result = tradingClearingRegistryMap.getFirstObjectByFieldValues(query);
log.trace("TradingClearingRegistry by: {}; {}found", query, result == null ? "not " : "");
return result;
}
private boolean checkNeedCreateTCR(Long companyId, Long moneyAccountId, Long depoAccountId) {
// moneyAccountId обязателен, depoAccountId опционален
if (moneyAccountId == null) {
return false;
}
TradingClearingRegistry result = selectTradingClearingRegistry(companyId, moneyAccountId, depoAccountId);
if (result == null) {
return true;
} else {
return false;
}
}
protected RequestInfoUpdate createAndWaitTCR(Long reqId, Long clientCode,
Long companyId, Long moneyAccountId, Long depoAccountId) {
log.debug("For request {}, clientCode={} need create TCR: companyId={}, moneyAccountId={}, depoAccountId={}",
reqId, clientCode == null ? "new" : clientCode,
companyId, moneyAccountId, depoAccountId);
BaseRequest<TradingClearingRegistryNewRequest> request = new BaseRequest<>();
request.setId(idGenerator.nextId());
request.setActionType(ActionType.NEW);
TradingClearingRegistryNewRequest requestPayload = new TradingClearingRegistryNewRequest();
requestPayload.setCompanyId(companyId);
requestPayload.setMoneyAccountId(moneyAccountId);
requestPayload.setDepoAccountId(depoAccountId);
// requestPayload.setStatus(WorkflowStatus.Active.getKey());
requestPayload.setTradingClearingRegistryType(TradingClearingRegistryType.Client_B.getKey());
request.setRequestPayload(requestPayload);
// Следующий вызываемый метод обязательно должен быть synchronized.
RequestInfoUpdate reply = tradingClearingRegistryService.tradingClearingRegistryNew(request);
if (reply != null && Status.Error.equals(reply.getStatus())) {
log.warn("tradingClearingRegistryService return error: " + reply.getMessage());
}
return reply;
}
protected void sendBlockTCR(Long tradingClearingRegistryId, Long moneyAccountId) {
if (tradingClearingRegistryId == null) {
throw new IllegalArgumentException("tradingClearingRegistryId was null");
}
BaseRequest<TradingClearingRegistryUpdateRequest> request = new BaseRequest<>();
request.setId(idGenerator.nextId());
request.setActionType(ActionType.UPDATE);
TradingClearingRegistryUpdateRequest requestPayload = new TradingClearingRegistryUpdateRequest();
requestPayload.setId(tradingClearingRegistryId);
requestPayload.setStatus(WorkflowStatus.Blocked.getKey());
request.setRequestPayload(requestPayload);
log.debug("Send message to kafka \"{}\": {}", Consts.DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE, LogFormatter.toStringWrapper(request));
try {
sendMessage(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE, request);
} catch (Exception e) {
log.error("Can not send block TCR message, {}", e.toString());
throw e;
}
}
/**
* @param queue Consts.*
* @param message BaseRequest
* @return
*/
private Long sendMessage(String queue, BaseRequest<?> message) {
Long sentRequestId = message.getId();
if (sentRequestId == null) {
throw new IllegalArgumentException("Message " + message.getClass().getSimpleName() + " required id.");
}
log.debug("Send to \"{}\" message {} id={}", queue, message.getActionType(), sentRequestId);
try {
Future<RecordMetadata> send = kafkaProducer.send(new ProducerRecord<>(queue, message));
send.get();
return sentRequestId;
} catch (InterruptedException e) {
log.error("Interrupt when send message, {}", ExceptionUtils.getStackTrace(e));
Thread.currentThread().interrupt();
throw new RuntimeException("Thread interrupted when send message to " + queue, e);
} catch (ExecutionException e) {
log.error("Error at send message, {} cause: {}", e.toString(), ExceptionUtils.getStackTrace(e.getCause()));
throw new RuntimeException("Send message error", e.getCause());
} catch (Exception e) {
log.error("Unexpected exception when send message: {}", ExceptionUtils.getStackTrace(e));
}
return null;
}
/**
* @param req требуется заполнить tradingClearingRegistryId по tradingClearingRegistry.code
* @return
*/
private ClientCode buildClientCode(ClientCodeNewRequest req) {
ClientCode clientCode = new ClientCode();
// clientCode.setId(idSequence.newId()); add in insert
clientCode.setCreated(Instant.now());
clientCode.setUpdated(clientCode.getCreated());
clientCode.setCompanyId(req.getCompanyId());
clientCode.setCode(req.getCode());
if (req.getMoneyAccountId() != null) {
TradingClearingRegistry tradingClearingRegistry = selectTradingClearingRegistry(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (tradingClearingRegistry == null) {
log.warn("TCR not found: CompanyId {}, MoneyAccountId {}, DepoAccountId {}",
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
} else {
clientCode.setTradingClearingRegistryId(tradingClearingRegistry.getId());
}
}
clientCode.setMoneyAccountId(req.getMoneyAccountId());
clientCode.setDepoAccountId(req.getDepoAccountId());
clientCode.setStatus(req.getStatus());
return clientCode;
}
private void updateClientCode(ClientCode clientCode, ClientCodeUpdateRequest req) {
assert clientCode.getId() != null && clientCode.getId().equals(req.getId());
clientCode.setCompanyId(req.getCompanyId());
clientCode.setCode(req.getCode());
if (req.getMoneyAccountId() != null) {
TradingClearingRegistry tradingClearingRegistry = selectTradingClearingRegistry(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (tradingClearingRegistry == null) {
log.warn("TCR not found: CompanyId {}, MoneyAccountId {}, DepoAccountId {}",
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
} else {
clientCode.setTradingClearingRegistryId(tradingClearingRegistry.getId());
}
}
clientCode.setTradingClearingRegistryId(req.getTradingClearingRegistryId());
clientCode.setMoneyAccountId(req.getMoneyAccountId());
clientCode.setDepoAccountId(req.getDepoAccountId());
clientCode.setStatus(req.getStatus());
clientCode.setUpdated(Instant.now());
}
}

View file

@ -0,0 +1,237 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.DepoAccountNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf01Request;
import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.AccountSdfToStatementRequestPart;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.ImdgTransaction;
import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
@Service
public class DepoAccountService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final KafkaSender kafkaSender;
private final ValidationHelper validationHelper;
private final ImdgProvider imdgProvider;
private final AccountHelper accountService;
private final Function<DepoAccountNewRequest, IValidator> depoAccountNewRequestValidator;
public DepoAccountService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
KafkaSender kafkaSender,
ValidationHelper validationHelper,
ImdgProvider imdgProvider,
AccountHelper accountService,
@Qualifier("depoAccountNewRequestValidator")
Function<DepoAccountNewRequest, IValidator> depoAccountNewRequestValidator) {
super(kafkaQueue, kafkaProducer);
this.kafkaSender = kafkaSender;
this.validationHelper = validationHelper;
this.imdgProvider = imdgProvider;
this.accountService = accountService;
this.depoAccountNewRequestValidator = depoAccountNewRequestValidator;
}
@Override
public void afterPropertiesSet() throws Exception {
callback(DepoAccountNewRequest.class)
.setFunction(this::depoAccountNew)
.forDestination(Consts.DESTINATION_DEPO_ACCOUNT_NEW, callbacks::put);
callback(AccountSdf01Request.class)
.setFunction(this::accountNewSdf08)
.forDestination(Consts.ACCOUNT_NEW_SDF08, callbacks::put);
init();
}
public RequestInfoUpdate depoAccountNew(BaseRequest<DepoAccountNewRequest> userRequest) {
log.debug("DepoAccountNewRequest received");
RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(
userRequest, depoAccountNewRequestValidator
);
if (requestInfoUpdate != null) return requestInfoUpdate;
DepoAccountNewRequest req = userRequest.getRequestPayload();
Instant now = Instant.now();
Account account = new Account();
account.setAccount(req.getAccount());
account.setAccountType(AccountType.Depo.getKey());
if (req.getStatus() == null) {
account.setStatus(WorkflowStatus.Active.getKey());
log.trace("Status not set in request. Use default: {}", account.getStatus());
} else {
account.setStatus(req.getStatus());
}
account.setCompanyId(req.getCompanyId());
account.setCreated(now);
account.setUpdated(now);
requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId(), true);
if (requestInfoUpdate != null) return requestInfoUpdate;
Long depoAccountId = -1L;
Long accountId = -1L;
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
boolean txOk = false;
imdgTransaction.beginTransaction();
DepoAccount depoAccount = null;
try {
Imdg<Account> accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
Imdg<DepoAccount> depoAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
accountId = accountImdg.insert(account);
depoAccount = new DepoAccount();
depoAccount.setCompanyId(req.getCompanyId());
depoAccount.setAccountId(accountId);
if (account.getAccount() != null && account.getAccount().contains("BC")) {
depoAccount.setDepoAccountType(DepoAccountType.C.getKey());
} else {
depoAccount.setDepoAccountType(req.getDepoAccountType());
}
depoAccountId = depoAccountImdg.insert(depoAccount);
txOk = true;
} finally {
if (txOk) {
imdgTransaction.commitTransaction();
log.debug("successfully processed, new depo account id {}, account id {}", depoAccountId, accountId);
} else {
log.debug("failed insert, new depo account id {}, new account id {} (if id = -1 then insert is failed)",
depoAccountId,
accountId);
imdgTransaction.rollbackTransaction();
}
}
return null;
}
public RequestInfoUpdate accountNewSdf08(BaseRequest<AccountSdf01Request> userRequest) {
log.debug("AccountSdf08Request received, id={}", userRequest.getId());
AccountSdf01Request req = userRequest.getRequestPayload();
List<AccountSdfToStatementRequestPart> accountToStatement = new ArrayList<>();
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
boolean txOk = false;
imdgTransaction.beginTransaction();
try {
Imdg<Account> accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
Imdg<DepoAccount> depoAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
accountsLoop:
for (AccountSdfRequestPart accountReq : req.getAccounts()) {
// DepoAccountNewRequest req = userRequest.getRequestPayload();
Instant now = Instant.now();
Account account = new Account();
account.setAccount(accountReq.getAccount());
account.setAccountType(AccountType.Depo.getKey());
account.setStatus(ServiceStatus.Active.getKey());
account.setCompanyId(accountReq.getCompanyId());
account.setCreated(now);
account.setUpdated(now);
RequestInfoUpdate requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId(), true);
if (requestInfoUpdate != null) {
log.warn("Error fill new account from relation. {}", /*account.getId(),*/ requestInfoUpdate.getMessage());
{
AccountSdfToStatementRequestPart responsePart = new AccountSdfToStatementRequestPart();
responsePart.setSdfId(accountReq.getSdfId());
responsePart.setErrorCode(AccountError.ClearingCategoryNotFound.getId()); // see accountService.fillAccountFromRelation
responsePart.setErrorText(requestInfoUpdate.getMessage());
accountToStatement.add(responsePart);
continue accountsLoop;
}
}
if (accountImdg.getFirstObjectBySQL("account = '%s'".formatted(accountReq.getAccount())) != null) {
log.debug("Account {} already exists", accountReq.getAccount());
{
AccountSdfToStatementRequestPart responsePart = new AccountSdfToStatementRequestPart();
responsePart.setSdfId(accountReq.getSdfId());
responsePart.setErrorCode(null);
responsePart.setErrorText(null);
accountToStatement.add(responsePart);
continue accountsLoop;
}
}
Long depoAccountId = -1L;
Long accountId = -1L;
accountId = accountImdg.insert(account);
DepoAccount depoAccount = new DepoAccount();
depoAccount.setCompanyId(accountReq.getCompanyId());
depoAccount.setAccountId(accountId);
if (account.getAccount() != null && account.getAccount().contains("BC")) {
depoAccount.setDepoAccountType(DepoAccountType.C.getKey());
} else {
depoAccount.setDepoAccountType(accountReq.getAccountType());
}
depoAccountId = depoAccountImdg.insert(depoAccount);
log.debug("New account {}, depoAccount {} was created.", accountId, depoAccountId);
{
AccountSdfToStatementRequestPart responsePart = new AccountSdfToStatementRequestPart();
responsePart.setSdfId(accountReq.getSdfId());
responsePart.setErrorCode(null);
responsePart.setErrorText(null);
accountToStatement.add(responsePart);
}
}
txOk = true;
} finally {
if (txOk) {
imdgTransaction.commitTransaction();
} else {
log.debug("failed insert, new clearing accounts. Request id={}", userRequest.getId());
imdgTransaction.rollbackTransaction();
}
}
sendStatementRequestBack(req.getGroupingSdf01Id(), req.getGroupingSdf02Id(), accountToStatement);
log.debug("successfully processed, grouping id={}, processed number={}", req.getGroupingSdf01Id(), accountToStatement.size());
return null;
}
public void sendStatementRequestBack(Long groupingSdf01Id, Long groupingSdf02Id, List<AccountSdfToStatementRequestPart> results) {
StatementRequest request = new StatementRequest();
request.setGroupId(groupingSdf01Id);
request.setChildGenerationId(groupingSdf02Id);
request.setContinueSdf(true); //fixme????
request.setAccountCreationResults(results);
request.setTable(SdfTable.SDF_08); // по нему запрос получили
log.debug("Send message to kafka \"{}\": {}", Consts.STATEMENT_PROCESS, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.STATEMENT_PROCESS, request);
}
}

View file

@ -0,0 +1,349 @@
package ru.spcex.clearing.account.service;
import org.apache.commons.lang3.StringUtils;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.InformationAccountNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.NotificationRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.ImdgTransaction;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.log.ExceptionUtils;
import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Service
public class InformationAccountService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final KafkaSender kafkaSender;
private final IMessageResolver messageResolver;
private final UserRoleVerification userRoleVerification;
private final ImdgProvider imdgProvider;
private final ValidationHelper validationHelper;
private final AccountHelper accountHelper;
private final RequestHelper requestHelper;
private final Function<InformationAccountNewRequest, IValidator> infoAccountNewRequestValidator;
private final Imdg<InformationAccount> informationAccountImdg;
private final Imdg<Account> accountImdg;
/**
* Кэш-счётчик сквозных номеров счетов.
* См. accountNextId()
*/
protected AtomicLong infoCounter;
@Autowired
public InformationAccountService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaResponseQueue,
KafkaSender kafkaSender,
IMessageResolver messageResolver,
UserRoleVerification userRoleVerification,
ImdgProvider imdgProvider,
ValidationHelper validationHelper,
AccountHelper accountHelper,
RequestHelper requestHelper,
@Qualifier("informationAccountNewRequestValidator")
Function<InformationAccountNewRequest, IValidator> infoAccountNewRequestValidator) {
super(kafkaQueue, kafkaResponseQueue);
this.kafkaSender = kafkaSender;
this.messageResolver = messageResolver;
this.userRoleVerification = userRoleVerification;
this.imdgProvider = imdgProvider;
this.validationHelper = validationHelper;
this.accountHelper = accountHelper;
this.requestHelper = requestHelper;
this.infoAccountNewRequestValidator = infoAccountNewRequestValidator;
this.informationAccountImdg = imdgProvider.getImdg(
IMDGDistributedNames.Map_InformationAccount, InformationAccount.class
);
this.accountImdg = imdgProvider.getImdg(
IMDGDistributedNames.Map_Account, Account.class
);
}
@Override
public void afterPropertiesSet() throws Exception {
callback(InformationAccountNewRequest.class)
.setFunction(this::informationAccountNew)
.forDestination(Consts.DESTINATION_INFORMATION_ACCOUNT_NEW, callbacks::put);
callback(InformationAccountNewRequest.class)
.setFunction(this::informationAccountSystemNew)
.forDestination(Consts.INFORMATION_ACCOUNT_SYSTEM_NEW, callbacks::put);
init();
}
@Deprecated
public RequestInfoUpdate informationAccountNew(BaseRequest<InformationAccountNewRequest> userRequest) {
log.debug("InformationAccountNewRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, infoAccountNewRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
InformationAccountNewRequest req = userRequest.getRequestPayload();
Long newId = informationAccountImdg.nextIDSequenceFor();
Long infoSequenceId = accountNextId();
String accountValue = generateInfoAccount(infoSequenceId);
log.trace("New info-account id={}, sequenceId={}, account={}", newId, infoSequenceId, accountValue);
ImdgPredicateBuilder accountPredicateBuilder = accountImdg.predicateBuilder();
ImdgPredicate companyIdPredicate = accountPredicateBuilder.equals("companyId", 1L);
ImdgPredicate accountTypePredicate = accountPredicateBuilder.equals("accountType", AccountType.Anlt.getKey());
ImdgPredicate andPredicate = accountPredicateBuilder.and(companyIdPredicate, accountTypePredicate);
Collection<Account> accountsAnlt = accountImdg.getCollectionObjectsByPredicate(andPredicate);
if (accountsAnlt.isEmpty()) {
return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, "clearingAccountId");
} else if (accountsAnlt.size() > 1) {
log.warn("Account for companyId 1 and accountType=ANLT contains multiply elements, use first");
}
Account anltAccount = accountsAnlt.iterator().next();
Instant now = Instant.now();
Account account = new Account();
account.setAccount(req.getAccount());
account.setAccountType(AccountType.Info.getKey());
if (req.getStatus() == null) {
account.setStatus(WorkflowStatus.Active.getKey());
log.trace("Status not set in request. Use default: {}", account.getStatus());
} else {
account.setStatus(req.getStatus());
}
account.setCompanyId(req.getCompanyId());
account.setCreated(now);
account.setUpdated(now);
requestInfoUpdate = accountHelper.fillAccountFromRelation(account, userRequest.getId(), true);
if (requestInfoUpdate != null) return requestInfoUpdate;
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
imdgTransaction.beginTransaction();
boolean txOk = false;
Long informationAccountId = -1L;
Long accountId = -1L;
InformationAccount informationAccount = null;
try {
Imdg<InformationAccount> informationAccountImdg = imdgTransaction.getImdg(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class);
Imdg<Account> accountImdg = imdgTransaction.getImdg(IMDGDistributedNames.Map_Account, Account.class);
accountId = accountImdg.insert(account);
informationAccount = new InformationAccount();
informationAccount.setId(newId);
informationAccount.setAccountId(accountId);
informationAccount.setClearingAccountId(anltAccount.getId());
informationAccount.setCompanyId(req.getCompanyId());
informationAccountId = informationAccountImdg.insert(informationAccount);
txOk = true;
} finally {
if (txOk) {
imdgTransaction.commitTransaction();
log.debug("successfully processed, new information account id {}, new account id {}",
informationAccountId,
accountId);
} else {
log.debug("failed insert, new information account id {}, new account id {} (if id = -1 then insert is failed)",
informationAccountId,
accountId);
imdgTransaction.rollbackTransaction();
}
}
return null;
}
public RequestInfoUpdate informationAccountSystemNew(BaseRequest<InformationAccountNewRequest> userRequest) {
log.debug("InformationAccountNewRequest received (system), request id={}", userRequest.getId());
RequestInfoUpdate requestInfoUpdate;
// RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, infoAccountNewRequestValidator);
// if (requestInfoUpdate != null) return requestInfoUpdate;
final Long forCompanyId = userRequest.getRequestPayload().getCompanyId();
ImdgPredicateBuilder pb = accountImdg.predicateBuilder();
{ // Проверка существования счёта
Collection<Account> accountsAnlt = accountImdg.getCollectionObjectsByFieldValues(Map.of(
"companyId", forCompanyId,
"accountType", AccountType.Info.getKey()
));
if (!accountsAnlt.isEmpty()) {
String trueMessage = messageResolver.resolve(new EnumMessage(AccountError.InfoAccountAlreadyExist, forCompanyId));
log.warn("{}", trueMessage);
return null;
}
}
Long newId = informationAccountImdg.nextIDSequenceFor();
Long infoSequenceId = accountNextId(); // требуется последовательность n+1
String accountValue = generateInfoAccount(infoSequenceId);
log.trace("New info-account id={}, sequenceId={}, account={}", newId, infoSequenceId, accountValue);
Long anltAccountId = null;
{
ImdgPredicate andPredicate = pb.and(
pb.equals("companyId", 1L),
pb.equals("accountType", AccountType.Anlt.getKey())
);
Collection<Account> accountsAnlt = accountImdg.getCollectionObjectsByPredicate(andPredicate);
if (accountsAnlt.isEmpty()) {
log.error("Account with {} not exist.", andPredicate);
return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, "clearingAccountId");
} else if (accountsAnlt.size() > 1) {
log.warn("Account for companyId 1 and accountType=ANLT contains multiply elements, use first");
}
Account anltAccount = accountsAnlt.iterator().next();
anltAccountId = anltAccount.getId();
}
Instant now = Instant.now();
Account account = new Account();
account.setAccount(accountValue);
account.setAccountType(AccountType.Info.getKey());
account.setStatus(ServiceStatus.Active.getKey());
account.setCompanyId(forCompanyId);
account.setCreated(now);
account.setUpdated(now);
requestInfoUpdate = accountHelper.fillAccountFromRelation(account, userRequest.getId(), false);
if (requestInfoUpdate != null) {
log.debug("Stop make new account, cause error: {}", requestInfoUpdate.getMessage());
return requestInfoUpdate;
}
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
imdgTransaction.beginTransaction();
boolean txOk = false;
Long informationAccountId = -1L;
Long accountId = -1L;
InformationAccount informationAccount = null;
try {
Imdg<InformationAccount> informationAccountImdg = imdgTransaction.getImdg(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class);
Imdg<Account> accountImdg = imdgTransaction.getImdg(IMDGDistributedNames.Map_Account, Account.class);
accountId = accountImdg.insert(account);
informationAccount = new InformationAccount();
informationAccount.setId(newId);
informationAccount.setAccountId(accountId);
informationAccount.setClearingAccountId(anltAccountId);
informationAccount.setCompanyId(userRequest.getRequestPayload().getCompanyId());
informationAccountId = informationAccountImdg.insert(informationAccount);
txOk = true;
} finally {
if (txOk) {
imdgTransaction.commitTransaction();
log.debug("successfully processed, new information account id {}, new account id {}",
informationAccountId,
accountId);
} else {
log.debug("failed insert, new information account id {}, new account id {} (if id = -1 then insert is failed)",
informationAccountId,
accountId);
imdgTransaction.rollbackTransaction();
}
}
// send to kafka
sendNotificationToReport(informationAccount, account);
return null;
}
/**
* Формирование уведолмения о регистрации УК
*/
protected void sendNotificationToReport(InformationAccount informationAccount, Account account) {
NotificationRequest request = new NotificationRequest();
request.setConsumerId(account.getCompanyId());
log.debug("Send message to kafka \"{}\": {}", Consts.CREATE_NOTIFICATION_NTCR, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.CREATE_NOTIFICATION_NCMP, request);
}
public String generateInfoAccount(Long id) {
return "%d%d%08d%d".formatted(39911, 810, id, 7000);
}
/**
* Сквозной номер инфо-счетов
*
* @return infoCounter++
*/
public synchronized Long accountNextId() {
if (infoCounter == null) synchronized (this) {
if (infoCounter == null) {
log.debug("Init account-information counter.");
Collection<Account> allInfoAcc = accountImdg.getCollectionObjectsByFieldValues(Map.of("accountType", AccountType.Info.getKey()));
if (allInfoAcc.isEmpty()) {
infoCounter = new AtomicLong(1);
log.debug("No account information on map. n={}", infoCounter.get());
} else {
Pattern accPattern = Pattern.compile("39911810([0-9]{8})7000");
int maxN = 1;
int parsedCount = 0;
String lastAccount = null; // for debug
for (Account acc : allInfoAcc) {
try {
String number = acc.getAccount();
if (StringUtils.isEmpty(number)) continue;
lastAccount = number;
Matcher m = accPattern.matcher(number);
if (m.find()) {
String seqNumber = m.group(1);
if (StringUtils.isNotEmpty(seqNumber)) {
int accN = Integer.parseInt(seqNumber);
if (accN > maxN) maxN = accN;
}
parsedCount++;
}
} catch (Exception errParse) {
log.warn("Error parse account {}: {}", acc.getId(), ExceptionUtils.getStackTrace(errParse));
}
}
infoCounter = new AtomicLong(maxN);
log.debug("Parsed {} information accounts ({} pattern match) in map. n={}",
allInfoAcc.size(), parsedCount, infoCounter.get());
if (parsedCount == 0 && lastAccount != null)
log.debug("Last unparseable account: {}", lastAccount);
}
}
}
return infoCounter.incrementAndGet();
}
}

View file

@ -0,0 +1,160 @@
package ru.spcex.clearing.account.service;
import org.apache.commons.lang3.tuple.Triple;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.misc.Notification;
import ru.clearing.classes.statics.data.sdf.SDf52;
import ru.clearing.classes.statics.data.sdf.SDf53;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.NotificationFeedbackRequest;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.enumeration.AccountStatus;
import ru.spcex.platform.enumeration.NotificationStatus;
import ru.spcex.platform.enumeration.ObjectType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.ImdgTransaction;
import ru.spcex.platform.utils.collection.Pair;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
@Service
public class SDFProcessService {
public static final String SDF_STATUS_OK = "OK"; // (Операция выполнена успешно) - если account обновлена по sDf52;
public static final String SDF_STATUS_ERROR_REPEAT = "1"; // (Ошибка. Попытка повторно исполнить операцию)
public static final String SDF_STATUS_ERROR_COMPANY_NOT_FOUND = "2"; // (Ошибка. Участник не найден) - если получена ошибка (5013) "Компания %s не найдена" (т.е. account НЕ обновлена по sDf52);
public static final String SDF_STATUS_ERROR_LIMIT_SUMM = "3"; // (Ошибка. Сумма списания превышает сумму средств на торговом счете участника в ТС)
public static final String SDF_STATUS_ERROR_NO_TRADE = "4"; // (Ошибка. Торги не идут)
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());
protected final Producer<String, Object> kafkaResponseQueue;
protected final KafkaSender kafkaSender;
protected final ImdgProvider imdgProvider;
protected final ImdgId idGenerator;
private final Imdg<SDf52> sdf52Imdg;
public SDFProcessService(
Producer<String, Object> kafkaResponseQueue,
KafkaSender kafkaSender,
ImdgProvider imdgProvider) {
this.kafkaResponseQueue = kafkaResponseQueue;
this.kafkaSender = kafkaSender;
this.imdgProvider = imdgProvider;
this.idGenerator = imdgProvider.getImdgIdGenerator();
this.sdf52Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf52, SDf52.class);
}
public Collection<SDf52> sdfsByGroupId(Long generationId) {
Collection<SDf52> sdfs = sdf52Imdg.getCollectionObjectsByFieldValues(Map.of(
"generationId", generationId
));
return sdfs;
}
public void process(StatementRequest req, List<Triple<SDf52, Account, String>> toProcessSDF53) {
final Long generationId = req.getGroupId();
log.info("Create S_DF53 generationId={} by {} S_DF_52",
generationId, toProcessSDF53.size());
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
boolean txOk = false;
imdgTransaction.beginTransaction();
HashSet<String> fileNames = new HashSet<>();
try { // 2. обновление данных, в транзакции
Imdg<SDf53> sdf53Imdg = imdgTransaction.getImdg(IMDGDistributedNames.Map_SDf53, SDf53.class);
Instant now = Instant.now();
for (Triple<SDf52, Account, String> item : toProcessSDF53) {
SDf53 sDf53 = createBy(item.getLeft(), item.getRight(), now, generationId);
sdf53Imdg.insert(sDf53);
fileNames.add(item.getLeft().getFileName());
}
txOk = true;
} finally {
if (txOk) {
imdgTransaction.commitTransaction();
} else {
log.debug("failed create new SDF53, rollback transaction. sdf52 generationId={}", generationId);
imdgTransaction.rollbackTransaction();
}
}
if (fileNames.size() > 1)
log.warn("generationId={}, too many different file names in S_DF52: {}", generationId, fileNames);
String fileNameSingle = fileNames.stream().filter(Objects::nonNull).findAny().orElse(null);
log.info("Send export command for SDF53 generationId={} with source file name {}",
generationId, (fileNameSingle == null ? null : "\"" + fileNameSingle + "\""));
messageStatementToExport53(generationId, fileNameSingle);
}
SDf53 createBy(SDf52 sdf52, String result, Instant now, Long newGenerationId) {
SDf53 newSdf = new SDf53();
newSdf.setId(idGenerator.nextId());
newSdf.setAccName(sdf52.getAcc_name());
newSdf.setAccount(sdf52.getAccount());
newSdf.setDeal(sdf52.getDeal());
newSdf.setDate(sdf52.getDate());
newSdf.setStatus(sdf52.getStatus());
newSdf.setResult(result);
newSdf.setGenerationTime(now);
newSdf.setGenerationId(sdf52.getGenerationId());
if (!Objects.equals(newGenerationId, newSdf.getGenerationId())) { // never
log.warn("Different GenerationId={} for sdf53[{}] and GenerationId={} for group of sdf52",
newSdf.getGenerationId(), newSdf.getId(), newGenerationId
);
}
newSdf.setInSDfId(sdf52.getId());
return newSdf;
}
/**
* @param status sdf.getStatus()
* @return AccountStatus или null
*/
public AccountStatus parseSdf52Status(Long status) {
if (SDF52_STATUS_1Unblocked.equals(status) || SDF52_STATUS_3Open.equals(status)) {
return AccountStatus.ACTIVE;
} else if (SDF52_STATUS_0Blocked.equals(status)) {
return AccountStatus.BLOCKED;
}
if (SDF52_STATUS_2Closed.equals(status)) {
return AccountStatus.CLOSE;
}
return null;
}
void messageStatementToExport53(Long groupId, String fileName) {
final String destination = Consts.EXPORT_PROCESS; // dbf-exporter
ExportToFileRequest request = new ExportToFileRequest();
request.setNameOfTable("DF-53"); // SdfTable.SDF_53
request.setSdfGroupId(groupId);
request.setFileName(fileName);
Long msgId = kafkaSender.sendRequestToQueue(destination, request);
log.debug("Send ExportToFileRequest({}, {}) message id={} to kafka \"{}\"",
groupId, request.getNameOfTable(), msgId, destination);
}
}

View file

@ -0,0 +1,498 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.NotificationRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.TradingClearingRegistryPurpose;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.*;
import java.util.function.Function;
@Service
public class TradingClearingRegistryService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ValidationHelper validationHelper;
private final UserRoleVerification userRoleVerification;
private final ImdgProvider imdgProvider;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<DepoAccount> depoAccountImdg;
private final Imdg<ClearingAccount> clearingAccountImdg;
private final Imdg<InformationAccount> informationAccountImdg;
private final Imdg<Account> accountImdg;
private final Imdg<Company> companyImdg;
private final Imdg<Relation> relationImdg;
private final Function<TradingClearingRegistryUpdateRequest, IValidator> tradingClearingRegistryUpdateRequestValidator;
private final RequestHelper requestHelper;
private final Function<TradingClearingRegistryNewRequest, IValidator> tradingClearingRegistryNewRequestValidator;
private final Function<TradingClearingRegistryNewRequest, IValidator> tradingClearingRegistryAutoNewRequestValidator;
private final Function<CommonIdRequest, IValidator> tradingClearingRegistryBlockRequestValidator;
private final IMessageResolver messageResolver;
private final Producer<String, Object> kafkaProducer;
private final KafkaSender kafkaSender;
public TradingClearingRegistryService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
KafkaSender kafkaSender,
ImdgProvider imdgProvider,
ValidationHelper validationHelper,
UserRoleVerification userRoleVerification,
IMessageResolver messageResolver,
RequestHelper requestHelper,
@Qualifier("tradingClearingRegistryNewRequest")
Function<TradingClearingRegistryNewRequest, IValidator> tradingClearingRegistryNewRequestValidator,
@Qualifier("tradingClearingRegistryUpdateRequest")
Function<TradingClearingRegistryUpdateRequest, IValidator> tradingClearingRegistryUpdateRequestValidator,
@Qualifier("tradingClearingRegistryBlockRequest")
Function<CommonIdRequest, IValidator> tradingClearingRegistryBlockRequestValidator) {
super(kafkaQueue, kafkaProducer);
this.kafkaProducer = kafkaProducer;
this.kafkaSender = kafkaSender;
this.validationHelper = validationHelper;
this.userRoleVerification = userRoleVerification;
this.requestHelper = requestHelper;
this.imdgProvider = imdgProvider;
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.depoAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
this.informationAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class);
this.tradingClearingRegistryNewRequestValidator = tradingClearingRegistryNewRequestValidator;
this.tradingClearingRegistryAutoNewRequestValidator = tradingClearingRegistryNewRequestValidator; // без relation.
this.tradingClearingRegistryUpdateRequestValidator = tradingClearingRegistryUpdateRequestValidator;
this.tradingClearingRegistryBlockRequestValidator = tradingClearingRegistryBlockRequestValidator;
this.messageResolver = messageResolver;
}
@Override
public void afterPropertiesSet() throws Exception {
imdgProvider.waitAvailable();
callback(TradingClearingRegistryNewRequest.class) // todo deprecated - unused.
.setFunction(this::tradingClearingRegistryAutoNew)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_AUTO_NEW, callbacks::put);
callback(TradingClearingRegistryNewRequest.class)
.setFunction(this::tradingClearingRegistryNew)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_NEW, callbacks::put);
callback(TradingClearingRegistryUpdateRequest.class)
.setFunction(this::tradingClearingRegistryUpdate)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE, callbacks::put);
callback(CommonIdRequest.class)
.setFunction(this::tradingClearingRegistryBlock)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_BLOCK, callbacks::put);
init();
}
@Deprecated
public RequestInfoUpdate tradingClearingRegistryAutoNew(BaseRequest<TradingClearingRegistryNewRequest> userRequest) {
log.debug("TradingClearingRegistryNewRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, tradingClearingRegistryAutoNewRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
TradingClearingRegistryNewRequest req = userRequest.getRequestPayload();
Long id = tradingClearingRegistryImdg.nextIDSequenceFor();
TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry();
tradingClearingRegistry.setId(id);
tradingClearingRegistry.setCompanyId(req.getCompanyId());
tradingClearingRegistry.setMoneyAccountId(req.getMoneyAccountId());
tradingClearingRegistry.setDepoAccountId(req.getDepoAccountId());
Account depoAccountMain = req.getDepoAccountId() != null ? accountImdg.getSingleObjectByID(req.getDepoAccountId()) : null;
DepoAccount depoAccount = depoAccountMain != null ? depoAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", req.getDepoAccountId())) : null;
// InformationAccount infoAccount = null;
ClearingAccount clearingAccount = null;
Account accountMain = null;
if (req.getMoneyAccountId() != null) {
clearingAccount = clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", req.getMoneyAccountId()));
// if (clearingAccount == null) infoAccount = informationAccountImdg.getSingleObjectByFieldValues(Map.of("accountId", req.getMoneyAccountId()));
Long accountId = req.getMoneyAccountId(); //clearingAccount != null ? clearingAccount.getAccountId() : infoAccount.getAccountId();
accountMain = accountImdg.getSingleObjectByID(accountId);
}
// кроссвалидация
if (req.getMoneyAccountId() == null && (req.getMoneyAccountId() == null || req.getDepoAccountId() == null)) {
TradingClearingRegistry registryByCompany = tradingClearingRegistryImdg.getFirstObjectByFieldValues(Map.of("companyId", req.getCompanyId()));
if (registryByCompany == null) {
log.trace("Not found registry with companyId={}",
req.getCompanyId());
return requestHelper.makeErrorResponse(userRequest,
AccountError.TradingClearingRegistryNotFound,
req.getCompanyId());
}
}
if (tradingClearingRegistry.getMoneyAccountId() == null && tradingClearingRegistry.getDepoAccountId() != null) {
Collection<TradingClearingRegistry> registriesByCompany = tradingClearingRegistryImdg.getCollectionObjectsByFieldValues(Map.of("companyId", req.getCompanyId()));
TradingClearingRegistry targetExistTradingClearingRegistry = null;
for (TradingClearingRegistry existRegistry : registriesByCompany) {
if (existRegistry.getMoneyAccountId() != null && existRegistry.getDepoAccountId() == null) {
targetExistTradingClearingRegistry = existRegistry;
}
}
if (targetExistTradingClearingRegistry == null) {
log.warn("TradingClearingRegister with MoneyAccountId for companyId={} not found. Search exist accounts for company", req.getCompanyId());
Long accountId;
InformationAccount infoAccount = null;
clearingAccount = clearingAccountImdg.getFirstObjectByFieldValues(Map.of("companyId", req.getCompanyId()));
if (clearingAccount == null) {
infoAccount = informationAccountImdg.getFirstObjectByFieldValues(Map.of("companyId", req.getCompanyId()));
if (infoAccount == null) {
log.warn("ClearingAccount and InfoAccount not exist for company {}.", req.getCompanyId());
accountId = null;
} else {
accountId = infoAccount.getAccountId();
log.debug("Found account.id={} and infoaccount.id={} by companyId={}", accountId, infoAccount.getId(), req.getCompanyId());
}
} else {
accountId = clearingAccount.getAccountId();
log.debug("Found account.id={} and clearingAccount.id={} by companyId={}", accountId, clearingAccount.getId(), req.getCompanyId());
}
if (accountId != null) {
accountMain = accountImdg.getSingleObjectByID(accountId);
if (accountMain == null) { // never, только с инконсистентными данными
log.warn("Account {} not exist.", accountId);
} else {
tradingClearingRegistry.setMoneyAccountId(accountId);
log.debug("Set tradingClearingRegistry[{}].MoneyAccountId={}", tradingClearingRegistry.getId(), accountId);
}
}
} else {
log.debug("Update exist TCR.id={}, set DepoAccountId={}", targetExistTradingClearingRegistry, req.getDepoAccountId());
targetExistTradingClearingRegistry.setDepoAccountId(req.getDepoAccountId());
targetExistTradingClearingRegistry.setUpdated(Instant.now());
tradingClearingRegistryImdg.update(targetExistTradingClearingRegistry);
log.debug("successfully processed, id {}. Updated exist TradingClearingRegistry.id={}", id, targetExistTradingClearingRegistry.getId());
return null;
}
}
List<String> activeStatuses = Arrays.asList(ServiceStatus.Active.getKey(), ServiceStatus.Reopened.getKey());
String status = null;
if (depoAccountMain != null && depoAccountMain.getStatus() != null) {
if (activeStatuses.contains(depoAccountMain.getStatus()) && activeStatuses.contains(accountMain.getStatus()))
status = ServiceStatus.Active.getKey();
if (depoAccountMain.getStatus().equals(ServiceStatus.Blocked.getKey()) || accountMain.getStatus().equals(ServiceStatus.Blocked.getKey()))
status = ServiceStatus.Blocked.getKey();
if (depoAccountMain.getStatus().equals(ServiceStatus.Suspended.getKey()) || accountMain.getStatus().equals(ServiceStatus.Suspended.getKey()))
status = ServiceStatus.Suspended.getKey();
if (depoAccountMain.getStatus().equals(ServiceStatus.Closed.getKey()) || accountMain.getStatus().equals(ServiceStatus.Closed.getKey()))
status = ServiceStatus.Closed.getKey();
} else if (accountMain.getStatus() != null) {
if (activeStatuses.contains(accountMain.getStatus()))
status = ServiceStatus.Active.getKey();
if (accountMain.getStatus().equals(ServiceStatus.Blocked.getKey()))
status = ServiceStatus.Blocked.getKey();
if (accountMain.getStatus().equals(ServiceStatus.Suspended.getKey()))
status = ServiceStatus.Suspended.getKey();
if (accountMain.getStatus().equals(ServiceStatus.Closed.getKey()))
status = ServiceStatus.Closed.getKey();
}
if (status == null)
return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, req.getMoneyAccountId());
tradingClearingRegistry.setStatus(status);
String tradingRegistryType;
if (depoAccount != null) {
tradingRegistryType = depoAccount.getDepoAccountType();
} else {
if (clearingAccount != null) tradingRegistryType = clearingAccount.getClearingAccountType();
else tradingRegistryType = TradingClearingRegistryType.Owner_A.getKey();
}
tradingClearingRegistry.setTradingClearingRegistryType(tradingRegistryType);
TradingClearingRegistryPurpose registryPurpose;
if (req.getDepoAccountId() != null) registryPurpose = TradingClearingRegistryPurpose.C;
else registryPurpose = TradingClearingRegistryPurpose.M;
tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey());
Company company = companyImdg.getSingleObjectByID(req.getCompanyId());
Long seqId = companySequenceNextId(req.getCompanyId(), registryPurpose, tradingRegistryType);
String code = makeCode(company.getClearingCode(), registryPurpose, tradingRegistryType, seqId);
log.debug("For new TCR.id={} of companyId={} next sequence={}; code={}", id, req.getCompanyId(), seqId, code);
tradingClearingRegistry.setCode(code);
Instant now = Instant.now();
tradingClearingRegistry.setCreated(now);
tradingClearingRegistry.setUpdated(now);
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
log.debug("New TCR.id={} was created", tradingClearingRegistry.getId());
// sendNotificationToCompanySvc(tradingClearingRegistry); при автосоздании ТКР в company-service не отправлять.
// sendNotificationToClearingSvc(tradingClearingRegistry);
sendNotificationToReportSvc(tradingClearingRegistry);
sendNotificationToClearingSvc(tradingClearingRegistry);
log.debug("successfully processed, id {}", id);
return null;
}
public synchronized RequestInfoUpdate tradingClearingRegistryNew(BaseRequest<TradingClearingRegistryNewRequest> userRequest) {
log.debug("TradingClearingRegistryNewRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) {
return requestInfoUpdate;
}
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, tradingClearingRegistryNewRequestValidator);
if (requestInfoUpdate != null) {
return requestInfoUpdate;
}
TradingClearingRegistryNewRequest req = userRequest.getRequestPayload();
// Дополнительная проверка
if (req.getMoneyAccountId() == null && (req.getMoneyAccountId() == null || req.getDepoAccountId() == null)) {
TradingClearingRegistry registryByCompany = tradingClearingRegistryImdg.getFirstObjectByFieldValues(Map.of("companyId", req.getCompanyId()));
if (registryByCompany == null) {
return requestHelper.makeErrorResponse(userRequest,
AccountError.TradingClearingRegistryNotFound,
"companyId=" + req.getCompanyId());
}
}
Long id = tradingClearingRegistryImdg.nextIDSequenceFor();
TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry();
tradingClearingRegistry.setId(id);
tradingClearingRegistry.setCompanyId(req.getCompanyId());
tradingClearingRegistry.setMoneyAccountId(req.getMoneyAccountId());
tradingClearingRegistry.setDepoAccountId(req.getDepoAccountId());
DepoAccount depoAccount = req.getDepoAccountId() != null ? depoAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", req.getDepoAccountId())) : null;
ClearingAccount clearingAccount = req.getMoneyAccountId() != null ? clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", req.getMoneyAccountId())) : null;
if (req.getStatus() == null) {
tradingClearingRegistry.setStatus(ServiceStatus.Active.getKey());
log.trace("TCR status in request not set. Use default: {}", tradingClearingRegistry.getStatus());
} else {
tradingClearingRegistry.setStatus(req.getStatus());
log.trace("TCR status in request set: {}", tradingClearingRegistry.getStatus());
}
String tradingRegistryType;
if (req.getTradingClearingRegistryType() != null) {
tradingRegistryType = req.getTradingClearingRegistryType();
} else if (depoAccount != null) {
tradingRegistryType = depoAccount.getDepoAccountType();
} else {
if (clearingAccount != null) tradingRegistryType = clearingAccount.getClearingAccountType();
else tradingRegistryType = TradingClearingRegistryType.Owner_A.getKey();
}
tradingClearingRegistry.setTradingClearingRegistryType(tradingRegistryType);
TradingClearingRegistryPurpose registryPurpose;
if (req.getDepoAccountId() != null) registryPurpose = TradingClearingRegistryPurpose.C;
else registryPurpose = TradingClearingRegistryPurpose.M;
tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey());
Company company = companyImdg.getSingleObjectByID(req.getCompanyId());
Long seqId = companySequenceNextId(req.getCompanyId(), registryPurpose, tradingRegistryType);
String code = makeCode(company.getClearingCode(), registryPurpose, tradingRegistryType, seqId);
log.debug("For new TCR.id={} of companyId={} next sequence={}; code={}", id, req.getCompanyId(), seqId, code);
tradingClearingRegistry.setCode(code);
Instant now = Instant.now();
tradingClearingRegistry.setCreated(now);
tradingClearingRegistry.setUpdated(now);
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
log.info("New TCR.id={} was created.", tradingClearingRegistry.getId());
sendNotificationToReportSvc(tradingClearingRegistry);
sendNotificationToClearingSvc(tradingClearingRegistry);
log.debug("successfully processed, id {}", id);
return null;
}
protected Long companySequenceNextId(Long companyId, TradingClearingRegistryPurpose registryPurpose, String tradingRegistryType) {
ImdgPredicateBuilder pb = tradingClearingRegistryImdg.predicateBuilder();
Collection<TradingClearingRegistry> existTCR = tradingClearingRegistryImdg.getCollectionObjectsByPredicate(
pb.and(
pb.equals("companyId", companyId),
pb.equals("tradingClearingRegistryPurpose", registryPurpose.getKey()),
pb.equals("tradingClearingRegistryType", tradingRegistryType)
)
);
if (existTCR.isEmpty()) {
log.trace("For company id={} not found exist TCR.", companyId);
return 1L;
}
log.trace("For company id={} found {} exist TCR.", companyId, existTCR.size());
long maxN = 0;
for (TradingClearingRegistry tcr : existTCR) {
Long codeN = parseCodeSeqId(tcr.getCode());
if (codeN != null) {
if (maxN < codeN)
maxN = codeN;
}
}
return maxN + 1;
}
protected Long parseCodeSeqId(String code) {
if (code == null || code.isBlank())
return null;
try {
String toParse = code.trim();
if (toParse.length() > 5)
toParse = toParse.substring(toParse.length() - 5);
return Long.parseLong(toParse);
} catch (NumberFormatException nan) {
log.warn("Can not parse number from TCR code \"{}\": {}", code, nan.getMessage());
}
return null;
}
protected String makeCode(String companyClearingCode, TradingClearingRegistryPurpose registryPurpose, String tradingRegistryType, Long id) {
String code;
code = companyClearingCode;
if (code.length() > 4)
code = code.substring(code.length() - 4);
code = "%4s".formatted(code).replace(' ', '0');
code += registryPurpose.getKey(); // C / M / ...
String trType = tradingRegistryType + "T"; // 2 символа
code += trType;
String sId = "%5s".formatted(id).replace(' ', '0');
if (sId.length() > 5)
sId = sId.substring(sId.length() - 5);
code += sId;
return code; // 12 имволов
}
public RequestInfoUpdate tradingClearingRegistryUpdate(BaseRequest<TradingClearingRegistryUpdateRequest> userRequest) {
log.debug("TradingClearingRegistryUpdateRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, tradingClearingRegistryUpdateRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
TradingClearingRegistryUpdateRequest req = userRequest.getRequestPayload();
TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryImdg.getSingleObjectByID(req.getId());
// кроссвалидация - нельзя менять эти поля:
if (req.getMoneyAccountId() != null && !req.getMoneyAccountId().equals(tradingClearingRegistry.getMoneyAccountId())) {
return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, "MoneyAccountId", req.getMoneyAccountId());
}
if (req.getDepoAccountId() != null && !req.getDepoAccountId().equals(tradingClearingRegistry.getDepoAccountId())) {
return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, "DepoAccountId", req.getDepoAccountId());
}
// tradingClearingRegistry.setMoneyAccountId(req.getMoneyAccountId());
// tradingClearingRegistry.setDepoAccountId(req.getDepoAccountId());
if (req.getStatus() != null && !Objects.equals(req.getStatus(), tradingClearingRegistry.getStatus())) {
Instant now = Instant.now();
tradingClearingRegistry.setUpdated(now);
tradingClearingRegistry.setStatus(req.getStatus());
tradingClearingRegistryImdg.update(tradingClearingRegistry);
log.debug("Update TCR.id={}.", tradingClearingRegistry.getId());
} else {
log.debug("Nothing to update TCR.id={}.", tradingClearingRegistry.getId());
}
log.debug("successfully processed, id {}", tradingClearingRegistry.getId());
return null;
}
public RequestInfoUpdate tradingClearingRegistryBlock(BaseRequest<CommonIdRequest> userRequest) {
log.debug("TradingClearingRegistryBlockRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, tradingClearingRegistryBlockRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
CommonIdRequest req = userRequest.getRequestPayload();
TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryImdg.getSingleObjectByID(req.getId());
tradingClearingRegistry.setStatus(ServiceStatus.Blocked.getKey());
tradingClearingRegistry.setUpdated(Instant.now());
tradingClearingRegistryImdg.update(tradingClearingRegistry);
log.debug("successfully processed, id {}", tradingClearingRegistry.getId());
return null;
}
/**
* company-service сообщение об успешном добавлении ТКР клиента с параметром tradingClearingRegistry.code
*/
protected void sendNotificationToCompanySvc(TradingClearingRegistry tradingClearingRegistry) {
ClientCodeNewRequest request = new ClientCodeNewRequest();
request.setTradingClearingRegistryId(tradingClearingRegistry.getId());
request.setCompanyId(tradingClearingRegistry.getCompanyId());
request.setCode(tradingClearingRegistry.getCode());
request.setMoneyAccountId(tradingClearingRegistry.getMoneyAccountId());
request.setDepoAccountId(tradingClearingRegistry.getDepoAccountId());
log.debug("Send message to kafka \"{}\": {}", Consts.DESTINATION_CLIENT_CODE_NEW_UM_COMPANY, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.DESTINATION_CLIENT_CODE_NEW_UM_COMPANY, request);
}
/**
* clearing-service сообщение на открытие клиринговых регистров;
*/
protected void sendNotificationToClearingSvc(TradingClearingRegistry tradingClearingRegistry) {
CreateRegistryRequest request = new CreateRegistryRequest();
request.setCompanyId(tradingClearingRegistry.getCompanyId());
request.setTradingClearingRegistryId(tradingClearingRegistry.getId());
log.debug("Send message to kafka \"{}\": {}", Consts.REGISTRY_NEW, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.REGISTRY_NEW, request);
}
/**
* report-service сообщение на формирование уведомления о создании нового ТКР
*/
protected void sendNotificationToReportSvc(TradingClearingRegistry tradingClearingRegistry) {
NotificationRequest request = new NotificationRequest();
request.setConsumerId(tradingClearingRegistry.getCompanyId());
log.debug("Send message to kafka \"{}\": {}", Consts.CREATE_NOTIFICATION_NTCR, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.CREATE_NOTIFICATION_NTCR, request);
}
}

View file

@ -0,0 +1,103 @@
package ru.spcex.clearing.account.validation;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewRequest;
import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
import java.util.Map;
import java.util.Optional;
public enum AccountValidationRule implements IValidationRule<ImdgValidationContext<BankAccountNewRequest>> {
CompanyPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<BankAccountNewRequest> context) {
BankAccountNewRequest bankAccount = context.getValidatedObject();
Imdg<Company> companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class);
Company company = companyImdg.getSingleObjectByID(bankAccount.getCompanyId());
if (company == null) {
return of(AccountError.CompanyNotFound);
}
if (!Status.Active.equalsByKey(company.getWorkflowStatus())) {
return of(AccountError.CompanyNotActive);
}
// context.storeObject(ValidationStored.Company, company);
return empty();
}
},
AccountIsNew() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<BankAccountNewRequest> context) {
BankAccountNewRequest bankAccountRequest = context.getValidatedObject();
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
Account account = accountImdg.getFirstObjectByFieldValues(Map.of("account", bankAccountRequest.getAccount(),
"accountStatus", Status.Active.getKey()));
if (account != null) {
return of(AccountError.AccountAlreadyExist);
}
return empty();
}
},
RequiredFields() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<BankAccountNewRequest> context) {
BankAccountNewRequest accountReq = context.getValidatedObject();
if (StringUtils.isEmpty(accountReq.getCurrency())) {
return of(AccountError.WrongFieldValue, "currency");
}
if (StringUtils.isEmpty(accountReq.getBankIdentificationCode())) {
return of(AccountError.WrongFieldValue, "bankIdentificationCode");
}
if (StringUtils.isEmpty(accountReq.getBankName())) {
return of(AccountError.WrongFieldValue, "bankName");
}
if (StringUtils.isEmpty(accountReq.getAccount())) {
return of(AccountError.WrongFieldValue, "account");
}
if (StringUtils.isEmpty(accountReq.getDestination())) {
return of(AccountError.WrongFieldValue, "destination");
}
if (StringUtils.isEmpty(accountReq.getCompanyId())) {
return of(AccountError.WrongFieldValue, "companyId");
}
return empty();
}
},
RubRequiredFields() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<BankAccountNewRequest> context) {
BankAccountNewRequest accountReq = context.getValidatedObject();
if ("RUB".equals(accountReq.getCurrency())) {
if (StringUtils.isEmpty(accountReq.getCorrespondentAccount())) {
return of(AccountError.WrongFieldValue, "correspondentAccount");
}
if (StringUtils.isEmpty(accountReq.getCorrespondentAccountName())) {
return of(AccountError.WrongFieldValue, "correspondentAccountName");
}
if (StringUtils.isEmpty(accountReq.getTaxpayerIdentificationNumber())) {
return of(AccountError.WrongFieldValue, "taxpayerIdentificationNumber");
}
if (StringUtils.isEmpty(accountReq.getTaxRegistrationReasonCode())) {
return of(AccountError.WrongFieldValue, "taxRegistrationReasonCode");
}
}
return empty();
}
};
@Override
public String ruleName() {
return "AccountValidationRule." + name();
}
}

View file

@ -0,0 +1,19 @@
spring.main.web-application-type=none
account-service.hazelcast.cluster-members=127.0.0.1:5701
account-service.hazelcast.login=dev
account-service.hazelcast.password=dev-pass
account-service.kafka-consumer.bootstrap-servers=localhost:9092
account-service.kafka-consumer.group-id=dev-group-account-service
account-service.kafka-consumer.enable-auto-commit=true
account-service.kafka-consumer.session-timeout-ms=30000
account-service.kafka-consumer.auto-offset-reset=latest
account-service.kafka-consumer.linger-ms=1
account-service.kafka-consumer.buffer-memory=33554432
account-service.kafka-producer.bootstrap-servers=localhost:9092
account-service.kafka-producer.acks=all
account-service.kafka-producer.retries=0
account-service.kafka-producer.batch-size=16384
account-service.kafka-producer.linger-ms=1
account-service.kafka-producer.buffer-memory=33554432

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- |%X{ru.nbch.scoring.web.logging.mdc_key}-->
<Pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %class{0}:%line - %message%n</Pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/account-service.log</file>
<encoder>
<!-- |%X{ru.nbch.scoring.web.logging.mdc_key}-->
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{0}:%msg%n</Pattern>
<charset>utf8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>
./logs/account-service.%i.log
</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>10</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>500MB</maxFileSize>
</triggeringPolicy>
</appender>
<root level="warn">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<logger name="ru.spcex" level="debug" additivity="false">
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</logger>
</configuration>

View file

@ -0,0 +1,246 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.producer.MockProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.platform.dictionary.AccountTypeDictionary;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.spcex.clearing.account.config.BeanConfiguration;
import ru.spcex.clearing.account.config.validation.AccountValidationConfig;
import ru.spcex.clearing.account.config.validation.InformationAccountValidationConfig;
import ru.spcex.clearing.account.config.validation.ValidationConfig;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.CorrespondentAccountNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.CorrespondentAccountUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.platform.messaging.service.RequestInfo;
import ru.spcex.clearing.test.MatcherFactory;
import ru.spcex.clearing.test.TestObjectCreator;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
import javax.annotation.PostConstruct;
import java.util.Map;
import java.util.UUID;
import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator;
import static ru.spcex.clearing.test.TestUtils.*;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
BeanConfiguration.class,
ValidationConfig.class,
AccountValidationConfig.class,
AccountService.class,
AccountHelper.class,
InformationAccountService.class,
InformationAccountValidationConfig.class,
ImdgTestConfig.class,
KafkaTestConfig.class})
class AccountServiceTest {
public static final MatcherFactory.Matcher<Account> ACCOUNT_MATCHER = usingIgnoringFieldsComparator();
public static final MatcherFactory.Matcher<RequestInfo> REQUEST_INFO_MATCHER_MATCHER = usingIgnoringFieldsComparator("created");
private static final int PARTITION = 0;
private static final String account = "123456789123";
private static final Long companyId = 0L;
private static final Long relationId = 0L;
@Autowired
AccountService accountService;
@Autowired
@Qualifier("hazelcastServiceTest")
private HazelcastService hazelcastServiceTest;
@Captor
private ArgumentCaptor<ProducerRecord> producerRecord;
@SpyBean
private MockProducer<String, Object> producer;
@Autowired
@Qualifier("mockProducer")
protected Producer<String, Object> mockProducer;
private Imdg<Account> accountImdg;
private Imdg<Company> companyImdg;
private Imdg<AccountTypeDictionary> accountTypeDictionaryImdg;
private Imdg<ClearingMemberCategory> clearingMemberCategoryImdg;
private Imdg<Relation> relationImdg;
private Imdg<ServiceStatusDictionary> serviceStatusDictionaryImdg;
@PostConstruct
private void init() {
hazelcastServiceTest.waitAvailable();
accountImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Account, Account.class
);
companyImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Company, Company.class
);
accountTypeDictionaryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class
);
clearingMemberCategoryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class
);
relationImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Relation, Relation.class
);
serviceStatusDictionaryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ServiceStatusDictionary, ServiceStatusDictionary.class
);
ServiceStatusDictionary serviceStatusDictionary = new ServiceStatusDictionary();
serviceStatusDictionary.setCode(ServiceStatus.Active.getKey());
serviceStatusDictionary.setName(ServiceStatus.Active.getKey());
serviceStatusDictionaryImdg.insert(serviceStatusDictionary);
Company company = new Company();
company.setId(companyId);
company.setWorkflowStatus(WorkflowStatus.Active.getKey());
companyImdg.insert(company);
AccountTypeDictionary accountTypeDictionary = new AccountTypeDictionary();
accountTypeDictionary.setCode(AccountType.Corr.getKey());
accountTypeDictionary.setName(AccountType.Corr.getKey());
accountTypeDictionaryImdg.insert(accountTypeDictionary);
ClearingMemberCategory clearingMemberCategory = new ClearingMemberCategory();
clearingMemberCategory.setClearingMemberCategory(ClearingCategory.B.getKey());
clearingMemberCategory.setCompanyId(companyId);
clearingMemberCategoryImdg.insert(clearingMemberCategory);
Relation relation = new Relation();
relation.setId(relationId);
relation.setConsumerId(companyId);
relation.setService(Service.MKR.getKey());
relationImdg.insert(relation);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
}
@Test
void accountCorrespondentNew() {
String uniqueAccount = account + UUID.randomUUID();
CorrespondentAccountNewRequest correspondentAccountNewRequest = new CorrespondentAccountNewRequest();
correspondentAccountNewRequest.setAccount(uniqueAccount);
correspondentAccountNewRequest.setAccountType(AccountType.Corr.getKey());
correspondentAccountNewRequest.setCompanyId(companyId);
correspondentAccountNewRequest.setStatus(ServiceStatus.Active.getKey());
Account predictableAccount = new Account();
predictableAccount.setAccount(uniqueAccount);
predictableAccount.setAccountType(AccountType.Corr.getKey());
predictableAccount.setCompanyId(companyId);
predictableAccount.setStatus(ServiceStatus.Active.getKey());
predictableAccount.setRelationId(relationId);
String jsonString = getJsonStringForNew(correspondentAccountNewRequest, 0L);
addRecordToKafka((MockConsumer) accountService.getConsumer(),
Consts.DESTINATION_CORRESPONDENT_ACCOUNT_NEW,
PARTITION,
0,
jsonString);
waitingSendAndCheckRecord(0L, mockProducer);
Account resultNew = accountImdg.getCollectionObjectsByFieldValues(Map.of("account", uniqueAccount)).iterator().next();
predictableAccount.setId(resultNew.getId());
predictableAccount.setUpdated(resultNew.getUpdated());
predictableAccount.setCreated(resultNew.getCreated());
ACCOUNT_MATCHER.assertMatch(resultNew, predictableAccount);
accountImdg.delete(resultNew);
}
@Test
void accountCorrespondentUpdate() {
Account existAccount = new Account();
existAccount.setAccount(account);
existAccount.setAccountType(AccountType.Corr.getKey());
existAccount.setStatus(ServiceStatus.Closed.getKey());
existAccount.setCompanyId(companyId);
Long accountId = accountImdg.insert(existAccount);
CorrespondentAccountUpdateRequest correspondentAccountUpdateRequest = new CorrespondentAccountUpdateRequest();
correspondentAccountUpdateRequest.setAccount(account);
correspondentAccountUpdateRequest.setAccountType(AccountType.Corr.getKey());
correspondentAccountUpdateRequest.setStatus(ServiceStatus.Active.getKey());
correspondentAccountUpdateRequest.setCompanyId(companyId);
correspondentAccountUpdateRequest.setId(accountId);
String jsonString = getJsonStringForUpdate(correspondentAccountUpdateRequest, 0);
//ACT
addRecordToKafka((MockConsumer) accountService.getConsumer(),
Consts.DESTINATION_CORRESPONDENT_ACCOUNT_UPDATE,
PARTITION,
0,
jsonString);
//ASSERT
waitingSendAndCheckRecord(0L, mockProducer);
Account resultUpdating = accountImdg.getSingleObjectByID(accountId);
Account expectAccount = new Account();
expectAccount.setId(existAccount.getId());
expectAccount.setAccount(account);
expectAccount.setAccountType(AccountType.Corr.getKey());
expectAccount.setStatus(ServiceStatus.Closed.getKey());
expectAccount.setCompanyId(companyId);
expectAccount.setCreated(existAccount.getCreated());
expectAccount.setUpdated(resultUpdating.getUpdated());
expectAccount.setStatus(ServiceStatus.Active.getKey());
ACCOUNT_MATCHER.assertMatch(resultUpdating, expectAccount);
accountImdg.delete(resultUpdating);
}
@Test
void accountCorrespondentBlock() {
Account existAccount = new Account();
existAccount.setAccount(account);
existAccount.setAccountType(AccountType.Corr.getKey());
existAccount.setStatus(ServiceStatus.Active.getKey());
existAccount.setCompanyId(companyId);
Long accountId = accountImdg.insert(existAccount);
CommonDeleteRequest commonDeleteRequest = new CommonDeleteRequest();
commonDeleteRequest.setId(accountId);
String jsonString = getJsonStringForDelete(commonDeleteRequest, 0);
//ACT
addRecordToKafka((MockConsumer) accountService.getConsumer(),
Consts.DESTINATION_CORRESPONDENT_ACCOUNT_BLOCK,
PARTITION,
0,
jsonString);
//ASSERT
waitingSendAndCheckRecord(0L, mockProducer);
Account resultBlock = accountImdg.getSingleObjectByID(accountId);
existAccount.setStatus(ServiceStatus.Blocked.getKey());
existAccount.setUpdated(resultBlock.getUpdated());
ACCOUNT_MATCHER.assertMatch(existAccount, resultBlock);
accountImdg.delete(resultBlock);
}
}

View file

@ -0,0 +1,164 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.producer.Producer;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import ru.clearing.classes.statics.data.account.*;
import ru.spcex.clearing.account.config.BeanConfiguration;
import ru.spcex.clearing.account.config.validation.AccountSymbolsValidationConfig;
import ru.spcex.clearing.account.config.validation.ValidationConfig;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.AccountSymbolsNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.test.MatcherFactory;
import ru.spcex.clearing.test.TestObjectCreator;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator;
import static ru.spcex.clearing.test.TestUtils.*;
import static ru.spcex.clearing.test.config.KafkaTestConfig.setMockFuture;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
BeanConfiguration.class,
ValidationConfig.class,
AccountSymbolsValidationConfig.class,
AccountSymbolsService.class,
ImdgTestConfig.class,
KafkaTestConfig.class})
class AccountSymbolsServiceTest {
public static final MatcherFactory.Matcher<AccountSymbols> ACCOUNT_SYMBOL_MATCHER = usingIgnoringFieldsComparator();
private static final int PARTITION = 0;
@Autowired
AccountSymbolsService accountSymbolsService;
@Autowired
@Qualifier("hazelcastServiceTest")
private ImdgProvider hazelcastServiceTest;
@Autowired
@Qualifier("mockProducer")
protected Producer<String, Object> mockProducer;
@Autowired
@Qualifier("kafkaTestTemplate")
protected KafkaTemplate<String, Object> kafkaTemplate;
private Imdg<AccountSymbols> accountSymbolsImdg;
private Imdg<Account> accountImdg;
private Long accountId;
private Imdg<ClearingAccount> clearingAccountImdg;
private Long clearingAccountId;
static int newRequestCnt = 0;
@PostConstruct
private void init() {
hazelcastServiceTest.waitAvailable();
accountSymbolsImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class
);
accountImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Account, Account.class
);
clearingAccountImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class
);
Account account = new Account();
account.setStatus(ServiceStatus.Active.getKey());
account.setAccountType(AccountType.Clrn.getKey());
accountId = accountImdg.insert(account);
ClearingAccount clearingAccount = new ClearingAccount();
clearingAccount.setAccountId(accountId);
clearingAccount.setClearingAccountType("CAT");
clearingAccountId = clearingAccountImdg.insert(clearingAccount);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
}
@PreDestroy
private void destroyTest() {
//clean test data
Account account = accountImdg.getSingleObjectByID(accountId);
if (account != null)
accountImdg.delete(account);
ClearingAccount clearingAccount = clearingAccountImdg.getSingleObjectByID(clearingAccountId);
if (clearingAccount != null)
clearingAccountImdg.delete(clearingAccount);
}
@Test
void tradingClearingRegistryNew_moneyAccount_clearingAccount() {
setMockFuture(kafkaTemplate);
AccountSymbolsNewRequest accountSymbolsNewRequest = new AccountSymbolsNewRequest();
accountSymbolsNewRequest.setAccountId(accountId);
accountSymbolsNewRequest.setAccountSymbolValue("SYMBOL1");
AccountSymbols predictableAccountSymbols = new AccountSymbols();
predictableAccountSymbols.setAccountId(accountId);
predictableAccountSymbols.setAccountSymbolValue("SYMBOL1");
String jsonString = getJsonStringForNew(accountSymbolsNewRequest, 0L);
addRecordToKafka((MockConsumer) accountSymbolsService.getConsumer(),
Consts.DESTINATION_DEPO_ACCOUNT_SYMBOLS_NEW,
newRequestCnt,
0,
jsonString);
waitingSendAndCheckRecord(0L, mockProducer);
AccountSymbols resultNew = accountSymbolsImdg.getAllValues().iterator().next();
predictableAccountSymbols.setId(resultNew.getId());
ACCOUNT_SYMBOL_MATCHER.assertMatch(resultNew, predictableAccountSymbols);
accountSymbolsImdg.delete(resultNew); // cleanup test
newRequestCnt++;
}
@Test
void tradingClearingRegistryDelete() {
AccountSymbols existAccountSymbols = new AccountSymbols();
existAccountSymbols.setAccountId(accountId);
existAccountSymbols.setAccountSymbolValue("SYMBOL 2");
Long accountSymbolId = accountSymbolsImdg.insert(existAccountSymbols);
CommonDeleteRequest accountSymbolsDeleteRequest = new CommonDeleteRequest();
accountSymbolsDeleteRequest.setId(accountSymbolId);
String jsonString = getJsonStringForDelete(accountSymbolsDeleteRequest, 0);
//ACT
addRecordToKafka((MockConsumer) accountSymbolsService.getConsumer(),
Consts.DESTINATION_DEPO_ACCOUNT_SYMBOLS_DELETE,
PARTITION,
0,
jsonString);
//ASSERT
waitingSendAndCheckRecord(0L, mockProducer);
AccountSymbols resultUpdating = accountSymbolsImdg.getSingleObjectByID(accountSymbolId);
Assertions.assertNull(resultUpdating, "Должен был удалиться");
}
}

View file

@ -0,0 +1,436 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.BankAccount;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.platform.dictionary.CurrencyCodeDictionary;
import ru.spcex.clearing.account.config.BeanConfiguration;
import ru.spcex.clearing.account.config.validation.AccountValidationConfig;
import ru.spcex.clearing.account.config.validation.BankAccountValidationConfig;
import ru.spcex.clearing.account.config.validation.ValidationConfig;
import ru.spcex.clearing.account.errors.AccountError;
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.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.test.MatcherFactory.Matcher;
import ru.spcex.clearing.test.TestObjectCreator;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import javax.annotation.PostConstruct;
import java.util.concurrent.atomic.AtomicInteger;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
import static ru.spcex.clearing.platform.messaging.service.Status.Error;
import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator;
import static ru.spcex.clearing.test.TestUtils.*;
import static ru.spcex.clearing.test.config.KafkaTestConfig.getCaptor;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
AccountHelper.class,
BankAccountService.class,
ValidationConfig.class,
BankAccountValidationConfig.class,
AccountValidationConfig.class,
BeanConfiguration.class,
ImdgTestConfig.class,
KafkaTestConfig.class})
public class BankAccountServiceTest {
public static final Matcher<BankAccount> BANK_ACCOUNT_MATCHER = usingIgnoringFieldsComparator();
public static final Matcher<Account> ACCOUNT_MATCHER = usingIgnoringFieldsComparator();
public static final Matcher<BaseRequest<Object>> BASE_REQUEST_MATCHER = usingIgnoringFieldsComparator();
private static final int PARTITION = 0;
private static final String TOPIC_ACCOUNT_NEW = Consts.DESTINATION_BANK_ACCOUNT_NEW;
private static final String TOPIC_ACCOUNT_UPDATE = Consts.DESTINATION_BANK_ACCOUNT_UPDATE;
private static final String TOPIC_ACCOUNT_DELETE = Consts.DESTINATION_BANK_ACCOUNT_BLOCK;
private static final Long ID = 0L;
private static final AtomicInteger countRun = new AtomicInteger(1);
private static final Long accountId = 12L;
private static final String currency = "RUB";
private static final String bankIdentificationCode = "99999";
private static final String bankName = "ooo tinkoff";
private static final String destination = "OOO ROGA I KOPITA";
private static final String correspondentAccount = "9294189285498598598";
private static final String correspondentAccountName = "BIK OF TINKOFF";
private static final String taxpayerIdentificationNumber = "848484848484";
private static final String taxRegistrationReasonCode = "886886";
protected final Long addresseeIdNew = 2L;
protected final String deal = "111111111";
private final String acc = "0123456789";
protected Imdg<Company> companyImdg;
private Imdg<BankAccount> bankAccountImdg;
private Imdg<Account> accountImdg;
private Imdg<CurrencyCodeDictionary> currencyCodeDictionaryImdg;
private Imdg<ClearingMemberCategory> clearingMemberCategoryImdg;
private Imdg<Relation> relationImdg;
@Autowired
private IMessageResolver messageResolver;
@Autowired
@Qualifier("hazelcastServiceTest")
private ImdgProvider hazelcastServiceTest;
@Autowired
private BankAccountService bankAccountService;
@Autowired
@Qualifier("mockProducer")
protected Producer<String, Object> mockProducer;
@PostConstruct
private void init() {
hazelcastServiceTest.waitAvailable();
companyImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Company, Company.class);
bankAccountImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_BankAccount, BankAccount.class);
accountImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Account, Account.class);
currencyCodeDictionaryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_CurrencyCodeDictionary, CurrencyCodeDictionary.class
);
clearingMemberCategoryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class
);
relationImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Relation, Relation.class
);
CurrencyCodeDictionary currencyCodeDictionary = new CurrencyCodeDictionary();
currencyCodeDictionary.setCode("RUB");
currencyCodeDictionary.setName("RUB");
currencyCodeDictionaryImdg.insert(currencyCodeDictionary);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
}
/**
* {@link BankAccountService#bankAccountNew(BaseRequest request)}<br>
* Тест проверяет генерацию сущности {@link BankAccount} в Hazelcast при передаче из Apache Kafka.<br>
* Входной запрос {@link BankAccountNewRequest}:<br>
* {@link BankAccountNewRequest#bankIdentificationCode} - 99999<br>
* {@link BankAccountNewRequest#bankName} - ооо тинькофф<br>
* {@link BankAccountNewRequest#correspondentAccount} - 9294189285498598598<br>
* {@link BankAccountNewRequest#correspondentAccountName} - BIK OF<br>
* {@link BankAccountNewRequest#currency} - RUB<br>
* {@link BankAccountNewRequest#destination} - OOO ROGA I KOPITA<br>
* {@link BankAccountNewRequest#taxpayerIdentificationNumber} - 848484848484<br>
* {@link BankAccountNewRequest#taxRegistrationReasonCode} - 886886<br>
* {@link BankAccountNewRequest#account} - 123456789123<br>
*/
@Test
public void bankAccountNew() {
//ARRANGE
BankAccount predictableBankAccount = getBankAccount();
Company company = getTestCompany();
Long companyId = companyImdg.insert(company);
Long relationId = 777L;
Account predictableAccount = getTestAccount(accountId, acc);
predictableAccount.setProcessingSign(null);
predictableAccount.setCompanyId(companyId);
predictableAccount.setRelationId(relationId);
clearImdg(accountImdg);
ClearingMemberCategory clearingMemberCategory = new ClearingMemberCategory();
clearingMemberCategory.setClearingMemberCategory(ClearingCategory.B.getKey());
clearingMemberCategory.setCompanyId(companyId);
clearingMemberCategoryImdg.insert(clearingMemberCategory);
Relation relation = new Relation();
relation.setId(relationId);
relation.setConsumerId(companyId);
relation.setService(Service.MKR.getKey());
relationImdg.insert(relation);
BankAccountNewRequest bankAccountNewRequest = getBankAccountNewRequest(predictableBankAccount);
String jsonString = getJsonStringForNew(bankAccountNewRequest, ID);
//ACT
addRecordToKafka((MockConsumer) bankAccountService.getConsumer(), TOPIC_ACCOUNT_NEW, PARTITION, 0, jsonString);
waitingSendAndCheckRecord(ID, mockProducer);
Account accountResult = accountImdg.getFirstObjectBySQL(String.format("account = %s", acc));
BankAccount bankAccountResult = bankAccountImdg.getFirstObjectBySQL(String.format("account = %s or companyId = %s", acc, addresseeIdNew));
predictableBankAccount.setAccountId(accountResult.getId());
predictableBankAccount.setId(bankAccountResult.getId());
setSameValueToField(accountResult, predictableAccount);
//ASSERT
BANK_ACCOUNT_MATCHER.assertMatch(bankAccountResult, predictableBankAccount);
ACCOUNT_MATCHER.assertMatch(accountResult, predictableAccount);
}
/**
* {@link BankAccountService#bankAccountNew(BaseRequest request)}<br>
* Тест проверяет валидацию.<br>
* Входной запрос {@link BankAccountNewRequest}:<br>
* {@link BankAccountNewRequest#bankIdentificationCode} - 99999<br>
* {@link BankAccountNewRequest#bankName} - ооо тинькофф<br>
* {@link BankAccountNewRequest#correspondentAccount} - 9294189285498598598<br>
* {@link BankAccountNewRequest#correspondentAccountName} - BIK OF<br>
* {@link BankAccountNewRequest#currency} - RUB<br>
* {@link BankAccountNewRequest#destination} - OOO ROGA I KOPITA<br>
* {@link BankAccountNewRequest#taxpayerIdentificationNumber} - 848484848484<br>
* {@link BankAccountNewRequest#taxRegistrationReasonCode} - 886886<br>
* {@link BankAccountNewRequest#account} - 123456789123<br>
*/
@Test
public void validatedBankAccountNew() {
clearImdg(accountImdg);
BankAccount predictableBankAccount = getBankAccount();
Company company = getTestCompany();
companyImdg.insert(company);
BankAccountNewRequest bankAccountNewRequest = getBankAccountNewRequest(predictableBankAccount);
String errMsg;
//AccountValidationRule.RequiredFields
//WrongFieldValue
bankAccountNewRequest.setCurrency(null);
errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "null, currency"));
checkError(errMsg, bankAccountNewRequest);
bankAccountNewRequest.setCurrency("TT0");
errMsg = messageResolver.resolve(new EnumMessage(AccountError.DictionaryNotFound, "TT0, CurrencyCodeDictionary"));
checkError(errMsg, bankAccountNewRequest);
bankAccountNewRequest.setCurrency(currency);
bankAccountNewRequest.setBankIdentificationCode(null);
errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "bankIdentificationCode"));
checkError(errMsg, bankAccountNewRequest);
bankAccountNewRequest.setBankIdentificationCode(bankIdentificationCode);
bankAccountNewRequest.setBankName(null);
errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "bankName"));
checkError(errMsg, bankAccountNewRequest);
bankAccountNewRequest.setBankName(bankName);
bankAccountNewRequest.setAccount(null);
errMsg = messageResolver.resolve(new EnumMessage(AccountError.RequiredFieldEmpty, "account"));
checkError(errMsg, bankAccountNewRequest);
bankAccountNewRequest.setAccount(acc);
//AccountValidationRule.CompanyPresent
//CompanyNotFound
bankAccountNewRequest.setCompanyId(999924535239L);
errMsg = messageResolver.resolve(new EnumMessage(AccountError.CompanyNotFound, bankAccountNewRequest.getCompanyId()+", companyId"));
checkError(errMsg, bankAccountNewRequest);
bankAccountNewRequest.setCompanyId(company.getId());
//AccountValidationRule.AccountIsNew
//AccountAlreadyExist
Account existAccount = getTestAccount(accountId, acc);
accountImdg.insert(existAccount);
errMsg = messageResolver.resolve(new EnumMessage(AccountError.AccountAlreadyExist, existAccount.getAccount()));
checkError(errMsg, bankAccountNewRequest);
accountImdg.delete(existAccount);
}
private void checkError(String errorMsg, BankAccountNewRequest bankAccountNewRequest) {
//ARRANGE
int currentTime = countRun.getAndIncrement();
long currentOffset = currentTime;
BaseRequest<Object> predictableBaseRequest = new BaseRequest<>();
predictableBaseRequest.setId(ID);
predictableBaseRequest.setActionType(ActionType.SYSTEM);
RequestInfoUpdate requestInfoUpdate = new RequestInfoUpdate();
requestInfoUpdate.setId(ID);
requestInfoUpdate.setStatus(Error);
requestInfoUpdate.setMessage(errorMsg);
predictableBaseRequest.setRequestPayload(requestInfoUpdate);
String jsonString = getJsonStringForNew(bankAccountNewRequest, ID);
//ACT
addRecordToKafka((MockConsumer) bankAccountService.getConsumer(), TOPIC_ACCOUNT_NEW, PARTITION, currentOffset, jsonString);
ArgumentCaptor<ProducerRecord> producerRecord = getCaptor(mockProducer);
//waiting for kafka producer send message (finale event)
verify(mockProducer, timeout(30_000L).times(currentTime))
.send(producerRecord.capture());
BaseRequest<Object> baseRequestResult = (BaseRequest<Object>) producerRecord.getValue().value();
//ASSERT
assertEquals(Consts.REQUEST_INFO_UPDATE, producerRecord.getValue().topic());
BASE_REQUEST_MATCHER.assertMatch(baseRequestResult, predictableBaseRequest);
}
/**
* {@link BankAccountService#bankAccountUpdate(BaseRequest)}<br>
* Тест проверяет обновление сущности {@link BankAccount} в Hazelcast при передаче из Apache Kafka.<br>
* Входной запрос {@link BankAccountUpdateRequest}:<br>
* {@link BankAccountUpdateRequest#bankIdentificationCode} - NEW BUNK NAME<br>
* {@link BankAccountUpdateRequest#bankName} - 88888<br>
* {@link BankAccountUpdateRequest#correspondentAccount} - 894984646541316<br>
* {@link BankAccountUpdateRequest#correspondentAccountName} - BIK OF NEW BUNK<br>
* {@link BankAccountUpdateRequest#currency} - EU<br>
* {@link BankAccountUpdateRequest#destination} - OOO NEW BUNK<br>
* {@link BankAccountUpdateRequest#taxpayerIdentificationNumber} - 65468461321<br>
* {@link BankAccountUpdateRequest#taxRegistrationReasonCode} - 532137<br>
* {@link BankAccountUpdateRequest#account} - 326984656514<br>
*/
@Test
void bankAccountUpdate() {
clearImdg(accountImdg);
//ARRANGE
// Company company = getTestCompany();
// companyImdg.insert(company);
Account predictableAccount = getTestAccount(accountId, acc);
accountImdg.insert(predictableAccount);
BankAccount bankAccountExists = getBankAccount();
bankAccountImdg.insert(bankAccountExists);
BankAccount predictableUpdateBankAccount = new BankAccount();
predictableUpdateBankAccount.setBankName("NEW BUNK NAME");
predictableUpdateBankAccount.setBankIdentificationCode("88888");
predictableUpdateBankAccount.setCorrespondentAccount("894984646541316");
predictableUpdateBankAccount.setCorrespondentAccountName("BIK OF NEW BUNK");
predictableUpdateBankAccount.setCurrency("RUB");
predictableUpdateBankAccount.setDestination("OOO NEW BUNK");
predictableUpdateBankAccount.setTaxpayerIdentificationNumber("65468461321");
predictableUpdateBankAccount.setTaxRegistrationReasonCode("532137");
predictableUpdateBankAccount.setAccount(acc);
predictableUpdateBankAccount.setId(ID);
BankAccountUpdateRequest bankAccountUpdateRequest = new BankAccountUpdateRequest();
bankAccountUpdateRequest.setId(predictableUpdateBankAccount.getId());
bankAccountUpdateRequest.setBankName(predictableUpdateBankAccount.getBankName());
bankAccountUpdateRequest.setBankIdentificationCode(predictableUpdateBankAccount.getBankIdentificationCode());
bankAccountUpdateRequest.setCorrespondentAccount(predictableUpdateBankAccount.getCorrespondentAccount());
bankAccountUpdateRequest.setCorrespondentAccountName(predictableUpdateBankAccount.getCorrespondentAccountName());
bankAccountUpdateRequest.setCurrency(predictableUpdateBankAccount.getCurrency());
bankAccountUpdateRequest.setDestination(predictableUpdateBankAccount.getDestination());
bankAccountUpdateRequest.setTaxpayerIdentificationNumber(predictableUpdateBankAccount.getTaxpayerIdentificationNumber());
bankAccountUpdateRequest.setTaxRegistrationReasonCode(predictableUpdateBankAccount.getTaxRegistrationReasonCode());
bankAccountUpdateRequest.setAccount(predictableUpdateBankAccount.getAccount());
String jsonString = getJsonStringForUpdate(bankAccountUpdateRequest, ID);
//ACT
addRecordToKafka((MockConsumer) bankAccountService.getConsumer(), TOPIC_ACCOUNT_UPDATE, PARTITION, 0, jsonString);
//ASSERT
waitingSendAndCheckRecord(ID, mockProducer);
Account accountResult = accountImdg.getSingleObjectByID(predictableAccount.getId());
BankAccount resultUpdating = bankAccountImdg.getSingleObjectByID(predictableUpdateBankAccount.getId());
predictableAccount.setUpdated(accountResult.getUpdated());
predictableUpdateBankAccount.setAccountId(resultUpdating.getAccountId());
predictableUpdateBankAccount.setCompanyId(resultUpdating.getCompanyId());
BANK_ACCOUNT_MATCHER.assertMatch(resultUpdating, predictableUpdateBankAccount);
ACCOUNT_MATCHER.assertMatch(accountResult, predictableAccount);
}
/**
* {@link BankAccountService#bankAccountBlock(BaseRequest)}
* Тест проверяет удаление сущности {@link BankAccount} в Hazelcast при передаче из Apache Kafka.
* Входной запрос {@link CommonDeleteRequest}:
* {@link CommonDeleteRequest#id} - Идентификатор записи
*/
@Test
void bankAccountBlock() {
//ARRANGE
BankAccount bankAccountExists = getBankAccount();
bankAccountImdg.insert(bankAccountExists);
Account account = new Account();
account.setId(accountId);
account.setStatus(WorkflowStatus.Active.getKey());
accountImdg.insert(account);
CommonDeleteRequest commonDeleteRequest = new CommonDeleteRequest();
commonDeleteRequest.setId(ID);
String jsonString = getJsonStringForDelete(commonDeleteRequest, ID);
//ACT
addRecordToKafka((MockConsumer) bankAccountService.getConsumer(), TOPIC_ACCOUNT_DELETE, PARTITION, 0, jsonString);
//ASSERT
waitingSendAndCheckRecord(ID, mockProducer);
Account bankAccount = accountImdg.getSingleObjectByID(accountId);
assertEquals(bankAccount.getStatus(), WorkflowStatus.Blocked.getKey());
}
private Company getTestCompany() {
Company company = new Company();
company.setId(addresseeIdNew);
company.setWorkflowStatus(Status.Active.getKey());
company.setTradingCode(deal);
company.setShortName("ShortName");
company.setFullName("FullName");
return company;
}
private Account getTestAccount(Long id, String acc) {
Account account = new Account();
account.setId(id);
account.setAccount(acc);
account.setAccountType(AccountType.Bank.getKey());
account.setStatus(Status.Active.getKey());
account.setProcessingSign(Allowed.ALLOWED.getKey());
return account;
}
private void setSameValueToField(Account from, Account to) {
to.setCreated(from.getCreated());
to.setUpdated(from.getUpdated());
to.setId(from.getId());
}
private BankAccount getBankAccount() {
BankAccount bankAccount = new BankAccount();
bankAccount.setAccountId(accountId);
bankAccount.setAccount(acc);
bankAccount.setCompanyId(addresseeIdNew);
bankAccount.setId(ID);
bankAccount.setBankName(bankName);
bankAccount.setBankIdentificationCode(bankIdentificationCode);
bankAccount.setCorrespondentAccount(correspondentAccount);
bankAccount.setCorrespondentAccountName(correspondentAccountName);
bankAccount.setCurrency(currency);
bankAccount.setDestination(destination);
bankAccount.setTaxpayerIdentificationNumber(taxpayerIdentificationNumber);
bankAccount.setTaxRegistrationReasonCode(taxRegistrationReasonCode);
return bankAccount;
}
private BankAccountNewRequest getBankAccountNewRequest(BankAccount bankAccount) {
BankAccountNewRequest bankAccountNewRequest = new BankAccountNewRequest();
bankAccountNewRequest.setBankName(bankAccount.getBankName());
bankAccountNewRequest.setBankIdentificationCode(bankAccount.getBankIdentificationCode());
bankAccountNewRequest.setCorrespondentAccount(bankAccount.getCorrespondentAccount());
bankAccountNewRequest.setCorrespondentAccountName(bankAccount.getCorrespondentAccountName());
bankAccountNewRequest.setCurrency(bankAccount.getCurrency());
bankAccountNewRequest.setDestination(bankAccount.getDestination());
bankAccountNewRequest.setTaxpayerIdentificationNumber(bankAccount.getTaxpayerIdentificationNumber());
bankAccountNewRequest.setTaxRegistrationReasonCode(bankAccount.getTaxRegistrationReasonCode());
bankAccountNewRequest.setAccount(bankAccount.getAccount());
bankAccountNewRequest.setCompanyId(bankAccount.getCompanyId());
return bankAccountNewRequest;
}
}

View file

@ -0,0 +1,290 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.producer.Producer;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.platform.dictionary.AccountTypeDictionary;
import ru.clearing.platform.dictionary.ClearingAccountTypeDictionary;
import ru.spcex.clearing.account.config.BeanConfiguration;
import ru.spcex.clearing.account.config.validation.AccountValidationConfig;
import ru.spcex.clearing.account.config.validation.ClearingAccountValidationConfig;
import ru.spcex.clearing.account.config.validation.ValidationConfig;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClearingAccountUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf01Request;
import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdfRequestPart;
import ru.spcex.clearing.test.MatcherFactory;
import ru.spcex.clearing.test.TestObjectCreator;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.iml.hazelcast.adapter.ImdgHazelcast;
import javax.annotation.PostConstruct;
import java.util.Collections;
import java.util.Map;
import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator;
import static ru.spcex.clearing.test.TestUtils.*;
import static ru.spcex.clearing.test.config.ImdgTestConfig.currentID;
import static ru.spcex.clearing.test.config.KafkaTestConfig.setMockFuture;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
BeanConfiguration.class,
ValidationConfig.class,
ClearingAccountValidationConfig.class,
AccountValidationConfig.class,
AccountHelper.class,
ClearingAccountService.class,
SDFProcessService.class,
ImdgTestConfig.class,
KafkaTestConfig.class})
class ClearingAccountServiceTest {
public static final MatcherFactory.Matcher<ClearingAccount> CLEARING_ACCOUNT_MATCHER = usingIgnoringFieldsComparator();
public static final MatcherFactory.Matcher<Account> ACCOUNT_MATCHER = usingIgnoringFieldsComparator("created", "updated");
private static final int PARTITION = 0;
private static final Long companyId = 0L;
private static final Long relationId = 0L;
private static final String CLEARING_ACCOUNT_TYPE_DICT = "A";
private static final String ACCOUNT_VALUE = "account-value";
private static final String TRADING_CODE = "trading-code";
@Autowired
ClearingAccountService clearingAccountService;
@Autowired
@Qualifier("hazelcastServiceTest")
private ImdgProvider hazelcastServiceTest;
@Autowired
@Qualifier("mockProducer")
protected Producer<String, Object> mockProducer;
@Autowired
@Qualifier("kafkaTestTemplate")
protected KafkaTemplate<String, Object> kafkaTemplate;
private Imdg<ClearingAccount> clearingAccountImdg;
private Imdg<Account> accountImdg;
private Imdg<Company> companyImdg;
private Imdg<ClearingAccountTypeDictionary> clearingAccountTypeDictionaryImdg;
private Imdg<AccountTypeDictionary> accountTypeDictionaryImdg;
private Imdg<ClearingMemberCategory> clearingMemberCategoryImdg;
private Imdg<Relation> relationImdg;
@PostConstruct
private void init() {
hazelcastServiceTest.waitAvailable();
clearingAccountImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class
);
accountImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Account, Account.class
);
companyImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Company, Company.class
);
accountTypeDictionaryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class
);
clearingAccountTypeDictionaryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ClearingAccountTypeDictionary, ClearingAccountTypeDictionary.class
);
clearingMemberCategoryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class
);
relationImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Relation, Relation.class
);
Company company = new Company();
company.setId(companyId);
company.setWorkflowStatus(WorkflowStatus.Active.getKey());
company.setTradingCode(TRADING_CODE);
companyImdg.insert(company);
AccountTypeDictionary accountTypeDictionary = new AccountTypeDictionary();
accountTypeDictionary.setCode(AccountType.Clrn.getKey());
accountTypeDictionary.setName(AccountType.Clrn.getKey());
accountTypeDictionaryImdg.insert(accountTypeDictionary);
ClearingAccountTypeDictionary clearingAccountTypeDictionary = new ClearingAccountTypeDictionary();
clearingAccountTypeDictionary.setName(CLEARING_ACCOUNT_TYPE_DICT);
clearingAccountTypeDictionary.setCode(CLEARING_ACCOUNT_TYPE_DICT);
clearingAccountTypeDictionaryImdg.insert(clearingAccountTypeDictionary);
ClearingMemberCategory clearingMemberCategory = new ClearingMemberCategory();
clearingMemberCategory.setClearingMemberCategory(ClearingCategory.B.getKey());
clearingMemberCategory.setCompanyId(companyId);
clearingMemberCategoryImdg.insert(clearingMemberCategory);
Relation relation = new Relation();
relation.setId(relationId);
relation.setConsumerId(companyId);
relation.setService(Service.MKR.getKey());
relationImdg.insert(relation);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
}
@Test
void clearingAccountNew() {
ClearingAccountNewRequest clearingAccountNewRequest = new ClearingAccountNewRequest();
clearingAccountNewRequest.setAccount(ACCOUNT_VALUE);
clearingAccountNewRequest.setCompanyId(companyId);
clearingAccountNewRequest.setClearingAccountType(CLEARING_ACCOUNT_TYPE_DICT);
String jsonString = getJsonStringForNew(clearingAccountNewRequest, 0L);
addRecordToKafka((MockConsumer) clearingAccountService.getConsumer(),
Consts.DESTINATION_CLEARING_ACCOUNT_NEW,
PARTITION,
0,
jsonString);
waitingSendAndCheckRecord(0L, mockProducer);
Account predictableAccount = new Account();
predictableAccount.setAccount(ACCOUNT_VALUE);
predictableAccount.setAccountType(AccountType.Clrn.getKey());
predictableAccount.setStatus(ServiceStatus.Active.getKey());
predictableAccount.setRelationId(relationId);
predictableAccount.setCompanyId(companyId);
ClearingAccount predictableClearingAccount = new ClearingAccount();
predictableClearingAccount.setCompanyId(companyId);
predictableClearingAccount.setClearingAccountType(CLEARING_ACCOUNT_TYPE_DICT);
Account resultAccountNew = accountImdg.getFirstObjectByFieldValues(Map.of("accountType", AccountType.Clrn.getKey()));
ClearingAccount resultClearingAccountNew = clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", resultAccountNew.getId()));
predictableAccount.setId(resultAccountNew.getId());
predictableClearingAccount.setAccountId(resultAccountNew.getId());
predictableClearingAccount.setId(resultClearingAccountNew.getId());
ACCOUNT_MATCHER.assertMatch(resultAccountNew, predictableAccount);
CLEARING_ACCOUNT_MATCHER.assertMatch(resultClearingAccountNew, predictableClearingAccount);
clearingAccountImdg.delete(resultClearingAccountNew);
accountImdg.delete(resultAccountNew);
}
@Test
void clearingAccountUpdate() {
Account existAccount = new Account();
existAccount.setAccount(ACCOUNT_VALUE);
existAccount.setStatus(ServiceStatus.Active.getKey());
existAccount.setAccountType(AccountType.Clrn.getKey());
Long accountId = accountImdg.insert(existAccount);
ClearingAccount existClearingAccount = new ClearingAccount();
existClearingAccount.setAccountId(accountId);
existClearingAccount.setClearingAccountType(CLEARING_ACCOUNT_TYPE_DICT);
existClearingAccount.setCompanyId(companyId);
Account predictableAccount = new Account();
predictableAccount.setAccount(ACCOUNT_VALUE);
predictableAccount.setStatus(ServiceStatus.Blocked.getKey());
predictableAccount.setAccountType(AccountType.Clrn.getKey());
clearingAccountImdg.insert(existClearingAccount);
ClearingAccountUpdateRequest clearingAccountUpdateRequest = new ClearingAccountUpdateRequest();
clearingAccountUpdateRequest.setAccount(ACCOUNT_VALUE);
clearingAccountUpdateRequest.setStatus(0);
clearingAccountUpdateRequest.setDeal(TRADING_CODE);
String jsonString = getJsonStringForUpdate(clearingAccountUpdateRequest, 0L);
addRecordToKafka((MockConsumer) clearingAccountService.getConsumer(), Consts.DESTINATION_CLEARING_ACCOUNT_UPDATE, PARTITION, 0, jsonString);
waitingSendAndCheckRecord(0L, mockProducer);
Account accountResult = accountImdg.getSingleObjectByID(accountId);
predictableAccount.setId(accountResult.getId());
predictableAccount.setUpdated(accountResult.getUpdated());
ACCOUNT_MATCHER.assertMatch(accountResult, predictableAccount);
}
@Test
void makeSdfErrorText() {
Assertions.assertEquals("013", clearingAccountService.makeSdfErrorText(AccountError.CompanyNotFound, SDFProcessService.SDF_STATUS_ERROR_COMPANY_NOT_FOUND));
Assertions.assertEquals("2", clearingAccountService.makeSdfErrorText(null, SDFProcessService.SDF_STATUS_ERROR_COMPANY_NOT_FOUND));
}
/**
* {@link ClearingAccountService#accountNewSdf01(BaseRequest)}<br>
* Тест проверяет создание сущности {@link BaseRequest} в Hazelcast при передаче из Apache Kafka.<br>
* Входной запрос {@link AccountSdf01Request}:<br>
* {@link AccountSdfRequestPart#setSdfId} - текущий Id<br>
* {@link AccountSdfRequestPart#setAccount} - 123456789123<br>
* {@link AccountSdfRequestPart#setCompanyId} - текущий Id<br>
* {@link AccountSdf01Request#setGroupingSdf01Id} - текущий Id<br>
* {@link AccountSdf01Request#setAccounts} - Collections.singletonList(AccountSdfRequestPart)<br>
*/
@Test
void accountSdf01New() throws InterruptedException {
//ARRANGE
clearImdg(accountImdg);
setMockFuture(kafkaTemplate);
Long firstID = currentID.getAndIncrement();
Long secondID = currentID.getAndIncrement();
AccountSdfRequestPart accountSdfRequestPart = new AccountSdfRequestPart();
accountSdfRequestPart.setSdfId(firstID);
accountSdfRequestPart.setAccount(ACCOUNT_VALUE);
accountSdfRequestPart.setCompanyId(firstID);
AccountSdf01Request accountSdf01Request = new AccountSdf01Request();
accountSdf01Request.setGroupingSdf01Id(firstID);
accountSdf01Request.setAccounts(Collections.singletonList(accountSdfRequestPart));
String jsonString = getJsonStringForNew(accountSdf01Request, 0L);
Account predictableAccount = new Account();
predictableAccount.setAccount(ACCOUNT_VALUE);
predictableAccount.setCompanyId(firstID);
predictableAccount.setAccountType(AccountType.Clrn.getKey());
predictableAccount.setStatus(ServiceStatus.Active.getKey());
predictableAccount.setRelationId(relationId);
ClearingAccount predictableClearingAccount = new ClearingAccount();
predictableClearingAccount.setCompanyId(companyId);
// predictableClearingAccount.setClearingAccountType(CLEARING_ACCOUNT_TYPE_DICT);
//KAFKA
addRecordToKafka((MockConsumer) clearingAccountService.getConsumer(), Consts.ACCOUNT_NEW_SDF01, PARTITION, 0, jsonString);
waitingSendAndCheckRecord(0L, mockProducer);
ImdgHazelcast<Account> accountImdg = (ImdgHazelcast<Account>) hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Account, Account.class);
//ASSERT
Account accountResult = accountImdg.getSingleObjectBySQL(String.format("account = %s", ACCOUNT_VALUE));
ClearingAccount resultClearingAccountNew = clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", accountResult.getId()));
predictableAccount.setId(accountResult.getId());
predictableClearingAccount.setAccountId(accountResult.getId());
predictableClearingAccount.setId(resultClearingAccountNew.getId());
predictableAccount.setId(accountResult.getId());
ACCOUNT_MATCHER.assertMatch(accountResult, predictableAccount);
CLEARING_ACCOUNT_MATCHER.assertMatch(resultClearingAccountNew, predictableClearingAccount);
accountImdg.delete(accountResult);
}
}

View file

@ -0,0 +1,420 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.profile.CompanyInfo;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.platform.dictionary.*;
import ru.spcex.clearing.account.config.BeanConfiguration;
import ru.spcex.clearing.account.config.validation.ClientCodeValidationConfig;
import ru.spcex.clearing.account.config.validation.TradingClearingRegistryValidationConfig;
import ru.spcex.clearing.account.config.validation.ValidationConfig;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.test.MatcherFactory;
import ru.spcex.clearing.test.TestObjectCreator;
import ru.spcex.clearing.test.TestUtils;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
import javax.annotation.PostConstruct;
import static org.junit.jupiter.api.Assertions.*;
import static ru.spcex.clearing.test.TestUtils.waitingSendAndCheckRecord;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
ClientCodeService.class,
ClientCodeValidationConfig.class,
TradingClearingRegistryService.class,
TradingClearingRegistryValidationConfig.class,
ValidationConfig.class,
BeanConfiguration.class,
KafkaTestConfig.class,
ImdgTestConfig.class})
class ClientCodeServiceTest {
private static final int PARTITION = 0;
private static final Long ID = 4L;
public static final MatcherFactory.Matcher<ClientCode> CLIENT_CODE_MATCHER = MatcherFactory.usingIgnoringFieldsComparator("created", "updated");
private static final Long TCR_ID = 41L;
private static final Long COMPANY_ID = 42L;
@Autowired
ClientCodeService clientCodeService;
@Autowired
@Qualifier("hazelcastServiceTest")
private HazelcastService hazelcastServiceTest;
@Captor
private ArgumentCaptor<ProducerRecord> producerRecord;
@Autowired
@Qualifier("mockProducer")
protected Producer<String, Object> mockProducer;
private Imdg<ClientCode> clientCodeImdg;
// ****************************-*******************
@PostConstruct
private void init() {
hazelcastServiceTest.waitAvailable();
clientCodeImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
// Словари для теста, применяются в ValidationConfig
putToDictionary(IMDGDistributedNames.Map_WorkflowStatusDictionary, new WorkflowStatusDictionary(), "ACTV");
putToDictionary(IMDGDistributedNames.Map_CompanySymbolDictionary, new CompanySymbolDictionary(), "CLRC");
putToDictionary(IMDGDistributedNames.Map_CorporationSoleTypeDictionary, new CorporationSoleTypeDictionary(), "GDIR");
putToDictionary(IMDGDistributedNames.Map_CountryCodeDictionary, new CountryCodeDictionary(), "RUS");
putToDictionary(IMDGDistributedNames.Map_AllowedDictionary, new AllowedDictionary(), "ALWD");
putToDictionary(IMDGDistributedNames.Map_LegalKindDictionary, new LegalKindDictionary(), "JURD");
putToDictionary(IMDGDistributedNames.Map_OrganizationTypeDictionary, new OrganizationTypeDictionary(), "NCRD");
Imdg<Company> companyImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Company, Company.class);
Company company1 = new Company();
company1.setId(COMPANY_ID);
company1.setWorkflowStatus(WorkflowStatus.Active.getKey());
company1.setFullName("Company prime");
company1.setShortName("Seizwell");
company1.setProfile(new CompanyInfo());
company1.getProfile().setCompanyId(COMPANY_ID);
company1.getProfile().setCountryCode("TLDI");
company1.getProfile().setDescription("Big profit from TLD Company Prime.");
company1.getProfile().setLegalKind("TLDI");
company1.getProfile().setResidence("TLDI");
companyImdg.insert(company1);
Imdg<TradingClearingRegistry> tcrImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
TradingClearingRegistry registry1 = new TradingClearingRegistry();
registry1.setId(TCR_ID);
registry1.setCompanyId(COMPANY_ID);
registry1.setCode("code-120-101");
registry1.setMoneyAccountId(131L);
registry1.setDepoAccountId(132L);
registry1.setTradingClearingRegistryType(TradingClearingRegistryType.Client_B.getKey());
registry1.setStatus(WorkflowStatus.Active.getKey());
tcrImdg.insert(registry1);
Imdg<Account> accounts = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Account, Account.class);
Imdg<ClearingAccount> clsAccounts = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
Account moneyAccount = new Account();
moneyAccount.setId(131L);
moneyAccount.setAccount("AAAA-4444");
moneyAccount.setStatus("ACTV");
moneyAccount.setCompanyId(COMPANY_ID); // для валидации принадлежности счёта
accounts.insert(moneyAccount);
ClearingAccount clsAcc = new ClearingAccount();
clsAcc.setId(moneyAccount.getId());
clsAcc.setCompanyId(COMPANY_ID);
clsAcc.setAccountId(moneyAccount.getId());
clsAccounts.insert(clsAcc);
Imdg<DepoAccount> depoAccounts = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
Account depoAccount = new Account();
depoAccount.setId(132L);
depoAccount.setAccount("AAAB-44654");
depoAccount.setStatus("ACTV");
depoAccount.setCompanyId(COMPANY_ID); // для валидации принадлежности счёта
accounts.insert(depoAccount);
DepoAccount depoAcc = new DepoAccount();
depoAcc.setId(depoAccount.getId());
depoAcc.setCompanyId(COMPANY_ID);
depoAcc.setAccountId(depoAccount.getId());
depoAccounts.insert(depoAcc);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
}
private <D extends AbstractDictionary> void putToDictionary(String mapName, D object, String code) {
Imdg<D> dMap = (Imdg) hazelcastServiceTest.getImdg(mapName, object.getClass());
object.setId(2L);
object.setCode(code);
object.setName("name of " + code);
dMap.insert(object);
}
@Test
void selectTradingClearingRegistry() {
TradingClearingRegistry tcr = clientCodeService.selectTradingClearingRegistry(COMPANY_ID, 131L, 132L);
assertNotNull(tcr);
assertEquals(41L, tcr.getId());
tcr = clientCodeService.selectTradingClearingRegistry(COMPANY_ID, 131L, null);
assertNotNull(tcr);
assertEquals(41L, tcr.getId());
assertNull(clientCodeService.selectTradingClearingRegistry(0L, 131L, 132L));
assertNull(clientCodeService.selectTradingClearingRegistry(COMPANY_ID, 0L, 132L));
assertNull(clientCodeService.selectTradingClearingRegistry(COMPANY_ID, 131L, 0L));
}
/**
* {@link ClientCodeService#clientCodeUpdate(BaseRequest)}<br>
* Тест проверяет создание {@link ClientCode} в IMDG при передаче из Apache Kafka (очередь 1).<br>
* Входной запрос {@link ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest}:<br>
**/
@Test
void clientCodeNew1() {
//ARRANGE
final String ccCode = "Lucky planet";
ClientCodeNewRequest clientCodeNewRequest = new ClientCodeNewRequest();
clientCodeNewRequest.setCompanyId(COMPANY_ID);
clientCodeNewRequest.setCode(ccCode);
clientCodeNewRequest.setTradingClearingRegistryId(TCR_ID);
clientCodeNewRequest.setDepoAccountId(null);
clientCodeNewRequest.setMoneyAccountId(null);
clientCodeNewRequest.setStatus("ACTV");
ClientCode predictableClientCode = new ClientCode();
predictableClientCode.setCode(ccCode);
predictableClientCode.setStatus("ACTV");
predictableClientCode.setCompanyId(COMPANY_ID);
// predictableClientCode.setMoneyAccountId(131L);
// predictableClientCode.setDepoAccountId(132L);
// predictableClientCode.setTradingClearingRegistryId(TCR_ID);
//ACT
String jsonString = TestUtils.getJsonStringForNew(clientCodeNewRequest, ID);
TestUtils.addRecordToKafka((MockConsumer) clientCodeService.getConsumer(), Consts.DESTINATION_CLIENT_CODE_NEW, PARTITION, 0, jsonString);
//ASSERT
waitingSendAndCheckRecord(ID, mockProducer);
ClientCode resultNew = clientCodeImdg.getFirstObjectBySQL(String.format("code = '%s'", ccCode));
predictableClientCode.setId(resultNew.getId());
CLIENT_CODE_MATCHER.assertMatch(resultNew, predictableClientCode);
assertNotNull(resultNew.getCreated());
}
/**
* {@link ClientCodeService#clientCodeUpdate(BaseRequest)}<br>
* Тест проверяет создание {@link ClientCode} в IMDG при передаче из Apache Kafka (очередь 2).<br>
* Входной запрос {@link ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest}:<br>
**/
@Test
void clientCodeNew2() {
//ARRANGE
final String ccCode = "Lucky planet";
ClientCodeNewRequest clientCodeNewRequest = new ClientCodeNewRequest();
clientCodeNewRequest.setCompanyId(COMPANY_ID);
clientCodeNewRequest.setCode(ccCode);
clientCodeNewRequest.setTradingClearingRegistryId(TCR_ID);
clientCodeNewRequest.setDepoAccountId(null);
clientCodeNewRequest.setMoneyAccountId(null);
clientCodeNewRequest.setStatus("ACTV");
ClientCode predictableClientCode = new ClientCode();
predictableClientCode.setCode(ccCode);
predictableClientCode.setStatus("ACTV");
predictableClientCode.setCompanyId(COMPANY_ID);
// predictableClientCode.setMoneyAccountId(131L);
// predictableClientCode.setDepoAccountId(132L);
// predictableClientCode.setTradingClearingRegistryId(TCR_ID);
//ACT
String jsonString = TestUtils.getJsonStringForNew(clientCodeNewRequest, ID);
TestUtils.addRecordToKafka((MockConsumer) clientCodeService.getConsumer(), Consts.DESTINATION_CLIENT_CODE_NEW_UM_COMPANY, PARTITION, 0, jsonString);
//ASSERT
TestUtils.waitingSendAndCheckRecord(ID, mockProducer, producerRecord);
ClientCode resultNew = clientCodeImdg.getFirstObjectBySQL(String.format("code = '%s'", ccCode));
predictableClientCode.setId(resultNew.getId());
CLIENT_CODE_MATCHER.assertMatch(resultNew, predictableClientCode);
assertNotNull(resultNew.getCreated());
}
/**
* {@link ClientCodeService#clientCodeUpdate(BaseRequest)}<br>
* Тест проверяет создание {@link ClientCode} в IMDG при передаче из Apache Kafka (очередь 1).<br>
* NEW с заполненными MoneyAccountId(131L), DepoAccountId(132L); - от этого будет создан ТКР.
* Входной запрос {@link ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest}:<br>
**/
@Test
void clientCodeNew3() {
//ARRANGE
final String ccCode = "Lucky planet2";
ClientCodeNewRequest clientCodeNewRequest = new ClientCodeNewRequest();
clientCodeNewRequest.setCompanyId(COMPANY_ID);
clientCodeNewRequest.setCode(ccCode);
clientCodeNewRequest.setTradingClearingRegistryId(null);
clientCodeNewRequest.setMoneyAccountId(131L);
clientCodeNewRequest.setDepoAccountId(132L);
clientCodeNewRequest.setStatus("ACTV");
ClientCode predictableClientCode = new ClientCode();
predictableClientCode.setCode(ccCode);
predictableClientCode.setStatus("ACTV");
predictableClientCode.setCompanyId(COMPANY_ID);
predictableClientCode.setMoneyAccountId(131L);
predictableClientCode.setDepoAccountId(132L);
predictableClientCode.setTradingClearingRegistryId(TCR_ID);
//ACT
String jsonString = TestUtils.getJsonStringForNew(clientCodeNewRequest, ID);
TestUtils.addRecordToKafka((MockConsumer) clientCodeService.getConsumer(), Consts.DESTINATION_CLIENT_CODE_NEW, PARTITION, 0, jsonString);
//ASSERT
waitingSendAndCheckRecord(ID, mockProducer);
ClientCode resultNew = clientCodeImdg.getFirstObjectBySQL(String.format("code = '%s'", ccCode));
predictableClientCode.setId(resultNew.getId());
CLIENT_CODE_MATCHER.assertMatch(resultNew, predictableClientCode);
assertNotNull(resultNew.getCreated());
}
/**
* {@link ClientCodeService#clientCodeUpdate(BaseRequest)}<br>
* Тест проверяет обновление сущности {@link ClientCode} в IMDG при передаче из Apache Kafka.<br>
* Входной запрос {@link ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest}:<br>
**/
@Test
void clientCodeUpdate() {
//ARRANGE
ClientCode existsClientCode = new ClientCode();
existsClientCode.setId(ID);
existsClientCode.setCompanyId(COMPANY_ID);
existsClientCode.setCode("0000");
existsClientCode.setTradingClearingRegistryId(TCR_ID);
existsClientCode.setMoneyAccountId(131L);
existsClientCode.setDepoAccountId(132L);
existsClientCode.setStatus("ACTV");
clientCodeImdg.insert(existsClientCode);
ClientCodeUpdateRequest clientCodeUpdateRequest = new ClientCodeUpdateRequest();
clientCodeUpdateRequest.setId(ID);
clientCodeUpdateRequest.setCompanyId(COMPANY_ID);
clientCodeUpdateRequest.setCode("1111");
clientCodeUpdateRequest.setTradingClearingRegistryId(TCR_ID);
clientCodeUpdateRequest.setMoneyAccountId(131L);
clientCodeUpdateRequest.setDepoAccountId(132L);
clientCodeUpdateRequest.setStatus("ACTV");
ClientCode predictableClientCode = new ClientCode();
predictableClientCode.setId(ID);
predictableClientCode.setCompanyId(COMPANY_ID);
predictableClientCode.setCode("1111");
predictableClientCode.setTradingClearingRegistryId(TCR_ID);
predictableClientCode.setMoneyAccountId(131L);
predictableClientCode.setDepoAccountId(132L);
predictableClientCode.setStatus("ACTV");
//ACT
String jsonString = TestUtils.getJsonStringForUpdate(clientCodeUpdateRequest, ID);
TestUtils.addRecordToKafka((MockConsumer) clientCodeService.getConsumer(), Consts.DESTINATION_CLIENT_CODE_UPDATE, PARTITION, 0, jsonString);
//ASSERT
waitingSendAndCheckRecord(ID, mockProducer);
ClientCode resultUpdating = clientCodeImdg.getSingleObjectByID(ID);
CLIENT_CODE_MATCHER.assertMatch(resultUpdating, predictableClientCode);
assertNotNull(resultUpdating.getUpdated());
}
/**
* {@link ClientCodeService#clientCodeUpdate(BaseRequest)}<br>
* Тест проверяет удаление {@link ClientCode} из IMDG при передаче из Apache Kafka.<br>
* Входной запрос {@link ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest}:<br>
**/
@Test
void clientCodeDelete1() {
//ARRANGE
ClientCode existsClientCode = new ClientCode();
existsClientCode.setId(ID);
existsClientCode.setCompanyId(COMPANY_ID);
existsClientCode.setCode("0000");
// Если следующие поля заполнить, то дополнительно отправит сообщение в trading-clearing-registry-update:
existsClientCode.setTradingClearingRegistryId(null);
existsClientCode.setMoneyAccountId(null);
existsClientCode.setDepoAccountId(null);
existsClientCode.setStatus("ACTV");
clientCodeImdg.insert(existsClientCode);
CommonDeleteRequest clientCodeDeleteRequest = new CommonDeleteRequest();
clientCodeDeleteRequest.setId(ID);
Assertions.assertNotNull(clientCodeImdg.getSingleObjectByID(ID)); // verify test data
//ACT
String jsonString = TestUtils.getJsonStringForUpdate(clientCodeDeleteRequest, ID);
TestUtils.addRecordToKafka((MockConsumer) clientCodeService.getConsumer(), Consts.DESTINATION_CLIENT_CODE_DELETE, PARTITION, 0, jsonString);
//ASSERT
waitingSendAndCheckRecord(ID, mockProducer);
ClientCode resultUpdate = clientCodeImdg.getSingleObjectByID(ID);
assertEquals(WorkflowStatus.Blocked.getKey(), resultUpdate.getStatus());
}
// /**
// * {@link ClientCodeService#clientCodeUpdate(BaseRequest)}<br>
// * Тест проверяет удаление {@link ClientCode} из IMDG при передаче из Apache Kafka.<br>
// * У ClientCode заполнены MoneyAccountId, DepoAccountId - по этому при удалении должно направиться дополнительное сообщение в очередь DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE<br>
// * Входной запрос {@link ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest}:<br>
// **/
// @Test
// void clientCodeDelete2() {
// //ARRANGE
// ClientCode existsClientCode = new ClientCode();
// existsClientCode.setId(ID);
// existsClientCode.setCompanyId(COMPANY_ID);
// existsClientCode.setCode("0000");
// // Если следующие поля заполнить, то дополнительно отправит сообщение в trading-clearing-registry-update:
// existsClientCode.setTradingClearingRegistryId(TCR_ID);
// existsClientCode.setMoneyAccountId(131L);
// existsClientCode.setDepoAccountId(132L);
// existsClientCode.setStatus("ACTV");
//
// clientCodeImdg.insert(existsClientCode);
//
// CommonDeleteRequest clientCodeDeleteRequest = new CommonDeleteRequest();
// clientCodeDeleteRequest.setId(ID);
//
// Assertions.assertNotNull(clientCodeImdg.getSingleObjectByID(ID)); // verify test data
//
// //ACT
// String jsonString = getJsonStringForUpdate(clientCodeDeleteRequest, ID);
//
// addRecordToKafka((MockConsumer) clientCodeService.getConsumer(), Consts.DESTINATION_CLIENT_CODE_DELETE, PARTITION, 0, jsonString);
//
// //ASSERT
//
// waitingWhenAddedRecordAndCheckIt(ID, mockProducer, producerRecord);
// ClientCode resultUpdate = clientCodeImdg.getSingleObjectByID(ID);
// Assertions.assertNull(resultUpdate);
// }
}

View file

@ -0,0 +1,177 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.producer.Producer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.platform.dictionary.AccountTypeDictionary;
import ru.clearing.platform.dictionary.DepoAccountTypeDictionary;
import ru.spcex.clearing.account.config.BeanConfiguration;
import ru.spcex.clearing.account.config.validation.AccountValidationConfig;
import ru.spcex.clearing.account.config.validation.DepoAccountValidationConfig;
import ru.spcex.clearing.account.config.validation.ValidationConfig;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.DepoAccountNewRequest;
import ru.spcex.clearing.test.MatcherFactory;
import ru.spcex.clearing.test.TestObjectCreator;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import javax.annotation.PostConstruct;
import java.util.Map;
import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator;
import static ru.spcex.clearing.test.TestUtils.*;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
BeanConfiguration.class,
ValidationConfig.class,
DepoAccountValidationConfig.class,
AccountValidationConfig.class,
AccountHelper.class,
DepoAccountService.class,
ImdgTestConfig.class,
KafkaTestConfig.class})
class DepoAccountServiceTest {
public static final MatcherFactory.Matcher<DepoAccount> CLEARING_ACCOUNT_MATCHER = usingIgnoringFieldsComparator();
public static final MatcherFactory.Matcher<Account> ACCOUNT_MATCHER = usingIgnoringFieldsComparator("created", "updated");
private static final int PARTITION = 0;
private static final Long companyId = 0L;
private static final Long relationId = 0L;
private static final String DEPO_ACCOUNT_TYPE_DICT = "A";
private static final String ACCOUNT_VALUE = "account-value";
private static final String TRADING_CODE = "trading-code";
@Autowired
DepoAccountService depoAccountService;
@Autowired
@Qualifier("hazelcastServiceTest")
private ImdgProvider hazelcastServiceTest;
@Autowired
@Qualifier("mockProducer")
protected Producer<String, Object> mockProducer;
private Imdg<DepoAccount> depoAccountImdg;
private Imdg<Account> accountImdg;
private Imdg<Company> companyImdg;
private Imdg<DepoAccountTypeDictionary> depoAccountTypeDictionaryImdg;
private Imdg<AccountTypeDictionary> accountTypeDictionaryImdg;
private Imdg<ClearingMemberCategory> clearingMemberCategoryImdg;
private Imdg<Relation> relationImdg;
@PostConstruct
private void init() {
hazelcastServiceTest.waitAvailable();
depoAccountImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_DepoAccount, DepoAccount.class
);
accountImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Account, Account.class
);
companyImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Company, Company.class
);
accountTypeDictionaryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class
);
depoAccountTypeDictionaryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_DepoAccountTypeDictionary, DepoAccountTypeDictionary.class
);
clearingMemberCategoryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class
);
relationImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Relation, Relation.class
);
Company company = new Company();
company.setId(companyId);
company.setWorkflowStatus(WorkflowStatus.Active.getKey());
company.setTradingCode(TRADING_CODE);
companyImdg.insert(company);
AccountTypeDictionary accountTypeDictionary = new AccountTypeDictionary();
accountTypeDictionary.setCode(AccountType.Depo.getKey());
accountTypeDictionary.setName(AccountType.Depo.getKey());
accountTypeDictionaryImdg.insert(accountTypeDictionary);
DepoAccountTypeDictionary depoAccountTypeDictionary = new DepoAccountTypeDictionary();
depoAccountTypeDictionary.setName(DEPO_ACCOUNT_TYPE_DICT);
depoAccountTypeDictionary.setCode(DEPO_ACCOUNT_TYPE_DICT);
depoAccountTypeDictionaryImdg.insert(depoAccountTypeDictionary);
ClearingMemberCategory clearingMemberCategory = new ClearingMemberCategory();
clearingMemberCategory.setClearingMemberCategory(ClearingCategory.B.getKey());
clearingMemberCategory.setCompanyId(companyId);
clearingMemberCategoryImdg.insert(clearingMemberCategory);
Relation relation = new Relation();
relation.setId(relationId);
relation.setConsumerId(companyId);
relation.setService(Service.MKR.getKey());
relationImdg.insert(relation);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
}
@Test
void depoAccountNew() {
DepoAccountNewRequest depoAccountNewRequest = new DepoAccountNewRequest();
depoAccountNewRequest.setAccount(ACCOUNT_VALUE);
depoAccountNewRequest.setCompanyId(companyId);
depoAccountNewRequest.setDepoAccountType(DEPO_ACCOUNT_TYPE_DICT);
String jsonString = getJsonStringForNew(depoAccountNewRequest, 0L);
addRecordToKafka((MockConsumer) depoAccountService.getConsumer(),
Consts.DESTINATION_DEPO_ACCOUNT_NEW,
PARTITION,
0,
jsonString);
waitingSendAndCheckRecord(0L, mockProducer);
Account predictableAccount = new Account();
predictableAccount.setAccount(ACCOUNT_VALUE);
predictableAccount.setAccountType(AccountType.Depo.getKey());
predictableAccount.setStatus(ServiceStatus.Active.getKey());
predictableAccount.setRelationId(relationId);
predictableAccount.setCompanyId(companyId);
DepoAccount predictableDepoAccount = new DepoAccount();
predictableDepoAccount.setCompanyId(companyId);
predictableDepoAccount.setDepoAccountType(DEPO_ACCOUNT_TYPE_DICT);
Account resultAccountNew = accountImdg.getFirstObjectByFieldValues(Map.of("accountType", AccountType.Depo.getKey()));
DepoAccount resultDepoAccountNew = depoAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", resultAccountNew.getId()));
predictableAccount.setId(resultAccountNew.getId());
predictableDepoAccount.setAccountId(resultAccountNew.getId());
predictableDepoAccount.setId(resultDepoAccountNew.getId());
ACCOUNT_MATCHER.assertMatch(resultAccountNew, predictableAccount);
CLEARING_ACCOUNT_MATCHER.assertMatch(resultDepoAccountNew, predictableDepoAccount);
depoAccountImdg.delete(resultDepoAccountNew);
accountImdg.delete(resultAccountNew);
}
}

View file

@ -0,0 +1,198 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.producer.Producer;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.platform.dictionary.AccountTypeDictionary;
import ru.spcex.clearing.account.config.BeanConfiguration;
import ru.spcex.clearing.account.config.validation.AccountValidationConfig;
import ru.spcex.clearing.account.config.validation.InformationAccountValidationConfig;
import ru.spcex.clearing.account.config.validation.ValidationConfig;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.InformationAccountNewRequest;
import ru.spcex.clearing.test.MatcherFactory;
import ru.spcex.clearing.test.TestObjectCreator;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import javax.annotation.PostConstruct;
import java.util.Map;
import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator;
import static ru.spcex.clearing.test.TestUtils.*;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
BeanConfiguration.class,
ValidationConfig.class,
InformationAccountValidationConfig.class,
AccountValidationConfig.class,
AccountHelper.class,
InformationAccountService.class,
ImdgTestConfig.class,
KafkaTestConfig.class})
class InformationAccountServiceTest {
public static final MatcherFactory.Matcher<InformationAccount> INFORMATION_ACCOUNT_MATCHER = usingIgnoringFieldsComparator();
public static final MatcherFactory.Matcher<Account> ACCOUNT_MATCHER = usingIgnoringFieldsComparator("created", "updated");
private static final int PARTITION = 0;
private static final String account = "123456789123";
private static final Long companyId = 0L;
private static final Long relationId = 0L;
private Long anltAccountId;
@Autowired
InformationAccountService informationAccountService;
@Autowired
@Qualifier("hazelcastServiceTest")
private ImdgProvider hazelcastServiceTest;
@Autowired
@Qualifier("mockProducer")
protected Producer<String, Object> mockProducer;
private Imdg<InformationAccount> informationAccountImdg;
private Imdg<Account> accountImdg;
private Imdg<Company> companyImdg;
private Imdg<AccountTypeDictionary> accountTypeDictionaryImdg;
private Imdg<ClearingMemberCategory> clearingMemberCategoryImdg;
private Imdg<Relation> relationImdg;
@PostConstruct
private void init() {
hazelcastServiceTest.waitAvailable();
informationAccountImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_InformationAccount, InformationAccount.class
);
accountImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Account, Account.class
);
clearImdg(accountImdg);
companyImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Company, Company.class
);
accountTypeDictionaryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class
);
clearingMemberCategoryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class
);
relationImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Relation, Relation.class
);
Company company = new Company();
company.setId(companyId);
company.setWorkflowStatus(WorkflowStatus.Active.getKey());
companyImdg.insert(company);
AccountTypeDictionary accountTypeDictionary = new AccountTypeDictionary();
accountTypeDictionary.setCode(AccountType.Info.getKey());
accountTypeDictionary.setName(AccountType.Info.getKey());
accountTypeDictionaryImdg.insert(accountTypeDictionary);
ClearingMemberCategory clearingMemberCategory = new ClearingMemberCategory();
clearingMemberCategory.setClearingMemberCategory(ClearingCategory.B.getKey());
clearingMemberCategory.setCompanyId(companyId);
clearingMemberCategoryImdg.insert(clearingMemberCategory);
Relation relation = new Relation();
relation.setId(relationId);
relation.setConsumerId(companyId);
relation.setService(Service.MKR.getKey());
relationImdg.insert(relation);
Account accountAnlt = new Account();
accountAnlt.setAccountType(AccountType.Anlt.getKey());
accountAnlt.setCompanyId(1L);
anltAccountId = accountImdg.insert(accountAnlt);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
}
@Test
void accountInformationNew() {
InformationAccountNewRequest InformationAccountNewRequest = new InformationAccountNewRequest();
InformationAccountNewRequest.setCompanyId(companyId);
InformationAccountNewRequest.setAccount(account);
String jsonString = getJsonStringForNew(InformationAccountNewRequest, 0L);
addRecordToKafka((MockConsumer) informationAccountService.getConsumer(),
Consts.DESTINATION_INFORMATION_ACCOUNT_NEW,
PARTITION,
0,
jsonString);
waitingSendAndCheckRecord(0L, mockProducer);
Account predictableAccount = new Account();
predictableAccount.setAccountType(AccountType.Info.getKey());
predictableAccount.setStatus(ServiceStatus.Active.getKey());
predictableAccount.setRelationId(relationId);
predictableAccount.setCompanyId(companyId);
InformationAccount predictableInfoAccount = new InformationAccount();
predictableInfoAccount.setCompanyId(companyId);
predictableInfoAccount.setClearingAccountId(anltAccountId);
Account resultAccountNew = accountImdg.getFirstObjectByFieldValues(Map.of("accountType", AccountType.Info.getKey()));
InformationAccount resultInfoAccountNew = informationAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", resultAccountNew.getId()));
predictableAccount.setId(resultAccountNew.getId());
predictableAccount.setAccount(account);
predictableInfoAccount.setAccountId(resultAccountNew.getId());
predictableInfoAccount.setId(resultInfoAccountNew.getId());
ACCOUNT_MATCHER.assertMatch(resultAccountNew, predictableAccount);
INFORMATION_ACCOUNT_MATCHER.assertMatch(resultInfoAccountNew, predictableInfoAccount);
informationAccountImdg.delete(resultInfoAccountNew);
accountImdg.delete(resultAccountNew);
}
@Test
void accountIncrementSequence() {
Imdg<InformationAccount> accountInfoImdg = hazelcastServiceTest.getImdg( IMDGDistributedNames.Map_InformationAccount, InformationAccount.class );
{
Account account = new Account();
account.setId(120L);
account.setAccountType(AccountType.Info.getKey());
account.setCompanyId(10L);
account.setAccount("39911810000000127000");
accountImdg.insert(account);
InformationAccount accountInfo = new InformationAccount();
accountInfo.setId(121L);
accountInfo.setAccountId(account.getId());
accountInfo.setCompanyId(account.getCompanyId());
accountInfoImdg.insert(accountInfo);
}
UserRoleVerification userRoleVerification = Mockito.mock(UserRoleVerification.class);
InformationAccountService infoAccSvc=new InformationAccountService(null,null,null,
null, userRoleVerification, hazelcastServiceTest, null, null, null, null);
Long n = infoAccSvc.accountNextId();
Assertions.assertEquals(13L, n);
n = infoAccSvc.accountNextId();
Assertions.assertEquals(14L, n);
}
}

View file

@ -0,0 +1,106 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.producer.MockProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.platform.dictionary.AccountTypeDictionary;
import ru.clearing.platform.dictionary.ClearingAccountTypeDictionary;
import ru.spcex.clearing.account.config.BeanConfiguration;
import ru.spcex.clearing.account.config.validation.ValidationConfig;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.test.TestObjectCreator;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import ru.spcex.platform.enumeration.AccountStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import javax.annotation.PostConstruct;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
BeanConfiguration.class,
ValidationConfig.class,
SDFProcessService.class,
ImdgTestConfig.class,
KafkaTestConfig.class})
class SDFProcessServiceTest {
@Autowired
SDFProcessService sdfProcessService;
@Autowired
@Qualifier("hazelcastServiceTest")
private ImdgProvider hazelcastServiceTest;
@Captor
private ArgumentCaptor<ProducerRecord> producerRecord;
@SpyBean
private MockProducer<String, Object> producer;
@Autowired
@Qualifier("mockProducer")
protected Producer<String, Object> mockProducer;
private Imdg<ClearingAccount> clearingAccountImdg;
private Imdg<Account> accountImdg;
private Imdg<Company> companyImdg;
private Imdg<ClearingAccountTypeDictionary> clearingAccountTypeDictionaryImdg;
private Imdg<AccountTypeDictionary> accountTypeDictionaryImdg;
private Imdg<ClearingMemberCategory> clearingMemberCategoryImdg;
private Imdg<Relation> relationImdg;
@PostConstruct
private void init() {
hazelcastServiceTest.waitAvailable();
clearingAccountImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class
);
accountImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Account, Account.class
);
companyImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Company, Company.class
);
accountTypeDictionaryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class
);
clearingAccountTypeDictionaryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ClearingAccountTypeDictionary, ClearingAccountTypeDictionary.class
);
clearingMemberCategoryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class
);
relationImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Relation, Relation.class
);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
}
@Test
void parseSdf52Status() {
Assertions.assertEquals(AccountStatus.BLOCKED, sdfProcessService.parseSdf52Status(0L));
Assertions.assertEquals(AccountStatus.ACTIVE, sdfProcessService.parseSdf52Status(1L));
Assertions.assertEquals(AccountStatus.ACTIVE, sdfProcessService.parseSdf52Status(3L));
Assertions.assertEquals(AccountStatus.CLOSE, sdfProcessService.parseSdf52Status(2L));
Assertions.assertEquals(null, sdfProcessService.parseSdf52Status(4705211956118233163L));
Assertions.assertEquals(null, sdfProcessService.parseSdf52Status(null));
}
}

View file

@ -0,0 +1,357 @@
package ru.spcex.clearing.account.service;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.producer.Producer;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.spcex.clearing.account.config.BeanConfiguration;
import ru.spcex.clearing.account.config.validation.TradingClearingRegistryValidationConfig;
import ru.spcex.clearing.account.config.validation.ValidationConfig;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryUpdateRequest;
import ru.spcex.clearing.test.MatcherFactory;
import ru.spcex.clearing.test.TestObjectCreator;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import javax.annotation.PostConstruct;
import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator;
import static ru.spcex.clearing.test.TestUtils.*;
import static ru.spcex.clearing.test.config.KafkaTestConfig.setMockFuture;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
BeanConfiguration.class,
ValidationConfig.class,
TradingClearingRegistryValidationConfig.class,
TradingClearingRegistryService.class,
ImdgTestConfig.class,
KafkaTestConfig.class})
class TradingClearingRegistryServiceTest {
public static final MatcherFactory.Matcher<TradingClearingRegistry> TRADING_CLEARING_REGISTRY_MATCHER = usingIgnoringFieldsComparator();
private static final int PARTITION = 0;
private static final String TOPIC_ACCOUNT_NEW = Consts.ACCOUNT_NEW_SDF01;
private static final String account = "123456789123";
private static final Long companyId = 0L;
private static final Long relationId = 0L;
@Autowired
TradingClearingRegistryService tradingClearingRegistryService;
@Autowired
@Qualifier("hazelcastServiceTest")
private ImdgProvider hazelcastServiceTest;
@Autowired
@Qualifier("mockProducer")
protected Producer<String, Object> mockProducer;
@Autowired
@Qualifier("kafkaTestTemplate")
protected KafkaTemplate<String, Object> kafkaTemplate;
private Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private Imdg<Company> companyImdg;
private Imdg<CompanySymbols> companySymbolsImdg;
private Imdg<ServiceStatusDictionary> serviceStatusDictionaryImdg;
private Imdg<ClearingAccount> clearingAccountImdg;
private Long clearingAccountId;
private Imdg<DepoAccount> depoAccountImdg;
private Long depoAccountId;
private Imdg<InformationAccount> informationAccountImdg;
private Long infoAccountId;
private Imdg<Account> accountImdg;
private Long accountId;
private Long account2Id;
static int newRequestCnt = 0;
@PostConstruct
private void init() {
hazelcastServiceTest.waitAvailable();
tradingClearingRegistryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class
);
companyImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Company, Company.class
);
companySymbolsImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class
);
serviceStatusDictionaryImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ServiceStatusDictionary, ServiceStatusDictionary.class
);
accountImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Account, Account.class
);
clearingAccountImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class
);
depoAccountImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_DepoAccount, DepoAccount.class
);
informationAccountImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_InformationAccount, InformationAccount.class
);
ServiceStatusDictionary serviceStatusDictionary = new ServiceStatusDictionary();
serviceStatusDictionary.setCode(ServiceStatus.Active.getKey());
serviceStatusDictionary.setName(ServiceStatus.Active.getKey());
serviceStatusDictionaryImdg.insert(serviceStatusDictionary);
Company company = new Company();
company.setId(companyId);
company.setWorkflowStatus(WorkflowStatus.Active.getKey());
company.setClearingCode("77");
companyImdg.insert(company);
CompanySymbols companySymbols = new CompanySymbols();
companySymbols.setCompanyId(companyId);
companySymbols.setCompanySymbol(CompanySymbol.CLRC.getKey());
companySymbolsImdg.insert(companySymbols);
Account account = new Account();
account.setStatus(ServiceStatus.Active.getKey());
account.setAccountType(AccountType.Clrn.getKey());
accountId = accountImdg.insert(account);
account2Id = accountImdg.insert(account);
DepoAccount depoAccount = new DepoAccount();
depoAccount.setAccountId(accountId);
depoAccount.setDepoAccountType("DAT");
depoAccountId = depoAccountImdg.insert(depoAccount);
ClearingAccount clearingAccount = new ClearingAccount();
clearingAccount.setAccountId(accountId);
clearingAccount.setClearingAccountType("CAT");
clearingAccountId = clearingAccountImdg.insert(clearingAccount);
InformationAccount informationAccount = new InformationAccount();
informationAccount.setAccountId(account2Id);
infoAccountId = informationAccountImdg.insert(informationAccount);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
}
@Test
void tradingClearingRegistryNew_moneyAccount_clearingAccount() {
setMockFuture(kafkaTemplate);
TradingClearingRegistryNewRequest tradingClearingRegistryNewRequest = new TradingClearingRegistryNewRequest();
tradingClearingRegistryNewRequest.setCompanyId(companyId);
tradingClearingRegistryNewRequest.setMoneyAccountId(accountId);
tradingClearingRegistryNewRequest.setTradingClearingRegistryType(TradingClearingRegistryType.Owner_A.getKey());
TradingClearingRegistry predictableTradingClearingRegistry = new TradingClearingRegistry();
predictableTradingClearingRegistry.setCompanyId(companyId);
predictableTradingClearingRegistry.setCode("0077MAT00001");
predictableTradingClearingRegistry.setMoneyAccountId(accountId);
predictableTradingClearingRegistry.setTradingClearingRegistryType(TradingClearingRegistryType.Owner_A.getKey());
predictableTradingClearingRegistry.setTradingClearingRegistryPurpose(TradingClearingRegistryPurpose.M.getKey());
predictableTradingClearingRegistry.setStatus(ServiceStatus.Active.getKey());
String jsonString = getJsonStringForNew(tradingClearingRegistryNewRequest, 0L);
addRecordToKafka((MockConsumer) tradingClearingRegistryService.getConsumer(),
Consts.DESTINATION_TRADING_CLEARING_REGISTRY_NEW,
newRequestCnt,
0,
jsonString);
waitingSendAndCheckRecord(0L, mockProducer);
TradingClearingRegistry resultNew = tradingClearingRegistryImdg.getAllValues().iterator().next();
predictableTradingClearingRegistry.setId(resultNew.getId());
predictableTradingClearingRegistry.setUpdated(resultNew.getUpdated());
predictableTradingClearingRegistry.setCreated(resultNew.getCreated());
TRADING_CLEARING_REGISTRY_MATCHER.assertMatch(resultNew, predictableTradingClearingRegistry);
tradingClearingRegistryImdg.delete(resultNew);
newRequestCnt++;
}
@Test
void tradingClearingRegistryNew_moneyAccount_informationAccount() {
setMockFuture(kafkaTemplate);
clearImdg(tradingClearingRegistryImdg);
TradingClearingRegistryNewRequest tradingClearingRegistryNewRequest = new TradingClearingRegistryNewRequest();
tradingClearingRegistryNewRequest.setCompanyId(companyId);
tradingClearingRegistryNewRequest.setMoneyAccountId(account2Id);
tradingClearingRegistryNewRequest.setTradingClearingRegistryType(TradingClearingRegistryType.Owner_A.getKey());
TradingClearingRegistry predictableTradingClearingRegistry = new TradingClearingRegistry();
predictableTradingClearingRegistry.setCompanyId(companyId);
predictableTradingClearingRegistry.setCode("0077MAT00001");
predictableTradingClearingRegistry.setMoneyAccountId(account2Id);
predictableTradingClearingRegistry.setTradingClearingRegistryType(TradingClearingRegistryType.Owner_A.getKey());
predictableTradingClearingRegistry.setTradingClearingRegistryPurpose(TradingClearingRegistryPurpose.M.getKey());
predictableTradingClearingRegistry.setStatus(ServiceStatus.Active.getKey());
String jsonString = getJsonStringForNew(tradingClearingRegistryNewRequest, 0L);
addRecordToKafka((MockConsumer) tradingClearingRegistryService.getConsumer(),
Consts.DESTINATION_TRADING_CLEARING_REGISTRY_NEW,
newRequestCnt,
0,
jsonString);
waitingSendAndCheckRecord(0L, mockProducer);
TradingClearingRegistry resultNew = tradingClearingRegistryImdg.getAllValues().iterator().next();
predictableTradingClearingRegistry.setId(resultNew.getId());
predictableTradingClearingRegistry.setUpdated(resultNew.getUpdated());
predictableTradingClearingRegistry.setCreated(resultNew.getCreated());
TRADING_CLEARING_REGISTRY_MATCHER.assertMatch(resultNew, predictableTradingClearingRegistry);
tradingClearingRegistryImdg.delete(resultNew);
newRequestCnt++;
}
@Test
void tradingClearingRegistryNew_depoAccount() {
setMockFuture(kafkaTemplate);
clearImdg(tradingClearingRegistryImdg);
TradingClearingRegistryNewRequest tradingClearingRegistryNewRequest = new TradingClearingRegistryNewRequest();
tradingClearingRegistryNewRequest.setCompanyId(companyId);
tradingClearingRegistryNewRequest.setMoneyAccountId(accountId);
tradingClearingRegistryNewRequest.setDepoAccountId(account2Id);
TradingClearingRegistry predictableTradingClearingRegistry = new TradingClearingRegistry();
predictableTradingClearingRegistry.setCompanyId(companyId);
predictableTradingClearingRegistry.setCode("0077CDATT00001");
predictableTradingClearingRegistry.setMoneyAccountId(accountId);
predictableTradingClearingRegistry.setDepoAccountId(account2Id);
predictableTradingClearingRegistry.setTradingClearingRegistryType("DAT");
predictableTradingClearingRegistry.setTradingClearingRegistryPurpose(TradingClearingRegistryPurpose.C.getKey());
predictableTradingClearingRegistry.setStatus(ServiceStatus.Active.getKey());
String jsonString = getJsonStringForNew(tradingClearingRegistryNewRequest, 0L);
addRecordToKafka((MockConsumer) tradingClearingRegistryService.getConsumer(),
Consts.DESTINATION_TRADING_CLEARING_REGISTRY_NEW,
newRequestCnt,
0,
jsonString);
waitingSendAndCheckRecord(0L, mockProducer);
TradingClearingRegistry resultNew = tradingClearingRegistryImdg.getAllValues().iterator().next();
predictableTradingClearingRegistry.setId(resultNew.getId());
predictableTradingClearingRegistry.setUpdated(resultNew.getUpdated());
predictableTradingClearingRegistry.setCreated(resultNew.getCreated());
TRADING_CLEARING_REGISTRY_MATCHER.assertMatch(resultNew, predictableTradingClearingRegistry);
tradingClearingRegistryImdg.delete(resultNew);
newRequestCnt++;
}
@Test
void tradingClearingRegistryUpdate() {
TradingClearingRegistry existTradingClearingRegistry = new TradingClearingRegistry();
existTradingClearingRegistry.setStatus(ServiceStatus.Closed.getKey());
Long registryId = tradingClearingRegistryImdg.insert(existTradingClearingRegistry);
TradingClearingRegistryUpdateRequest tradingClearingRegistryUpdateRequest = new TradingClearingRegistryUpdateRequest();
tradingClearingRegistryUpdateRequest.setStatus(ServiceStatus.Active.getKey());
tradingClearingRegistryUpdateRequest.setId(registryId);
String jsonString = getJsonStringForUpdate(tradingClearingRegistryUpdateRequest, 0);
//ACT
addRecordToKafka((MockConsumer) tradingClearingRegistryService.getConsumer(),
Consts.DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE,
PARTITION,
0,
jsonString);
//ASSERT
waitingSendAndCheckRecord(0L, mockProducer);
TradingClearingRegistry resultUpdating = tradingClearingRegistryImdg.getSingleObjectByID(registryId);
existTradingClearingRegistry.setUpdated(resultUpdating.getUpdated());
existTradingClearingRegistry.setStatus(ServiceStatus.Active.getKey());
TRADING_CLEARING_REGISTRY_MATCHER.assertMatch(resultUpdating, existTradingClearingRegistry);
tradingClearingRegistryImdg.delete(resultUpdating);
}
@Test
void tradingClearingRegistryBlock() {
TradingClearingRegistry existTradingClearingRegistry = new TradingClearingRegistry();
existTradingClearingRegistry.setStatus(ServiceStatus.Closed.getKey());
Long registryId = tradingClearingRegistryImdg.insert(existTradingClearingRegistry);
CommonDeleteRequest tradingClearingRegistryDeleteRequest = new CommonDeleteRequest();
tradingClearingRegistryDeleteRequest.setId(registryId);
String jsonString = getJsonStringForDelete(tradingClearingRegistryDeleteRequest, 0);
//ACT
addRecordToKafka((MockConsumer) tradingClearingRegistryService.getConsumer(),
Consts.DESTINATION_TRADING_CLEARING_REGISTRY_BLOCK,
PARTITION,
0,
jsonString);
//ASSERT
waitingSendAndCheckRecord(0L, mockProducer);
TradingClearingRegistry resultUpdating = tradingClearingRegistryImdg.getSingleObjectByID(registryId);
existTradingClearingRegistry.setUpdated(resultUpdating.getUpdated());
existTradingClearingRegistry.setStatus(ServiceStatus.Blocked.getKey());
TRADING_CLEARING_REGISTRY_MATCHER.assertMatch(resultUpdating, existTradingClearingRegistry);
tradingClearingRegistryImdg.delete(resultUpdating);
}
@Test
void makeCode() {
Assertions.assertEquals("0005CAT00001", tradingClearingRegistryService.makeCode(
"5", TradingClearingRegistryPurpose.C, TradingClearingRegistryType.Owner_A.getKey(), 1L
));
Assertions.assertEquals("0005CET00012", tradingClearingRegistryService.makeCode(
"005", TradingClearingRegistryPurpose.C, "E", 12L
));
Assertions.assertEquals("0105CERT00012", tradingClearingRegistryService.makeCode(
"000000105", TradingClearingRegistryPurpose.C, "ER", 100012L
));
Assertions.assertEquals("0105MAT00012", tradingClearingRegistryService.makeCode(
"000000105", TradingClearingRegistryPurpose.M, "A", 100012L
));
}
@Test
void parseCodeSeqId() {
Assertions.assertEquals(Long.valueOf(1L), tradingClearingRegistryService.parseCodeSeqId("0005CAT00001"));
Assertions.assertEquals(Long.valueOf(5001), tradingClearingRegistryService.parseCodeSeqId("0005CAT05001"));
Assertions.assertEquals(null, tradingClearingRegistryService.parseCodeSeqId("0005CAT"));
Assertions.assertEquals(null, tradingClearingRegistryService.parseCodeSeqId(""));
Assertions.assertEquals(null, tradingClearingRegistryService.parseCodeSeqId(null));
}
}

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>backend-api</artifactId>
@ -8,12 +8,12 @@
<description>Clearing backend API module</description>
<packaging>jar</packaging>
<parent>
<artifactId>clearing-parent</artifactId>
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-1.0.0.0</version>
</parent>
<properties>
<keycloak-spring-boot-starter.version>17.0.1</keycloak-spring-boot-starter.version>
@ -25,25 +25,93 @@
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-starter</artifactId>
<version>${keycloak-spring-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-imdg-api-hazelcast-impl</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-messaging</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>classes</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>dictionary</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-enum</artifactId>
</dependency>
<!-- TEST -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>test-clearing</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.skyscreamer</groupId>
<artifactId>jsonassert</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.11</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test-autoconfigure</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.keycloak.bom</groupId>
<artifactId>keycloak-adapter-bom</artifactId>
<version>${keycloak-spring-boot-starter.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<groupId>org.keycloak.bom</groupId>
<artifactId>keycloak-adapter-bom</artifactId>
<version>${keycloak-spring-boot-starter.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
@ -54,6 +122,7 @@
<excludes>
<exclude>application.properties</exclude>
<exclude>keycloak.json</exclude>
<exclude>meta/**</exclude>
</excludes>
<filtering>false</filtering>
</resource>
@ -74,6 +143,268 @@
<finalName>${project.artifactId}</finalName>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xml-maven-plugin</artifactId>
<executions>
<!--all doc generation: mvn clean xml:transform@ddl xml:transform@data xml:transform@db xml:transform@json xml:transform@core xml:transform@report xml:transform@web -->
<execution>
<!-- Generate DDL.sql from META file
command: mvn xml:transform@ddl -->
<id>ddl</id>
<goals>
<goal>transform</goal>
</goals>
<configuration>
<transformationSets>
<transformationSet>
<dir>src/main/resources/meta</dir>
<includes>
<include>meta.xml</include>
</includes>
<stylesheet>src/main/resources/meta/xsl/ddl.xsl</stylesheet>
<fileMappers>
<fileMapper
implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
<targetExtension>ddl.sql</targetExtension>
</fileMapper>
</fileMappers>
</transformationSet>
</transformationSets>
</configuration>
</execution>
<execution>
<!-- Generate Data.sql from META and DATA file
command: mvn xml:transform@data -->
<id>data</id>
<goals>
<goal>transform</goal>
</goals>
<configuration>
<transformationSets>
<transformationSet>
<dir>src/main/resources/meta</dir>
<includes>
<include>data.xml</include>
</includes>
<stylesheet>src/main/resources/meta/xsl/data.xsl</stylesheet>
<fileMappers>
<fileMapper
implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
<targetExtension>data.sql</targetExtension>
</fileMapper>
</fileMappers>
</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>
</configuration>
</execution>
<execution>
<!-- Generate db.html - description from META and dATA file
command: mvn xml:transform@db -->
<id>db</id>
<goals>
<goal>transform</goal>
</goals>
<configuration>
<transformationSets>
<transformationSet>
<dir>src/main/resources/meta</dir>
<includes>
<include>meta.xml</include>
</includes>
<stylesheet>src/main/resources/meta/xsl/db.xsl</stylesheet>
<fileMappers>
<fileMapper
implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
<targetExtension>db.html</targetExtension>
</fileMapper>
</fileMappers>
</transformationSet>
</transformationSets>
</configuration>
</execution>
<execution>
<!-- Generate meta.json - description from META file
command: mvn xml:transform@json -->
<id>json</id>
<goals>
<goal>transform</goal>
</goals>
<configuration>
<transformationSets>
<transformationSet>
<dir>src/main/resources/meta</dir>
<includes>
<include>meta.xml</include>
</includes>
<stylesheet>src/main/resources/meta/xsl/json.xsl</stylesheet>
<fileMappers>
<fileMapper
implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
<targetExtension>meta.json</targetExtension>
</fileMapper>
</fileMappers>
</transformationSet>
</transformationSets>
</configuration>
</execution>
<execution>
<!-- Generate core.html - description from META* files
command: mvn xml:transform@core -->
<id>core</id>
<goals>
<goal>transform</goal>
</goals>
<configuration>
<transformationSets>
<transformationSet>
<dir>src/main/resources/meta</dir>
<includes>
<include>meta.xml</include>
</includes>
<stylesheet>src/main/resources/meta/xsl/core.xsl</stylesheet>
<fileMappers>
<fileMapper
implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
<targetExtension>core.html</targetExtension>
</fileMapper>
</fileMappers>
</transformationSet>
</transformationSets>
</configuration>
</execution>
<execution>
<!-- Generate report.html - report description from META* files
command: mvn xml:transform@report -->
<id>report</id>
<goals>
<goal>transform</goal>
</goals>
<configuration>
<transformationSets>
<transformationSet>
<dir>src/main/resources/meta</dir>
<includes>
<include>meta.xml</include>
</includes>
<stylesheet>src/main/resources/meta/xsl/report.xsl</stylesheet>
<fileMappers>
<fileMapper
implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
<targetExtension>report.html</targetExtension>
</fileMapper>
</fileMappers>
</transformationSet>
</transformationSets>
</configuration>
</execution>
<execution>
<!-- Generate web.html - description from META* files
command: mvn xml:transform@web -->
<id>web</id>
<goals>
<goal>transform</goal>
</goals>
<configuration>
<transformationSets>
<transformationSet>
<dir>src/main/resources/meta</dir>
<includes>
<include>meta.xml</include>
</includes>
<stylesheet>src/main/resources/meta/xsl/web.xsl</stylesheet>
<fileMappers>
<fileMapper
implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
<targetExtension>web.html</targetExtension>
</fileMapper>
</fileMappers>
</transformationSet>
</transformationSets>
</configuration>
</execution>
<execution>
<!-- Generate java_classes.java from META file
command: mvn xml:transform@java -->
<id>java</id>
<goals>
<goal>transform</goal>
</goals>
<configuration>
<transformationSets>
<transformationSet>
<dir>src/main/resources/meta</dir>
<includes>
<include>meta.xml</include>
</includes>
<stylesheet>src/main/resources/meta/xsl/java.xsl</stylesheet>
<fileMappers>
<fileMapper
implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
<targetExtension>java_classes.java</targetExtension>
</fileMapper>
</fileMappers>
</transformationSet>
</transformationSets>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-meta</id>
<phase>process-classes</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/src/main/resources</outputDirectory>
<resources>
<resource>
<directory>${basedir}/target/generated-resources/xml/xslt</directory>
<includes>
<include>meta.json</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.2.0-M1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.2.0-M1</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>

View file

@ -0,0 +1,86 @@
package ru.spcex.clearing.backendapi.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import ru.spcex.clearing.backendapi.config.element.BackendApiSettings;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
@Configuration
public class BackEndApiImdgConfig {
Logger log = LoggerFactory.getLogger(getClass());
@Bean(name = "taskExecutorHazelcastClientInitializer")
public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() {
return createThreadPoolTaskExecutor(1, true);
}
@Bean(name = "taskExecutorIdGeneratorAwaiter")
public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() {
return createThreadPoolTaskExecutor(1, false);
}
@Bean(name = "taskExecutorHazelcastClientInitializerHist")
public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializerHist() {
return createThreadPoolTaskExecutor(1, true);
}
@Bean(name = "taskExecutorIdGeneratorAwaiterHist")
public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiterHist() {
return createThreadPoolTaskExecutor(1, false);
}
@Autowired
@Bean
public ImdgProvider imdgProvider(
@Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer,
@Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter,
BackendApiSettings clientSetting
) {
if (clientSetting.getHazelcast() == null || clientSetting.getHazelcast().getClusterMembers() == null) {
log.warn("Property \"backend-api.hazelcast.cluster-members\" not set!");
throw new IllegalArgumentException("Property \"backend-api.hazelcast.cluster-members\" not set");
}
ImdgProvider imdg = new HazelcastService(taskExecutorHazelcastClientInitializer,
taskExecutorIdGeneratorAwaiter,
clientSetting.getHazelcast());
// todo корректное ожидание готовности imdg.waitAvailable();
return imdg;
}
@Autowired
@Bean
public ImdgProvider imdgProviderHist(
@Qualifier("taskExecutorHazelcastClientInitializerHist") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer,
@Qualifier("taskExecutorIdGeneratorAwaiterHist") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter,
BackendApiSettings clientSetting
) {
if (clientSetting.getHazelcastSearch() == null || clientSetting.getHazelcastSearch().getClusterMembers() == null) {
log.warn("Property \"backend-api.hazelcast-search.cluster-members\" not set!");
// может работать без history, но history будет недоступна
}
ImdgProvider imdg = new HazelcastService(taskExecutorHazelcastClientInitializer,
taskExecutorIdGeneratorAwaiter,
clientSetting.getHazelcastSearch());
// todo корректное ожидание готовности imdg.waitAvailable();
return imdg;
}
private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) {
ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
if (maxPoolSz > 2) {
pool.setKeepAliveSeconds(60);
pool.setAllowCoreThreadTimeOut(true);
}
pool.setCorePoolSize(maxPoolSz);
pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion);
return pool;
}
}

View file

@ -1,20 +0,0 @@
package ru.spcex.clearing.backendapi.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource("file:${spring.config.location}/application.properties")
@ConfigurationProperties("backend-api")
public class BackendApiSettings {
public String getExampleSetting() {
return exampleSetting;
}
public void setExampleSetting(String exampleSetting) {
this.exampleSetting = exampleSetting;
}
private String exampleSetting;
}

View file

@ -0,0 +1,177 @@
package ru.spcex.clearing.backendapi.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.HistorySubscription;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.specific.*;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.util.LinkedList;
import java.util.List;
@Configuration
public class HistoryConfig {
private final ImdgPredicateBuilder pb;
@Autowired
public HistoryConfig(ImdgProvider imdgProvider) {
this.pb = imdgProvider.getImdg(
IMDGDistributedNames.Map_SearchMoneyBalanceRegister,
SpcexObjectBase.class
).predicateBuilder();
}
@Bean
public List<HistorySubscription> histSubscriptions() {
List<HistorySubscription> hst = new LinkedList<>();
hst.add(executionDeposit());
hst.add(executionFond());
hst.add(depoBalanceRegister());
hst.add(moneyBalanceRegister());
hst.add(admittedLiabilitiesRegister());
hst.add(coveredLiabilitiesRegister());
hst.add(moneyPaymentInstructionRegister());
hst.add(depoPaymentInstructionRegister());
hst.add(excludeLiabilitiesRegister());
hst.add(liabilitiesRegister());
hst.add(executionRegister());
return hst;
}
private HistorySubscription moneyBalanceRegister() {
HistorySubscription sbscr = new HistorySubscription();
sbscr.setDestination("money-balance-registers");
sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchMoneyBalanceRegister);
sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_MoneyBalanceRegister);
sbscr.setConditions(List.of(
new CreatedFromCondition(pb),
new CreatedToCondition(pb)
));
return sbscr;
}
private HistorySubscription depoBalanceRegister() {
HistorySubscription sbscr = new HistorySubscription();
sbscr.setDestination("depo-balance-registers");
sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchDepoBalanceRegister);
sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_DepoBalanceRegister);
sbscr.setConditions(List.of(
new CreatedFromCondition(pb),
new CreatedToCondition(pb)
));
return sbscr;
}
private HistorySubscription depoPaymentInstructionRegister() {
HistorySubscription sbscr = new HistorySubscription();
sbscr.setDestination("depo-payment-instruction-registers");
sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchDepoPaymentInstructionRegister);
sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_DepoPaymentInstructionRegister);
sbscr.setConditions(List.of(
new CreatedFromCondition(pb),
new CreatedToCondition(pb)
));
return sbscr;
}
private HistorySubscription excludeLiabilitiesRegister() {
HistorySubscription sbscr = new HistorySubscription();
sbscr.setDestination("exclude-liabilities-registers");
sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchExcludeLiabilitiesRegister);
sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_ExcludeLiabilitiesRegister);
sbscr.setConditions(List.of(
new CreatedFromCondition(pb),
new CreatedToCondition(pb)
));
return sbscr;
}
private HistorySubscription liabilitiesRegister() {
HistorySubscription sbscr = new HistorySubscription();
sbscr.setDestination("liabilities-registers");
sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchLiabilitiesRegister);
sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_LiabilitiesRegister);
sbscr.setConditions(List.of(
new CreatedFromCondition(pb),
new CreatedToCondition(pb)
));
return sbscr;
}
private HistorySubscription admittedLiabilitiesRegister() {
HistorySubscription sbscr = new HistorySubscription();
sbscr.setDestination("admitted-liabilities-registers");
sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchAdmittedLiabilitiesRegister);
sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_AdmittedLiabilitiesRegister);
sbscr.setConditions(List.of(
new ClearingDateFromCondition(pb),
new ClearingDateToCondition(pb)
));
return sbscr;
}
private HistorySubscription executionRegister() {
HistorySubscription sbscr = new HistorySubscription();
sbscr.setDestination("execution-registers");
sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchExecutionRegister);
sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_ExecutionRegister);
sbscr.setConditions(List.of(
new ClearingDateFromCondition(pb),
new ClearingDateToCondition(pb)
));
return sbscr;
}
private HistorySubscription moneyPaymentInstructionRegister() {
HistorySubscription sbscr = new HistorySubscription();
sbscr.setDestination("money-payment-instruction-registers");
sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchMoneyPaymentInstructionRegister);
sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_MoneyPaymentInstructionRegister);
sbscr.setConditions(List.of(
new ClearingDateFromCondition(pb),
new ClearingDateToCondition(pb)
));
return sbscr;
}
private HistorySubscription coveredLiabilitiesRegister() {
HistorySubscription sbscr = new HistorySubscription();
sbscr.setDestination("covered-liabilities-registers");
sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchCoveredLiabilitiesRegister);
sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_CoveredLiabilitiesRegister);
sbscr.setConditions(List.of(
new ClearingDateFromCondition(pb),
new ClearingDateToCondition(pb)
));
return sbscr;
}
private HistorySubscription executionDeposit() {
HistorySubscription sbscr = new HistorySubscription();
sbscr.setDestination("execution-deposits");
sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchExecutionDeposit);
sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_ExecutionDeposit);
sbscr.setConditions(List.of(
new TradingDateFromCondition(pb),
new TradingDateToCondition(pb)
));
return sbscr;
}
private HistorySubscription executionFond() {
HistorySubscription sbscr = new HistorySubscription();
sbscr.setDestination("execution-fonds");
sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchExecutionFond);
sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_ExecutionFond);
sbscr.setConditions(List.of(
new TradingDateFromCondition(pb),
new TradingDateToCondition(pb)
));
return sbscr;
}
}

View file

@ -0,0 +1,17 @@
package ru.spcex.clearing.backendapi.config;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
@Configuration
public class JacksonHttpConverterConfig {
@Bean("customJsonHttpConverter")
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
return new MappingJackson2HttpMessageConverter(mapper);
}
}

View file

@ -0,0 +1,77 @@
package ru.spcex.clearing.backendapi.config;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.consumer.OffsetResetStrategy;
import org.apache.kafka.clients.producer.MockProducer;
import org.apache.kafka.clients.producer.Producer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.Scope;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import ru.spcex.clearing.backendapi.config.element.BackendApiSettings;
import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory;
import ru.spcex.clearing.platform.messaging.config.KafkaProducerFactory;
import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Configuration
public class KafkaConfig {
@Profile("!kafkaDisabled")
@Autowired
@Bean
public Producer<String, Object> createProducer(BackendApiSettings settings) {
return KafkaProducerFactory.producer(settings.getKafkaProducer());
}
@Bean
public ProducerFactory<String, Object> pf(BackendApiSettings settings) {
KafkaProducerSettings kafkaSettings = settings.getKafkaProducer();
return KafkaProducerFactory.producerFactory(kafkaSettings);
}
@Bean
public KafkaTemplate<String, Object> kafkaTemplateS(ProducerFactory<String, Object> pf) {
return new KafkaTemplate<>(pf);
}
@Profile("!kafkaDisabled")
@Autowired
@Bean
public KafkaSender kafkaSender(KafkaTemplate<String, Object> kafkaTemplate, ImdgProvider imdgProvider) {
ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator();
return KafkaSender.setup()
.saveRequestInfo(false)
.setKafkaTemplate(kafkaTemplate)
.idGenerator(imdgIdGenerator::nextId)
.build();
}
@Profile("kafkaDisabled")
@Bean
public MockProducer<String, Object> createMockProducer() {
return new MockProducer<>(true, (topic, data) -> data != null ? data.getBytes() : new byte[0], (topic, data) -> data.toString().getBytes());
}
@Profile("!kafkaDisabled")
@Autowired
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Bean
public Consumer<String, Object> createConsumer(BackendApiSettings settings) {
return KafkaConsumerFactory.consumer(settings.getKafkaConsumer());
}
@Profile("kafkaDisabled")
@Bean
public Consumer<String, Object> createConsumerMock() {
return new MockConsumer<>(OffsetResetStrategy.NONE);
}
}

View file

@ -0,0 +1,28 @@
package ru.spcex.clearing.backendapi.config;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.enumeration.SpringPropertiesMessageResolver;
import java.util.Locale;
@Configuration
public class MessagesConfig {
@Bean("validation-error-messages")
public ResourceBundleMessageSource messages() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasenames("messages/error");
source.setUseCodeAsDefaultMessage(true);
source.setDefaultEncoding("utf8");
source.setDefaultLocale(Locale.ROOT);
return source;
}
@Bean("errorResolver")
public IMessageResolver errorResolver(@Qualifier("validation-error-messages") ResourceBundleMessageSource messageBundle) {
return new SpringPropertiesMessageResolver(messageBundle);
}
}

View file

@ -0,0 +1,39 @@
package ru.spcex.clearing.backendapi.config;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import ru.spcex.clearing.backendapi.meta.MetaServer;
import java.io.IOException;
import java.nio.file.Files;
@Configuration
public class MetaConfiguration {
@Value("file:${spring.config.location}/meta.json")
private Resource meta;
@Bean("metaJson")
public String metaJsonConfiguration() throws IOException {
if (!meta.isReadable()) throw new IllegalStateException("cannot read meta.json from spring.config.location");
return Files.readString(meta.getFile().toPath());
}
@Autowired
@Bean
public MetaServer metaServer(@Qualifier("metaJson") String metaJson) throws JsonProcessingException {
ObjectMapper jsonObjectMapper = new ObjectMapper();
jsonObjectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
jsonObjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
MetaServer metaServer = jsonObjectMapper.readValue(metaJson, MetaServer.class);
metaServer.initAndValidate();
return metaServer;
}
}

View file

@ -0,0 +1,39 @@
package ru.spcex.clearing.backendapi.config;
import com.google.common.base.Predicates;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@SuppressWarnings("Guava")
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("clearing-backend-api")
.apiInfo(metadata())
.select()
.apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.boot")))
.paths(PathSelectors.any())
.build()
.useDefaultResponseMessages(false);
}
private ApiInfo metadata() {
return new ApiInfoBuilder()
.title("Spcex Clearing service")
.description("Сервис клиринга")
.version("0.0.1")
.build();
}
}

View file

@ -0,0 +1,100 @@
package ru.spcex.clearing.backendapi.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.web.server.Cookie;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.boot.web.servlet.server.CookieSameSiteSupplier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.context.request.RequestContextListener;
import org.springframework.web.servlet.config.annotation.*;
import ru.spcex.clearing.backendapi.config.element.BackendApiSettings;
import java.util.List;
import java.util.function.Consumer;
@SuppressWarnings("Duplicates")
@Configuration
@EnableWebMvc
//todo remove? see ClearingCorsFilter
@CrossOrigin
public class WebConfig implements WebMvcConfigurer {
private final MappingJackson2HttpMessageConverter customJsonHttpConverter;
private final String sameSite;
@Autowired
public WebConfig(@Qualifier("customJsonHttpConverter") MappingJackson2HttpMessageConverter customJsonHttpConverter,
BackendApiSettings backendSettings
) {
this.customJsonHttpConverter = customJsonHttpConverter;
this.sameSite = backendSettings.getSecurity().getSameSite();
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Autowired
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
Consumer<HttpMessageConverter<?>> addConverter = httpMessageConverter -> {
messageConverters.removeIf(registeredConverter -> registeredConverter.getClass().equals(httpMessageConverter.getClass()));
messageConverters.add(httpMessageConverter);
};
addConverter.accept(new StringHttpMessageConverter());
addConverter.accept(customJsonHttpConverter);
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addRedirectViewController("/v2/api-docs", "/v2/api-docs?group=api");
registry.addRedirectViewController("/swagger-resources/configuration/ui", "/swagger-resources/configuration/ui");
registry.addRedirectViewController("/swagger-resources/configuration/security", "/swagger-resources/configuration/security");
registry.addRedirectViewController("/swagger-resources", "/swagger-resources");
registry.addRedirectViewController("", "/swagger-ui.html");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/swagger-ui.html**")
.addResourceLocations("classpath:/META-INF/resources/swagger-ui.html");
}
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> enableDefaultServlet() {
return (factory) -> factory.setRegisterDefaultServlet(true);
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedMethods("*");
}
@Bean
public RequestContextListener requestContextListener() {
return new RequestContextListener();
}
@Bean
public CookieSameSiteSupplier applicationCookieSameSiteSupplier() {
if (sameSite == null) {
return null;
} else if (sameSite.equalsIgnoreCase(Cookie.SameSite.NONE.attributeValue())) {
return CookieSameSiteSupplier.ofNone();
} else if (sameSite.equalsIgnoreCase(Cookie.SameSite.LAX.attributeValue())) {
return CookieSameSiteSupplier.ofLax();
} else if (sameSite.equalsIgnoreCase(Cookie.SameSite.STRICT.attributeValue())) {
return CookieSameSiteSupplier.ofStrict();
} else {
throw new IllegalStateException("unknown SameSite setting");
}
}
}

View file

@ -0,0 +1,69 @@
package ru.spcex.clearing.backendapi.config.element;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.backendapi.security.element.SecuritySettings;
import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings;
import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings;
import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams;
@Component
@PropertySource("file:${spring.config.location}/application.properties")
@ConfigurationProperties("backend-api")
public class BackendApiSettings {
private HazelcastClientParams hazelcast;
private HazelcastClientParams hazelcastSearch;
private KafkaProducerSettings kafkaProducer;
private KafkaConsumerSettings kafkaConsumer;
private SecuritySettings security;
private String exampleSetting;
public HazelcastClientParams getHazelcast() {
return hazelcast;
}
public void setHazelcast(HazelcastClientParams hazelcast) {
this.hazelcast = hazelcast;
}
public KafkaProducerSettings getKafkaProducer() {
return kafkaProducer;
}
public void setKafkaProducer(KafkaProducerSettings kafkaProducer) {
this.kafkaProducer = kafkaProducer;
}
public KafkaConsumerSettings getKafkaConsumer() {
return kafkaConsumer;
}
public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) {
this.kafkaConsumer = kafkaConsumer;
}
public String getExampleSetting() {
return exampleSetting;
}
public void setExampleSetting(String exampleSetting) {
this.exampleSetting = exampleSetting;
}
public SecuritySettings getSecurity() {
return security;
}
public void setSecurity(SecuritySettings security) {
this.security = security;
}
public HazelcastClientParams getHazelcastSearch() {
return hazelcastSearch;
}
public void setHazelcastSearch(HazelcastClientParams hazelcastSearch) {
this.hazelcastSearch = hazelcastSearch;
}
}

View file

@ -1,40 +0,0 @@
package ru.spcex.clearing.backendapi.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.spcex.clearing.backendapi.config.BackendApiSettings;
@Controller("/")
public class DefaultController implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
@RequestMapping(method = RequestMethod.GET, path = "/anonymous/method1", produces = MediaType.TEXT_PLAIN_VALUE)
@ResponseBody
public String processGet() {
log.info("Call test method for backend-api controller");
return "backend-api controller test method";
}
@RequestMapping(method = RequestMethod.GET, path = "/users/method2", produces = MediaType.TEXT_PLAIN_VALUE)
@ResponseBody
public String processProtectedGet() {
log.info("controller method2");
return "use post";
}
@Autowired
private BackendApiSettings settings;
@Override
public void afterPropertiesSet() throws Exception {
log.info("controller started");
log.info("settings example {}", settings.getExampleSetting());
}
}

View file

@ -1,48 +0,0 @@
package ru.spcex.clearing.backendapi.controller;
import org.keycloak.KeycloakSecurityContext;
import org.keycloak.adapters.RefreshableKeycloakSecurityContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.client.RestTemplate;
import ru.spcex.clearing.backendapi.security.TokenRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
@Controller
@RequestMapping("/backend-api-login")
public class LoginController {
private final RestTemplate restTemplate;
@Autowired
public LoginController(@Qualifier("clearing-rest") RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@RequestMapping(value = "/perform-login", method = RequestMethod.POST)
public ResponseEntity<Map<String, Object>> refreshToken(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
RefreshableKeycloakSecurityContext session = (RefreshableKeycloakSecurityContext) httpServletRequest.getSession().getAttribute(KeycloakSecurityContext.class.getName());
String login = httpServletRequest.getHeader("clearing-login");
String password = httpServletRequest.getHeader("clearing-password");
HttpEntity<MultiValueMap<String, String>> request =
new TokenRequest.Builder()
.username(login)
.password(password)
.build();
ResponseEntity<String> response = restTemplate.postForEntity(
"http://10.200.200.147:8080/realms/master/protocol/openid-connect/token",
request, String.class);
return null;
}
}

View file

@ -0,0 +1,35 @@
package ru.spcex.clearing.backendapi.controller.queue;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.backendapi.service.IOperator;
import java.util.Objects;
import java.util.concurrent.ExecutionException;
public abstract class AbstractQueueController {
private final IOperator operator;
public AbstractQueueController(IOperator operator) {
this.operator = operator;
}
protected <T> CudResponse processRequest(String destination, IAction<T> iAction) throws ExecutionException, InterruptedException {
CudResponse responseToClient = new CudResponse();
responseToClient.setPayload(operator.sendRequestToQueue(destination, iAction, true));
responseToClient.setCode(0);
responseToClient.setMessage("success");
return responseToClient;
}
/**
* Для оптимизации передачи userId
*/
protected <T> CudResponse processRequest(String destination, IAction<T> iAction, Long userId) throws ExecutionException, InterruptedException {
CudResponse responseToClient = new CudResponse();
responseToClient.setPayload(operator.sendRequestToQueue(destination, iAction, userId));
responseToClient.setCode(0);
responseToClient.setMessage("success");
return responseToClient;
}
}

View file

@ -0,0 +1,89 @@
package ru.spcex.clearing.backendapi.controller.queue;
import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.errors.ActionValidationException;
import ru.spcex.clearing.backendapi.errors.BackEndError;
import ru.spcex.clearing.backendapi.errors.NotFound404Exception;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.log.ExceptionUtils;
@ControllerAdvice("ru.spcex.clearing.backendapi.controller.queue")
@Order(Ordered.HIGHEST_PRECEDENCE)
public class QueueExceptionHandler extends ResponseEntityExceptionHandler {
private final Logger log = LoggerFactory.getLogger(getClass());
private final IMessageResolver errorResolver;
@Autowired
public QueueExceptionHandler(@Qualifier("errorResolver") IMessageResolver errorResolver) {
this.errorResolver = errorResolver;
}
@ExceptionHandler(value = ActionValidationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public BasicSpcexResponse handleValidationException(ActionValidationException e) {
log.error("Default exception handler: {}", ExceptionUtils.getStackTrace(e));
EnumMessage firstError = e.getErrors().iterator().next();
BasicSpcexResponse errorResponse = new BasicSpcexResponse();
errorResponse.setCode(firstError.getSubject().getId());
errorResponse.setMessage(errorResolver.resolve(firstError));
return errorResponse;
}
@Override
protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
BasicSpcexResponse errorResponse = new BasicSpcexResponse();
EnumMessage message;
try {
UnrecognizedPropertyException jacksonException = (UnrecognizedPropertyException) ex.getCause();
message = new EnumMessage(BackEndError.UnknownJsonProperty, jacksonException.getPropertyName());
} catch (ClassCastException e) {
log.error(ExceptionUtils.getStackTrace(ex));
message = new EnumMessage(BackEndError.FailedToReadHttpMessage);
}
errorResponse.setCode(message.getSubject().getId());
errorResponse.setMessage(errorResolver.resolve(message));
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(NotFound404Exception.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND)
@ResponseBody
public BasicSpcexResponse notFoundEx(NotFound404Exception ex) {
BasicSpcexResponse response = new BasicSpcexResponse();
EnumMessage message = ex.getError();
response.setCode(message.getSubject().getId());
response.setMessage(errorResolver.resolve(message));
return response;
}
@ExceptionHandler(value = Throwable.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public BasicSpcexResponse handleDefault(Throwable e) {
log.error("Default exception handler: {}", ExceptionUtils.getStackTrace(e));
BasicSpcexResponse errorResponse = new BasicSpcexResponse();
errorResponse.setCode(-1);
errorResponse.setMessage("internal server error");
return errorResponse;
}
}

View file

@ -0,0 +1,85 @@
package ru.spcex.clearing.backendapi.controller.queue.account;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.account.Account;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.account.AccountNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.account.AccountUpdateAction;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/accounting/accounts")
public class AccountController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public AccountController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all accounts.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Account, Account.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "create account.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse add(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody AccountNewAction accountNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_NEW, accountNewAction);
}
@ApiOperation(value = "update account.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody AccountUpdateAction accountUpdateAction) throws ExecutionException, InterruptedException {
accountUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_UPDATE, accountUpdateAction);
}
@ApiOperation(value = "delete account.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_BLOCK, deleteAction);
}
}

View file

@ -0,0 +1,71 @@
package ru.spcex.clearing.backendapi.controller.queue.account;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.account.AccountSymbols;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.account.AccountSymbolsNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/accounting/depo-accounts-symbols")
public class AccountSymbolsController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public AccountSymbolsController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all accounts-symbols.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "create AccountSymbols.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse add(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody AccountSymbolsNewAction accountNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_DEPO_ACCOUNT_SYMBOLS_NEW, accountNewAction);
}
@ApiOperation(value = "delete AccountSymbols.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_DEPO_ACCOUNT_SYMBOLS_DELETE, deleteAction);
}
}

View file

@ -0,0 +1,103 @@
package ru.spcex.clearing.backendapi.controller.queue.account;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.account.BankAccount;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.account.BankAccountNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.account.BankAccountUpdateAction;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetByIdResponse;
import ru.spcex.clearing.backendapi.meta.GetResponseFactory;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/accounting/bank-accounts")
public class BankAccountController extends AbstractQueueController {
private final IStateLoader stateLoader;
private final GetResponseFactory responseMetaFactory;
@Autowired
public BankAccountController(GetResponseFactory responseMetaFactory, IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
this.responseMetaFactory = responseMetaFactory;
}
@ApiOperation(value = "create bank account.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse add(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody BankAccountNewAction bankAccountNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_BANK_ACCOUNT_NEW, bankAccountNewAction);
}
@ApiOperation(value = "update bank account.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody BankAccountUpdateAction bankAccountUpdateAction) throws ExecutionException, InterruptedException {
bankAccountUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_BANK_ACCOUNT_UPDATE, bankAccountUpdateAction);
}
@ApiOperation(value = "delete bank account.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_BANK_ACCOUNT_BLOCK, deleteAction);
}
@ApiOperation(value = "get bank account.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetByIdResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@ResponseBody
public CommonGetByIdResponse getById(@ApiParam(value = "Идентификатор объекта", required = true, example = "1234")
@PathVariable("id") Long id) {
Optional<BankAccount> bankAccount = stateLoader.getById(id, IMDGDistributedNames.Map_BankAccount, BankAccount.class);
CommonGetByIdResponse response = new CommonGetByIdResponse();
bankAccount.ifPresentOrElse( r -> {
Map<String, Object> extractedByMeta = responseMetaFactory.responseFromObject(r);
response.fromEntity(extractedByMeta);
}, () -> response.setCode(404));
return response;
}
@ApiOperation(value = "get all bank accounts.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_BankAccount, BankAccount.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,39 @@
package ru.spcex.clearing.backendapi.controller.queue.account;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/accounting/clearing-accounts")
public class ClearingAccountController {
private final IStateLoader stateLoader;
@Autowired
public ClearingAccountController(IStateLoader stateLoader) {
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all clearing account.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,84 @@
package ru.spcex.clearing.backendapi.controller.queue.account;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.account.ClientCodeNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.account.ClientCodeUpdateAction;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/client-codes")
public class ClientCodeController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public ClientCodeController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "create client code.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse add(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ClientCodeNewAction clientCodeNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_CLIENT_CODE_NEW, clientCodeNewAction);
}
@ApiOperation(value = "update client-code.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody ClientCodeUpdateAction clientCodeUpdateAction) throws ExecutionException, InterruptedException {
clientCodeUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_CLIENT_CODE_UPDATE, clientCodeUpdateAction);
}
@ApiOperation(value = "delete client code.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_CLIENT_CODE_DELETE, deleteAction);
}
@ApiOperation(value = "get all client codes.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,39 @@
package ru.spcex.clearing.backendapi.controller.queue.account;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/accounting/depo-accounts")
public class DepoAccountController {
private final IStateLoader stateLoader;
@Autowired
public DepoAccountController(IStateLoader stateLoader) {
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all depo account.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,63 @@
package ru.spcex.clearing.backendapi.controller.queue.account;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.account.AccountInformationNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.account.BankAccountNewAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/accounting/information-accounts")
public class InformationAccountController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public InformationAccountController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all information accounts.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_InformationAccount,
InformationAccount.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
// @ApiOperation(value = "Добавление информационного счета.")
// @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
// @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
// @ResponseBody
// public CudResponse add(
// @ApiParam(value = "Параметры команды в JSON формате.", required = true)
// @RequestBody AccountInformationNewAction accountNewInformationAction) throws ExecutionException, InterruptedException {
// return processRequest(Consts.DESTINATION_INFORMATION_ACCOUNT_NEW, accountNewInformationAction);
// }
}

View file

@ -0,0 +1,40 @@
package ru.spcex.clearing.backendapi.controller.queue.clearing;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.clearing.VerificationResult;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/verification-results")
public class VerificationResultController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public VerificationResultController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all VerificationResult's.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_VerificationResult, VerificationResult.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,83 @@
package ru.spcex.clearing.backendapi.controller.queue.company;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.ClearingMemberCategoryNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.ClearingMemberCategoryUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/clearing-member-categories")
public class ClearingMemberCategoryController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public ClearingMemberCategoryController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "new clearing category.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse add(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ClearingMemberCategoryNewAction clearingMemberCategoryNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_CLEARING_MEMBER_CATEGORY_NEW, clearingMemberCategoryNewAction);
}
@ApiOperation(value = "update clearing member category.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody ClearingMemberCategoryUpdateAction clearingMemberCategoryUpdateAction) throws ExecutionException, InterruptedException {
clearingMemberCategoryUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_CLEARING_MEMBER_CATEGORY_UPDATE, clearingMemberCategoryUpdateAction);
}
@ApiOperation(value = "delete clearing member category.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_CLEARING_MEMBER_CATEGORY_DELETE, deleteAction);
}
@ApiOperation(value = "get all ClearingMemberCategories.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,70 @@
package ru.spcex.clearing.backendapi.controller.queue.company;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.company.Company;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.CompanyNewAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/companies")
public class CompanyController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public CompanyController(IOperator operator,
IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "delete company.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_COMPANY_DELETE, deleteAction);
}
@ApiOperation(value = "get all Company's.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Company, Company.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "new company.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse add(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody CompanyNewAction companyNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_COMPANY_NEW, companyNewAction);
}
}

View file

@ -0,0 +1,67 @@
package ru.spcex.clearing.backendapi.controller.queue.company;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.company.Company;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.company.CompanyInfoUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.company.CompanyInfoBackendGetAll;
import ru.spcex.clearing.backendapi.meta.GetResponseFactory;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/company-infos")
public class CompanyInfoController extends AbstractQueueController {
private final Imdg<Company> companyImdg;
private final GetResponseFactory responseFactory;
@Autowired
public CompanyInfoController(IOperator operator, ImdgProvider imdgProvider, GetResponseFactory responseFactory) {
super(operator);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.responseFactory = responseFactory;
}
@ApiOperation(value = "update company info.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody CompanyInfoUpdateAction companyInfoUpdateAction) throws ExecutionException, InterruptedException {
companyInfoUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_COMPANY_INFO_UPDATE, companyInfoUpdateAction);
}
@ApiOperation(value = "get all CompanyInfo's.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CompanyInfoBackendGetAll.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CompanyInfoBackendGetAll getAll() {
Collection<Map<String, Object>> all = new ArrayList<>();
Collection<Company> companies = companyImdg.getAllValues();
CompanyInfoBackendGetAll response = new CompanyInfoBackendGetAll();
response.fromEntity(companies);
return response;
}
}

View file

@ -0,0 +1,72 @@
package ru.spcex.clearing.backendapi.controller.queue.company;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.company.CompanyRoleSet;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.CompanyRoleSetNewAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/company-role-sets")
public class CompanyRoleSetController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public CompanyRoleSetController(IOperator operator,
IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all CompanyRoleSet's.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_CompanyRoleSet,
CompanyRoleSet.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "create CompanyRoleSet.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse create(
@ApiParam(value = "Значения полей нового объекта.", required = true)
@RequestBody CompanyRoleSetNewAction companyRoleSetNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_COMPANY_ROLE_SET_NEW, companyRoleSetNewAction);
}
@ApiOperation(value = "delete CompanyRoleSet.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_COMPANY_ROLE_SET_DELETE, deleteAction);
}
}

View file

@ -0,0 +1,86 @@
package ru.spcex.clearing.backendapi.controller.queue.company;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.CompanySymbolNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.CompanySymbolUpdateAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.ContactNewAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/company-symbols")
public class CompanySymbolController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public CompanySymbolController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "create company symbol.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse create(
@ApiParam(value = "Значения полей нового объекта.", required = true)
@RequestBody CompanySymbolNewAction companySymbolNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_COMPANY_SYMBOL_NEW, companySymbolNewAction);
}
@ApiOperation(value = "update company symbol.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody CompanySymbolUpdateAction companySymbolsUpdateAction) throws ExecutionException, InterruptedException {
companySymbolsUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_COMPANY_SYMBOL_UPDATE, companySymbolsUpdateAction);
}
@ApiOperation(value = "get all CompanySymbols")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "delete company symbol.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_COMPANY_SYMBOL_DELETE, deleteAction);
}
}

View file

@ -0,0 +1,83 @@
package ru.spcex.clearing.backendapi.controller.queue.company;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.profile.Contact;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.ContactNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.ContactUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/contacts")
public class ContactController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public ContactController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "update company contact.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody ContactUpdateAction contactUpdateAction) throws ExecutionException, InterruptedException {
contactUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_CONTACT_UPDATE, contactUpdateAction);
}
@ApiOperation(value = "create company contact.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse create(
@ApiParam(value = "Значения полей нового объекта.", required = true)
@RequestBody ContactNewAction contactNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_CONTACT_NEW, contactNewAction);
}
@ApiOperation(value = "delete contact.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_CONTACT_DELETE, deleteAction);
}
@ApiOperation(value = "get all Contacts.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Contact, Contact.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,83 @@
package ru.spcex.clearing.backendapi.controller.queue.company;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.profile.ProfileDocument;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.ProfileDocumentNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.ProfileDocumentUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/profile-documents")
public class ProfileDocumentController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public ProfileDocumentController(IStateLoader stateLoader, IOperator operator) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all ProfileDocuments.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "new profile document.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse add(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ProfileDocumentNewAction profileDocumentNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_PROFILE_DOCUMENT_NEW, profileDocumentNewAction);
}
@ApiOperation(value = "update profile document.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@PathVariable("id") Long id,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ProfileDocumentUpdateAction profileDocumentUpdateAction) throws ExecutionException, InterruptedException {
profileDocumentUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_PROFILE_DOCUMENT_UPDATE, profileDocumentUpdateAction);
}
@ApiOperation(value = "delete profile document.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_PROFILE_DOCUMENT_DELETE, deleteAction);
}
}

View file

@ -0,0 +1,61 @@
package ru.spcex.clearing.backendapi.controller.queue.company;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.company.RelationUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/relations")
public class RelationController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public RelationController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all Relation's.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_Relation, Relation.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "update relation.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody RelationUpdateAction relationUpdateAction) throws ExecutionException, InterruptedException {
relationUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_RELATION_UPDATE, relationUpdateAction);
}
}

View file

@ -0,0 +1,55 @@
package ru.spcex.clearing.backendapi.controller.queue.execution;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/execution-deposits")
public class ExecutionDepositController extends AbstractQueueController {
private final IStateLoader stateLoader;
private final ImdgPredicateBuilder imdgPredicateBuilder;
@Autowired
public ExecutionDepositController(IOperator operator, IStateLoader stateLoader,
ImdgProvider imdgProvider) {
super(operator);
this.stateLoader = stateLoader;
this.imdgPredicateBuilder = imdgProvider
.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class)
.predicateBuilder();
}
@ApiOperation(value = "get all ExecutionDeposits.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
ImdgPredicate imdgPredicate = imdgPredicateBuilder.greatEqual("firstLegSettlementDate", LocalDate.now());
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_ExecutionDeposit,
ExecutionDeposit.class,
imdgPredicate);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,56 @@
package ru.spcex.clearing.backendapi.controller.queue.execution;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/execution-fonds")
public class ExecutionFondController extends AbstractQueueController {
private final IStateLoader stateLoader;
private final ImdgPredicateBuilder imdgPredicateBuilder;
@Autowired
public ExecutionFondController(IOperator operator,
IStateLoader stateLoader,
ImdgProvider imdgProvider) {
super(operator);
this.stateLoader = stateLoader;
this.imdgPredicateBuilder = imdgProvider
.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class)
.predicateBuilder();
}
@ApiOperation(value = "get all ExecutionFond.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
ImdgPredicate imdgPredicate = imdgPredicateBuilder.greatEqual("settlementDate", LocalDate.now());
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_ExecutionFond,
ExecutionFond.class,
imdgPredicate);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,95 @@
package ru.spcex.clearing.backendapi.controller.queue.history;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.ConditionProvider;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.HistorySubscription;
import ru.spcex.clearing.backendapi.controller.request.cud.history.HistoryRequest;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.errors.ActionValidationException;
import ru.spcex.clearing.backendapi.errors.BackEndError;
import ru.spcex.clearing.backendapi.meta.GetResponseFactory;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
@Controller
@RequestMapping("/history")
public class HistController {
private final GetResponseFactory responseFactory;
private final IStateLoader stateLoader;
private final ConditionProvider conditionProvider;
@Autowired
public HistController(GetResponseFactory responseFactory,
IStateLoader stateLoader,
ConditionProvider conditionProvider) {
this.responseFactory = responseFactory;
this.stateLoader = stateLoader;
this.conditionProvider = conditionProvider;
}
@ApiOperation(value = "Get history")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getHistory(
@ApiParam(value = "destination сущности по которой запрашивается история", example = "money-balance-registers", required = true)
@RequestParam("destination")
String destination,
@ApiParam(value = "Начальная точка поиска по дате", example = "2023-01-15")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
@RequestParam(name = "from", required = false)
LocalDate from,
@ApiParam(value = "Конечная точка поиска по дате", example = "2023-01-15")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
@RequestParam(name = "to", required = false)
LocalDate to
) {
if (to == null && from == null) {
throw new ActionValidationException(new EnumMessage(BackEndError.ValidationError, "from/to url params both empty"));
}
Optional<Class<? extends SpcexObjectBase>> entityClass = responseFactory.classByDestination(destination);
//class may be added to HistorySubscription if needed
if (entityClass.isEmpty()) {
throw new ActionValidationException(new EnumMessage(BackEndError.ValidationError,
"destination " + "'" + destination + "' not supported (meta class not found)"));
}
HistoryRequest req = new HistoryRequest();
req.setTable(destination);
req.setFrom(from);
req.setTo(to);
HistorySubscription[] subscr = new HistorySubscription[1];
ImdgPredicate[] prdct = new ImdgPredicate[1];
conditionProvider.conditionForRequest(req).map(s -> subscr[0] = s, p -> prdct[0] = p);
Collection<Map<String, Object>> searchRes = stateLoader.getAllMetaTransform(
subscr[0].getSearchProxyMapName(),
subscr[0].getFullHistoryMapName(),
entityClass.get(),
prdct[0]
);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(searchRes);
return response;
}
}

View file

@ -0,0 +1,72 @@
package ru.spcex.clearing.backendapi.controller.queue.history.condition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.backendapi.controller.request.cud.history.HistoryRequest;
import ru.spcex.clearing.backendapi.errors.ActionValidationException;
import ru.spcex.clearing.backendapi.errors.BackEndError;
import ru.spcex.clearing.backendapi.meta.GetResponseFactory;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.classes.base.SpcexObjectBase;
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.utils.collection.Pair;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@Component
public class ConditionProvider {
private final Logger log = LoggerFactory.getLogger(getClass());
private final GetResponseFactory responseFactory;
private final ImdgPredicateBuilder pb;
private final Map<String, HistorySubscription> subscriptions;
@Autowired
public ConditionProvider(GetResponseFactory responseFactory, ImdgProvider imdgProvider,
List<HistorySubscription> subscriptions) {
this.responseFactory = responseFactory;
this.subscriptions = new HashMap<>();
Imdg<SpcexObjectBase> imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SearchMoneyBalanceRegister, SpcexObjectBase.class);
this.pb = imdg.predicateBuilder();
subscriptions.forEach(s -> this.subscriptions.put(s.getDestination(), s));
}
public Pair<HistorySubscription, ImdgPredicate> conditionForRequest(HistoryRequest req) {
String destination = req.getTable();
HistorySubscription subscription = subscriptions.get(destination);
if (subscription == null) {
throw new ActionValidationException(new EnumMessage(BackEndError.ValidationError,
"destination " + "'" + destination + "' not supported (subscription info not found)"));
}
List<ImdgPredicate> predicates = subscription
.getConditions()
.stream()
.map(c -> c.condition(req))
.filter(Optional::isPresent)
.map(Optional::get)
.toList();
ImdgPredicate result;
if (predicates.size() == 0) {
//add boundary conditions?
log.warn("destination '{}' zero predicates found", destination);
result = pb.alwaysTrue();
} else if (predicates.size() == 1) {
result = predicates.iterator().next();
} else {
result = pb.and(predicates.toArray(new ImdgPredicate[0]));
}
return new Pair<>(subscription, result);
}
}

View file

@ -0,0 +1,46 @@
package ru.spcex.clearing.backendapi.controller.queue.history.condition;
import java.util.Collections;
import java.util.List;
public class HistorySubscription {
private String destination;
private List<IHistoryCondition> conditions;
private String searchProxyMapName;
private String fullHistoryMapName;
//class
public List<IHistoryCondition> getConditions() {
return conditions != null ? conditions : Collections.emptyList();
}
public void setConditions(List<IHistoryCondition> conditions) {
this.conditions = conditions;
}
public String getSearchProxyMapName() {
return searchProxyMapName;
}
public void setSearchProxyMapName(String searchProxyMapName) {
this.searchProxyMapName = searchProxyMapName;
}
public String getFullHistoryMapName() {
return fullHistoryMapName;
}
public void setFullHistoryMapName(String fullHistoryMapName) {
this.fullHistoryMapName = fullHistoryMapName;
}
public String getDestination() {
return destination;
}
public void setDestination(String destination) {
this.destination = destination;
}
}

View file

@ -0,0 +1,15 @@
package ru.spcex.clearing.backendapi.controller.queue.history.condition;
import ru.spcex.clearing.backendapi.controller.request.cud.history.HistoryRequest;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import java.util.Optional;
public interface IHistoryCondition {
Optional<ImdgPredicate> condition(HistoryRequest req);
default Optional<ImdgPredicate> of(ImdgPredicate predicate) {
return Optional.of(predicate);
}
}

View file

@ -0,0 +1,25 @@
package ru.spcex.clearing.backendapi.controller.queue.history.condition.specific;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.IHistoryCondition;
import ru.spcex.clearing.backendapi.controller.request.cud.history.HistoryRequest;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.util.Optional;
public class ClearingDateFromCondition implements IHistoryCondition {
private final ImdgPredicateBuilder pb;
public ClearingDateFromCondition(ImdgPredicateBuilder pb) {
this.pb = pb;
}
@Override
public Optional<ImdgPredicate> condition(HistoryRequest req) {
if (req.getFrom() != null) {
return Optional.ofNullable(pb.greatEqual("clearingDate", req.getFrom()));
}
return Optional.empty();
}
}

View file

@ -0,0 +1,25 @@
package ru.spcex.clearing.backendapi.controller.queue.history.condition.specific;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.IHistoryCondition;
import ru.spcex.clearing.backendapi.controller.request.cud.history.HistoryRequest;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.util.Optional;
public class ClearingDateToCondition implements IHistoryCondition {
private final ImdgPredicateBuilder pb;
public ClearingDateToCondition(ImdgPredicateBuilder pb) {
this.pb = pb;
}
@Override
public Optional<ImdgPredicate> condition(HistoryRequest req) {
if (req.getTo() != null) {
return Optional.ofNullable(pb.lessEqual("clearingDate", req.getTo()));
}
return Optional.empty();
}
}

View file

@ -0,0 +1,26 @@
package ru.spcex.clearing.backendapi.controller.queue.history.condition.specific;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.IHistoryCondition;
import ru.spcex.clearing.backendapi.controller.request.cud.history.HistoryRequest;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.time.TimeUtil;
import java.util.Optional;
public class CreatedFromCondition implements IHistoryCondition {
private final ImdgPredicateBuilder pb;
public CreatedFromCondition(ImdgPredicateBuilder pb) {
this.pb = pb;
}
@Override
public Optional<ImdgPredicate> condition(HistoryRequest req) {
if (req.getFrom() != null) {
return Optional.of(pb.greatEqual("created", TimeUtil.localDateToInstant(req.getFrom())));
}
return Optional.empty();
}
}

View file

@ -0,0 +1,26 @@
package ru.spcex.clearing.backendapi.controller.queue.history.condition.specific;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.IHistoryCondition;
import ru.spcex.clearing.backendapi.controller.request.cud.history.HistoryRequest;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.time.TimeUtil;
import java.util.Optional;
public class CreatedToCondition implements IHistoryCondition {
private final ImdgPredicateBuilder pb;
public CreatedToCondition(ImdgPredicateBuilder pb) {
this.pb = pb;
}
@Override
public Optional<ImdgPredicate> condition(HistoryRequest req) {
if (req.getTo() != null) {
return Optional.of(pb.lessEqual("created", TimeUtil.localDateToInstant(req.getTo())));
}
return Optional.empty();
}
}

View file

@ -0,0 +1,25 @@
package ru.spcex.clearing.backendapi.controller.queue.history.condition.specific;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.IHistoryCondition;
import ru.spcex.clearing.backendapi.controller.request.cud.history.HistoryRequest;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.util.Optional;
public class TradingDateFromCondition implements IHistoryCondition {
private final ImdgPredicateBuilder pb;
public TradingDateFromCondition(ImdgPredicateBuilder pb) {
this.pb = pb;
}
@Override
public Optional<ImdgPredicate> condition(HistoryRequest req) {
if (req.getFrom() != null) {
return Optional.ofNullable(pb.greatEqual("tradingDate", req.getFrom()));
}
return Optional.empty();
}
}

View file

@ -0,0 +1,25 @@
package ru.spcex.clearing.backendapi.controller.queue.history.condition.specific;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.IHistoryCondition;
import ru.spcex.clearing.backendapi.controller.request.cud.history.HistoryRequest;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.util.Optional;
public class TradingDateToCondition implements IHistoryCondition {
private final ImdgPredicateBuilder pb;
public TradingDateToCondition(ImdgPredicateBuilder pb) {
this.pb = pb;
}
@Override
public Optional<ImdgPredicate> condition(HistoryRequest req) {
if (req.getTo() != null) {
return Optional.ofNullable(pb.lessEqual("tradingDate", req.getTo()));
}
return Optional.empty();
}
}

View file

@ -0,0 +1,44 @@
package ru.spcex.clearing.backendapi.controller.queue.journal;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.journal.InDocumentJournal;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/in-document-journals")
public class InDocumentJournalController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public InDocumentJournalController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all InDocumentJournals.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_InDocumentJournal,
InDocumentJournal.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,44 @@
package ru.spcex.clearing.backendapi.controller.queue.journal;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.journal.ManagementJournal;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/management-journals")
public class ManagementJournalController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public ManagementJournalController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all management journals.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_ManagementJournal,
ManagementJournal.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,44 @@
package ru.spcex.clearing.backendapi.controller.queue.journal;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.journal.OutDocumentJournal;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/out-document-journals")
public class OutDocumentJournalController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public OutDocumentJournalController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all OutDocumentJournals.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_OutDocumentJournal,
OutDocumentJournal.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,43 @@
package ru.spcex.clearing.backendapi.controller.queue.misc;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.misc.Currency;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/currencies")
public class CurrencyController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public CurrencyController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all currencies.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_Currency, Currency.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,43 @@
package ru.spcex.clearing.backendapi.controller.queue.misc;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.messages.ErrorText;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/error-texts")
public class ErrorTextController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public ErrorTextController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all ErrorText's.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_ErrorText, ErrorText.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,85 @@
package ru.spcex.clearing.backendapi.controller.queue.misc;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import ru.clearing.classes.statics.data.misc.Listing;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.common.CommonDeleteAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.ListingNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.ListingUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/listings")
public class ListingController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public ListingController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all listings.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Listing, Listing.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "create Listing.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse create(
@ApiParam(value = "Значения полей нового объекта.", required = true)
@RequestBody ListingNewAction listingNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.LISTING_NEW, listingNewAction);
}
@ApiOperation(value = "update Listing.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Новые значения полей объекта.", required = true)
@RequestBody ListingUpdateAction listingUpdateAction) throws ExecutionException, InterruptedException {
listingUpdateAction.setId(id);
return processRequest(Consts.LISTING_UPDATE, listingUpdateAction);
}
@ApiOperation(value = "delete Listing.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
public CudResponse delete(@ApiParam(value = "Идентификатор удаляемого объекта", required = true, example = "1234")
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.LISTING_DELETE, deleteAction);
}
}

View file

@ -0,0 +1,43 @@
package ru.spcex.clearing.backendapi.controller.queue.misc;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.misc.Market;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/markets")
public class MarketController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public MarketController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all markets.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_Market, Market.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,60 @@
package ru.spcex.clearing.backendapi.controller.queue.misc;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.misc.Notification;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.NotificationUpdateAction;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/notifications")
public class NotificationController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public NotificationController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all notifications.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Notification, Notification.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "create Notification.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody NotificationUpdateAction notificationUpdateAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.NOTIFICATION_UPDATE, notificationUpdateAction);
}
}

View file

@ -0,0 +1,42 @@
package ru.spcex.clearing.backendapi.controller.queue.misc;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.misc.Session;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/sessions")
public class SessionController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public SessionController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all sessions.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Session, Session.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,60 @@
package ru.spcex.clearing.backendapi.controller.queue.payment;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.payment.PaymentInstruction;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.payment.PIClearingOutbondActionNew;
import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse;
import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/payment-instructions")
public class PaymentInstructionController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public PaymentInstructionController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all paymentInstructions.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_PaymentInstruction, PaymentInstruction.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "Досрочное изъятие части денежных средств по договору")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/clearing-outbound", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse clearingOutboundAction(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody PIClearingOutbondActionNew piClearingOutbondAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.PAYMENT_INSTRUCTION_CLEARING_OUTBOUND_ACTION, piClearingOutbondAction);
}
}

View file

@ -0,0 +1,44 @@
package ru.spcex.clearing.backendapi.controller.queue.register;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.register.AdmittedLiabilitiesRegister;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/admitted-liabilities-registers")
public class AdmittedLiabilitiesRegisterController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public AdmittedLiabilitiesRegisterController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all admittedLiabilitiesRegister's")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_AdmittedLiabilitiesRegister,
AdmittedLiabilitiesRegister.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,44 @@
package ru.spcex.clearing.backendapi.controller.queue.register;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.register.ContractRegister;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/contract-registers")
public class ContractRegisterController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public ContractRegisterController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all contract registers.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_ContractRegister,
ContractRegister.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,44 @@
package ru.spcex.clearing.backendapi.controller.queue.register;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.register.CoveredLiabilitiesRegister;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/covered-liabilities-registers")
public class CoveredLiabilitiesRegisterController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public CoveredLiabilitiesRegisterController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all coveredLiabilitiesRegister's")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_CoveredLiabilitiesRegister,
CoveredLiabilitiesRegister.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,44 @@
package ru.spcex.clearing.backendapi.controller.queue.register;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.register.DepoBalanceRegister;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/depo-balance-registers")
public class DepoBalanceRegisterController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public DepoBalanceRegisterController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all depoBalanceRegister's")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_DepoBalanceRegister,
DepoBalanceRegister.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,45 @@
package ru.spcex.clearing.backendapi.controller.queue.register;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.register.DepoPaymentInstructionRegister;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/depo-payment-instruction-registers")
public class DepoPaymentInstructionRegisterController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public DepoPaymentInstructionRegisterController(IOperator operator,
IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all depoPaymentInstructionRegister's")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_DepoPaymentInstructionRegister,
DepoPaymentInstructionRegister.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,44 @@
package ru.spcex.clearing.backendapi.controller.queue.register;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.register.ExcludeLiabilitiesRegister;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import java.util.Collection;
import java.util.Map;
@Controller
@RequestMapping("/exclude-liabilities-registers")
public class ExcludeLiabilitiesRegisterController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public ExcludeLiabilitiesRegisterController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all excludeLiabilitiesRegister's")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_ExcludeLiabilitiesRegister,
ExcludeLiabilitiesRegister.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

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