Compare commits

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

1388 commits

Author SHA1 Message Date
etreschenkov
7c45242687 http://jira.mfd.msk:8088/browse/CLS-948 // http://jira.mfd.msk:8088/browse/CLS-949 2026-04-01 17:58:59 +03:00
etreschenkov
87f10edc26 http://jira.mfd.msk:8088/browse/CLS-911 2026-04-01 17:52:10 +03:00
etreschenkov
e31453e293 http://jira.mfd.msk:8088/browse/CLS-911 2026-04-01 14:56:44 +03:00
etreschenkov
46afedede1 http://jira.mfd.msk:8088/browse/CLS-911 2026-03-30 12:01:31 +03:00
etreschenkov
a122186b56 add fix-service to distr 2026-03-27 12:49:06 +03:00
ialbert
2aa9d21c70 Merge remote-tracking branch 'origin/dev' into dev 2026-03-27 12:38:04 +03:00
ialbert
a3967112ca http://jira.mfd.msk:8088/browse/CLS-944 2026-03-27 12:37:41 +03:00
etreschenkov
ab05f31031 up pom version 2026-03-27 10:33:26 +03:00
ialbert
5f92d863a5 Merge branch 'master' into dev 2026-03-24 17:35:03 +03:00
ialbert
3fed3b850d http://jira.mfd.msk:8088/browse/CLS-940 добавил шаг AgainReviseStage3Action CL09 в финальную сессию FinalSessionStateMachineConfig 2026-03-24 17:27:47 +03:00
etreschenkov
6928b84bdc http://jira.mfd.msk:8088/browse/CLS-941 2026-03-23 13:58:04 +03:00
etreschenkov
c9ef0ae75f http://jira.mfd.msk:8088/browse/CLS-939 2026-03-18 10:19:47 +03:00
etreschenkov
cf00b03faf Merge branch 'refs/heads/master' into dev
# Conflicts:
#	clearing-parent/backend-api/src/main/resources/meta/meta.json
#	clearing-parent/backend-api/src/main/resources/meta/meta.xml
2026-03-17 09:21:43 +03:00
etreschenkov
404ca8dcd8 http://jira.mfd.msk:8088/browse/CLS-927 2026-03-16 18:04:05 +03:00
etreschenkov
ebc2f4f684 change linkCode on market: description - code 2026-03-16 12:15:44 +03:00
etreschenkov
4505cbf929 http://jira.mfd.msk:8088/browse/CLS-927 2026-03-16 12:12:47 +03:00
etreschenkov
1be60f8eb0 http://jira.mfd.msk:8088/browse/CLS-927 2026-03-13 17:29:40 +03:00
etreschenkov
ca9f1086db http://jira.mfd.msk:8088/browse/CLS-927 2026-03-13 11:34:28 +03:00
etreschenkov
5f9b82df73 http://jira.mfd.msk:8088/browse/CLS-927 2026-03-13 11:34:28 +03:00
ialbert
b345a24dce Merge remote-tracking branch 'origin/dev' into dev 2026-03-12 16:36:10 +03:00
ialbert
ecdf62ac13 http://jira.mfd.msk:8088/browse/CLS-938 2026-03-12 16:35:47 +03:00
etreschenkov
13a464fe7d change linkCode on market: description - code 2026-03-12 16:02:13 +03:00
etreschenkov
e8abfc560f change linkCode on market: description - code 2026-03-12 15:59:59 +03:00
etreschenkov
56167c247a change linkCode on market: description - code 2026-03-12 14:14:40 +03:00
Mike Markelov
1a0a49bb63 fix-service 2026-03-10 15:36:35 +03:00
etreschenkov
2ef1e04430 http://jira.mfd.msk:8088/browse/CLS-936 2026-03-03 15:07:54 +03:00
etreschenkov
a2b3efd4b4 http://jira.mfd.msk:8088/browse/CLS-932 2026-03-03 14:49:38 +03:00
etreschenkov
679b5e0f18 http://jira.mfd.msk:8088/browse/CLS-926 2026-03-03 12:08:42 +03:00
etreschenkov
f49a8fd3dc http://jira.mfd.msk:8088/browse/CLS-926 2026-03-03 10:35:46 +03:00
etreschenkov
52ac896df8 http://jira.mfd.msk:8088/browse/CLS-935 2026-03-02 18:08:30 +03:00
etreschenkov
e4f8895c58 http://jira.mfd.msk:8088/browse/CLS-926 2026-02-27 13:47:45 +03:00
ialbert
0758c9654c http://jira.mfd.msk:8088/browse/CLS-933 2026-02-26 15:00:40 +03:00
ialbert
6a01cb328f Merge remote-tracking branch 'origin/dev' into dev 2026-02-26 13:12:34 +03:00
ialbert
90d802d370 http://jira.mfd.msk:8088/browse/CLS-934 2026-02-26 13:11:29 +03:00
etreschenkov
e8934d869c http://jira.mfd.msk:8088/browse/CLS-926 2026-02-25 17:14:26 +03:00
etreschenkov
80eff4bbfc http://jira.mfd.msk:8088/browse/CLS-926 2026-02-25 14:55:09 +03:00
etreschenkov
e55f68bd48 http://jira.mfd.msk:8088/browse/CLS-926 2026-02-25 14:46:13 +03:00
etreschenkov
924a6ec157 http://jira.mfd.msk:8088/browse/CLS-927 2026-02-25 10:46:30 +03:00
ialbert
02869b9ddd http://jira.mfd.msk:8088/browse/CLS-931 2026-02-18 12:24:03 +03:00
ialbert
a8d3822594 Merge remote-tracking branch 'origin/dev' into dev 2026-02-18 11:19:03 +03:00
ialbert
ec71cf9b61 http://jira.mfd.msk:8088/browse/CLS-931 2026-02-18 11:18:46 +03:00
etreschenkov
29aa713f22 up pom version 2026-02-18 10:16:52 +03:00
ialbert
478a1d92db http://jira.mfd.msk:8088/browse/CLS-931 2026-02-17 13:28:21 +03:00
etreschenkov
f02c2eb691 http://jira.mfd.msk:8088/browse/CLS-929 2026-02-13 13:25:10 +03:00
etreschenkov
e14f7872d9 update efis accounts 2026-02-13 10:34:36 +03:00
etreschenkov
faec0844e0 http://jira.mfd.msk:8088/browse/CLS-924 2026-02-05 18:18:48 +03:00
etreschenkov
564970af93 up pom version 2026-02-03 17:37:33 +03:00
etreschenkov
d06ec59dea http://jira.mfd.msk:8088/browse/CLS-924 2026-02-03 08:39:59 +03:00
ialbert
92b3705423 http://jira.mfd.msk:8088/browse/CLS-923 2026-01-30 15:29:09 +03:00
ialbert
5cb896d19e http://jira.mfd.msk:8088/browse/CLS-923 2026-01-27 13:01:15 +03:00
ialbert
db71d1ebd3 http://jira.mfd.msk:8088/browse/CLS-921 2025-12-18 11:21:37 +03:00
Ivan Nikolaev-Axenov
f5cab9ef6b openjdk:17-slim replaced with eclipse-temurin:17-jre-alpine in Dockerfile 2025-12-03 12:18:34 +03:00
etreschenkov
f20739ed71 http://jira.mfd.msk:8088/browse/CLS-918 2025-12-02 17:24:49 +03:00
etreschenkov
2a9a1d753b http://jira.mfd.msk:8088/browse/CLS-918 2025-12-02 14:21:46 +03:00
etreschenkov
d85e043060 http://jira.mfd.msk:8088/browse/CLS-917 2025-12-01 12:04:59 +03:00
etreschenkov
adf0091fef http://jira.mfd.msk:8088/browse/CLS-918 2025-12-01 11:51:10 +03:00
etreschenkov
1fcf57cb2d up pom version 2025-12-01 11:35:39 +03:00
etreschenkov
71ba1ad08e http://jira.mfd.msk:8088/browse/CLS-918 2025-12-01 11:35:11 +03:00
ialbert
5b70542ff7 http://jira.mfd.msk:8088/browse/CLS-919 2025-11-28 18:34:43 +03:00
ialbert
4beff10362 http://jira.mfd.msk:8088/browse/CLS-915 2025-11-14 18:15:53 +03:00
etreschenkov
9b0de88c46 efis sql scripts 2025-11-05 17:27:17 +03:00
AKurakin
a3c08bc455 lim-exporter http://jira.mfd.msk:8088/browse/CLS-913 2025-10-28 12:25:03 +03:00
etreschenkov
20cd02a678 up pom version 2025-10-28 10:44:50 +03:00
etreschenkov
c960291849 http://jira.mfd.msk:8088/browse/CLS-909 2025-10-27 18:28:50 +03:00
etreschenkov
53ac7d0a0c up pom version 2025-10-20 12:04:28 +03:00
etreschenkov
ddd500e26f http://jira.mfd.msk:8088/browse/CLS-909 2025-10-17 13:12:52 +03:00
etreschenkov
e4fc5bbedd fix DICTIONARIES.sql 2025-09-30 15:15:17 +03:00
etreschenkov
041511d4a5 fix MARKET_LCC.sql 2025-09-30 11:24:15 +03:00
etreschenkov
ea077e2cea fix MARKET_LCC.sql 2025-09-30 11:06:22 +03:00
ialbert
3253b06d1c http://jira.mfd.msk:8088/browse/CLS-904 2025-09-29 16:38:18 +03:00
ialbert
53fba9af01 http://jira.mfd.msk:8088/browse/CLS-904 2025-09-29 14:48:08 +03:00
etreschenkov
98696cc9d5 up pom version 2025-09-26 13:53:40 +03:00
etreschenkov
b1f775a608 http://jira.mfd.msk:8088/browse/CLS-907 2025-09-26 13:51:22 +03:00
etreschenkov
a5fef272ba http://jira.mfd.msk:8088/browse/CLS-907 2025-09-26 13:10:04 +03:00
etreschenkov
7a403cafa0 http://jira.mfd.msk:8088/browse/CLS-906 2025-09-26 12:57:23 +03:00
etreschenkov
306d20ce0d http://jira.mfd.msk:8088/browse/CLS-907 2025-09-25 13:01:24 +03:00
etreschenkov
492943e4d5 http://jira.mfd.msk:8088/browse/CLS-906 2025-09-24 13:21:04 +03:00
etreschenkov
0466926627 http://jira.mfd.msk:8088/browse/CLS-905 2025-09-24 13:09:22 +03:00
etreschenkov
91aca3865e http://jira.mfd.msk:8088/browse/CLS-889 2025-09-18 17:32:24 +03:00
etreschenkov
96d7241e6b http://jira.mfd.msk:8088/browse/CLS-889 2025-09-17 11:39:03 +03:00
etreschenkov
7240066fe6 http://jira.mfd.msk:8088/browse/CLS-889 2025-09-15 18:59:11 +03:00
ialbert
f0881dd4b8 Merge remote-tracking branch 'origin/dev' into dev 2025-09-12 14:10:27 +03:00
ialbert
5a12278125 http://jira.mfd.msk:8088/browse/CLS-904 2025-09-12 14:10:10 +03:00
AKurakin
98157cb252 http://jira.mfd.msk:8088/browse/CLS-889 dictionaries.xml+ 2025-09-11 14:00:58 +03:00
ialbert
8dd82f67a6 http://jira.mfd.msk:8088/browse/CLS-889 2025-09-11 13:30:24 +03:00
ialbert
59ab5145a8 http://jira.mfd.msk:8088/browse/CLS-904 2025-09-10 17:17:02 +03:00
ialbert
8b7e0faf95 Merge remote-tracking branch 'origin/dev' into dev 2025-09-10 15:39:16 +03:00
ialbert
5a829620bf http://jira.mfd.msk:8088/browse/CLS-889 2025-09-10 15:38:57 +03:00
etreschenkov
e2db536b0d http://jira.mfd.msk:8088/browse/CLS-903 2025-09-09 18:27:42 +03:00
etreschenkov
2e03fd6ebf up pom version 2025-09-04 19:02:10 +03:00
etreschenkov
7f2ad9d699 rename report type 2025-09-04 18:55:53 +03:00
etreschenkov
95f7c54376 http://jira.mfd.msk:8088/browse/CLS-795 2025-09-04 18:24:43 +03:00
etreschenkov
7279f460b3 Merge branch 'refs/heads/master' into dev 2025-09-03 18:22:50 +03:00
etreschenkov
3cb5cc7eb1 trancate country_code_dictionary 2025-09-03 18:22:02 +03:00
etreschenkov
42c0b6b9d1 http://jira.mfd.msk:8088/browse/CLS-901 2025-09-01 19:50:56 +03:00
etreschenkov
2e6e453f69 http://jira.mfd.msk:8088/browse/CLS-901 2025-09-01 17:24:10 +03:00
etreschenkov
be519bc4c4 http://jira.mfd.msk:8088/browse/CLS-902 2025-08-29 16:09:47 +03:00
etreschenkov
ee40eaf6b9 http://jira.mfd.msk:8088/browse/CLS-884 2025-08-29 14:46:16 +03:00
etreschenkov
14e610f64e http://jira.mfd.msk:8088/browse/CLS-901 2025-08-29 14:16:42 +03:00
etreschenkov
75ab4d8312 http://jira.mfd.msk:8088/browse/CLS-902 2025-08-29 13:59:30 +03:00
etreschenkov
3fba700abe http://jira.mfd.msk:8088/browse/CLS-885 2025-08-28 17:03:41 +03:00
etreschenkov
cdf9f9f251 http://jira.mfd.msk:8088/browse/CLS-884 2025-08-28 16:50:41 +03:00
etreschenkov
3ff5a46e33 http://jira.mfd.msk:8088/browse/CLS-885 // http://jira.mfd.msk:8088/browse/CLS-884 2025-08-27 16:29:13 +03:00
etreschenkov
dac99adb0f http://jira.mfd.msk:8088/browse/CLS-901 2025-08-22 14:22:10 +03:00
ialbert
b0b4f294ec Merge remote-tracking branch 'origin/dev' into dev 2025-08-22 14:01:32 +03:00
ialbert
85d2cc5a65 http://jira.mfd.msk:8088/browse/CLS-900 2025-08-22 14:01:18 +03:00
etreschenkov
3d511b540e http://jira.mfd.msk:8088/browse/CLS-885 2025-08-19 14:08:14 +03:00
etreschenkov
7bbe9b4bfb http://jira.mfd.msk:8088/browse/CLS-899
(cherry picked from commit 178aa11561)
2025-08-15 11:42:04 +03:00
etreschenkov
ca8fc59192 http://jira.mfd.msk:8088/browse/CLS-898 2025-08-15 11:41:18 +03:00
etreschenkov
e1275da162 Revert "http://jira.mfd.msk:8088/browse/CLS-899"
This reverts commit 178aa11561.
2025-08-15 11:40:51 +03:00
etreschenkov
52e703bfd8 http://jira.mfd.msk:8088/browse/CLS-898 2025-08-14 17:49:08 +03:00
etreschenkov
78ceae3a2d http://jira.mfd.msk:8088/browse/CLS-898 2025-08-14 17:46:56 +03:00
etreschenkov
178aa11561 http://jira.mfd.msk:8088/browse/CLS-899 2025-08-14 17:46:43 +03:00
etreschenkov
4762f29ee7 edit new fields for companyInfo 2025-08-13 17:39:12 +03:00
etreschenkov
4b5d5b94af http://jira.mfd.msk:8088/browse/CLS-885 2025-08-13 15:08:04 +03:00
ialbert
8945bd978a Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 14:59:11 +03:00
ialbert
c39c6ebb4d http://jira.mfd.msk:8088/browse/CLS-885 2025-08-13 14:58:50 +03:00
etreschenkov
92fce6643f ddl v.1.20 2025-08-13 14:31:37 +03:00
etreschenkov
146a09acaf up meta version 2025-08-13 11:46:34 +03:00
etreschenkov
59f5b2dc1c up pom version 2025-08-13 11:45:46 +03:00
etreschenkov
2326d7c0a6 Merge branch 'refs/heads/master' into dev 2025-08-12 12:36:46 +03:00
etreschenkov
23d3a3e49f up pom version 2025-08-12 12:35:48 +03:00
ialbert
733d92bf54 IPOB revise after payment instructions 2025-08-12 12:30:29 +03:00
etreschenkov
d56ae261cb up pom version 2025-08-11 13:45:02 +03:00
etreschenkov
96955aa0aa http://jira.mfd.msk:8088/browse/CLS-887 2025-08-11 11:31:59 +03:00
etreschenkov
60d9801a5f add client hz connection for imdg-hist 2025-08-08 16:34:54 +03:00
ialbert
63f94d6921 Merge remote-tracking branch 'origin/dev' into dev 2025-08-07 18:33:43 +03:00
ialbert
31de6ed6dc http://jira.mfd.msk:8088/browse/CLS-894 ObligationAdmission <-> InclusionToPool 2025-08-07 18:33:26 +03:00
etreschenkov
4791bc457e http://jira.mfd.msk:8088/browse/CLS-887 2025-08-07 17:29:17 +03:00
etreschenkov
2c66412e97 http://jira.mfd.msk:8088/browse/CLS-887 2025-08-07 16:22:21 +03:00
etreschenkov
fc77ea4247 http://jira.mfd.msk:8088/browse/CLS-887 [add sessionHistory object to meta] 2025-08-07 13:02:01 +03:00
etreschenkov
a319d915fd http://jira.mfd.msk:8088/browse/CLS-887 [add new controller] 2025-08-07 13:02:01 +03:00
ialbert
25937f5093 Merge remote-tracking branch 'origin/dev' into dev 2025-08-07 13:00:57 +03:00
ialbert
a1680e9fd5 http://jira.mfd.msk:8088/browse/CLS-894 ObligationAdmission <-> InclusionToPool 2025-08-07 13:00:41 +03:00
etreschenkov
00c83393d9 get collection instead first object 2025-08-06 17:12:58 +03:00
etreschenkov
c12066d554 add logs 2025-08-06 16:30:36 +03:00
etreschenkov
39feb7ebce add SESSION_STATUS_DICTIONARY = C5_0 2025-08-06 11:53:14 +03:00
ialbert
9bf50ba57c Merge remote-tracking branch 'origin/dev' into dev 2025-08-04 18:58:38 +03:00
ialbert
f6cde7ef42 http://jira.mfd.msk:8088/browse/CLS-891 название компании вместо ID при 5421 ошибке 2025-08-04 18:58:20 +03:00
etreschenkov
7151d08a22 up pom version 2025-08-04 16:45:43 +03:00
ialbert
5376c7dcea формирование PaymentInstruction, для возврата депозитов: не учитывать суммы возвратов в PaymentInstruction при наличии DM*X bugfix 2025-08-01 17:52:18 +03:00
ialbert
28d07fcd3d формирование PaymentInstruction, для возврата депозитов: не учитывать суммы возвратов в PaymentInstruction при наличии DM*X 2025-08-01 17:23:07 +03:00
ialbert
81a39b9dbe формирование PaymentInstruction, пропуск при наличии DM*X 2025-08-01 15:56:43 +03:00
ialbert
679a64bd85 Revert "формирование PaymentInstruction, для возврата депозитов: обнуляю баланс AM*B регистра при наличии DM*X"
This reverts commit bcbc335089.
2025-08-01 14:16:46 +03:00
ialbert
49235b0146 Revert "формирование PaymentInstruction, для возврата депозитов: обнуляю баланс AM*B регистра при наличии DM*X для отправителя"
This reverts commit f11b4d1b22.
2025-08-01 14:16:45 +03:00
ialbert
f11b4d1b22 формирование PaymentInstruction, для возврата депозитов: обнуляю баланс AM*B регистра при наличии DM*X для отправителя 2025-08-01 12:18:23 +03:00
ialbert
bcbc335089 формирование PaymentInstruction, для возврата депозитов: обнуляю баланс AM*B регистра при наличии DM*X 2025-07-31 16:20:22 +03:00
ialbert
a81d4b2f0a Merge branch 'dev' into dev_restore-state-machine 2025-07-30 11:24:11 +03:00
ialbert
40d2f11dd5 class not found fix 2025-07-29 15:02:08 +03:00
ialbert
aaddaa5633 session state machine restore 2025-07-29 13:54:40 +03:00
ialbert
6cce11d0ae Merge branch 'refs/heads/dev' into dev_restore-state-machine 2025-07-29 12:29:55 +03:00
ialbert
387e797314 Merge remote-tracking branch 'origin/dev' into dev 2025-07-29 12:02:28 +03:00
ialbert
baa36246cb create DM_X with PROC status 2025-07-29 12:02:03 +03:00
AKurakin
7e8da9bf94 up pom version SPCEX-3.19.251 2025-07-29 10:34:43 +03:00
ialbert
f9b1ed1582 state machine restore 2025-07-28 15:31:08 +03:00
ialbert
06e133421d Merge branch 'refs/heads/dev' into dev_restore-state-machine 2025-07-28 13:01:04 +03:00
ialbert
ae3e2a7571 restore session state machine example 2025-07-28 12:55:17 +03:00
ialbert
4ed2aabf11 state machine test sandbox 2025-07-28 12:52:37 +03:00
ialbert
57bb118262 включение в POOL, добавил or session_type=UNIT условие для FINL/MEDM 2025-07-25 12:54:56 +03:00
ialbert
964a044eab http://jira.mfd.msk:8088/browse/CLS-887 session HistorySubscription destination name bugfix 2025-07-24 15:03:10 +03:00
ialbert
8d6e1da81c http://jira.mfd.msk:8088/browse/CLS-890 отобржать статус POOL по запросу /filter для регистров 2025-07-24 15:01:41 +03:00
ialbert
56dabbd28f http://jira.mfd.msk:8088/browse/CLS-886 нотификейшен на 3м шаге сессий: писать все ошибки по регистру 2025-07-22 16:33:09 +03:00
ialbert
38cfc12fbc INSERT INTO DB_VERSION 2025-07-22 16:13:08 +03:00
ialbert
27909e0be5 убрал дубликаты ошибок в нотификейшене на 3м шаге сессий 2025-07-22 14:54:32 +03:00
ialbert
dc8a07b143 http://jira.mfd.msk:8088/browse/CLS-888 округление в нотификации о разнице на шаге 5 2025-07-22 11:26:03 +03:00
ialbert
6eef004c50 http://jira.mfd.msk:8088/browse/CLS-886 2025-07-21 18:55:25 +03:00
ialbert
b7144dfd99 session step 5 inspection obligation notification error text: difference 2025-07-21 16:31:55 +03:00
ialbert
33e0bb5047 http://jira.mfd.msk:8088/browse/CLS-883 [ClearingMemberCategory delete + cancel relation] bugfix 2025-07-21 16:09:40 +03:00
ialbert
8b2640ecd5 final session states fix missing PSEUDO_waitAfterInspectionError 2025-07-21 12:47:30 +03:00
etreschenkov
7fc3d59f9b Merge branch 'refs/heads/master' into dev
# Conflicts:
#	clearing-parent/account-service/pom.xml
#	clearing-parent/backend-api/pom.xml
#	clearing-parent/balance-service/pom.xml
#	clearing-parent/classes/pom.xml
#	clearing-parent/cleaning-builders/pom.xml
#	clearing-parent/clearing-service/pom.xml
#	clearing-parent/clearing-validation/pom.xml
#	clearing-parent/company-service/pom.xml
#	clearing-parent/db-scripts/pom.xml
#	clearing-parent/dbf-exporter/pom.xml
#	clearing-parent/dbf-importer/pom.xml
#	clearing-parent/dictionary/pom.xml
#	clearing-parent/extdb-importer/pom.xml
#	clearing-parent/gateway-api/pom.xml
#	clearing-parent/imdg-hist/pom.xml
#	clearing-parent/imdg/pom.xml
#	clearing-parent/lim-exporter/pom.xml
#	clearing-parent/pom.xml
#	clearing-parent/registry-service/pom.xml
#	clearing-parent/reports-service/pom.xml
#	clearing-parent/scheduler-service/pom.xml
#	clearing-parent/securities-service/pom.xml
#	clearing-parent/security-util/pom.xml
#	clearing-parent/swt-exporter/pom.xml
#	clearing-parent/swt-importer/pom.xml
#	clearing-parent/test-clearing/pom.xml
#	clearing-parent/trade-importer/pom.xml
#	clearing-parent/utility-service/pom.xml
#	clearing-parent/xml-exporter/pom.xml
#	clearing-parent/xml-importer/pom.xml
#	platform-parent/pom.xml
#	pom.xml
#	z-distr/pom.xml
2025-07-18 16:29:29 +03:00
etreschenkov
aaf3543dd0 пофиксил баг при рефакторинге условия; см. коммит 53320c53 2025-07-18 13:16:20 +03:00
etreschenkov
b225b1accb up pom version 2025-07-18 10:17:28 +03:00
ialbert
3777773000 убрал паузу из MEDM на 5м шаге 2025-07-17 18:48:40 +03:00
ialbert
b855cc3d62 Merge remote-tracking branch 'origin/dev' into dev 2025-07-17 18:34:09 +03:00
ialbert
1d1718d7a0 убрал паузу из XDEP на 5м шаге 2025-07-17 18:33:30 +03:00
Ivan Nikolaev-Axenov
29d72fdf53 PrepareXMLFile filename bug fixed, PrepareAndExportSf05FromHazelcastTest added 2025-07-17 16:46:25 +03:00
ialbert
b58d20a5e9 Inclusion to Pool stage: session type bugfix 2025-07-17 15:54:45 +03:00
ialbert
1b9bd6671c Merge remote-tracking branch 'origin/dev' into dev 2025-07-17 14:37:13 +03:00
ialbert
4948d43e94 state machine, session status update 2025-07-17 14:36:22 +03:00
etreschenkov
53320c5388 http://jira.mfd.msk:8088/browse/CLS-867
шаг 5: добавил условие на секцию для единой сессии
2025-07-17 12:57:17 +03:00
etreschenkov
9402218596 send notification and return error if session already exist 2025-07-16 19:43:43 +03:00
ialbert
627f8caf27 active session check 2025-07-16 18:19:58 +03:00
ialbert
3e804be783 inspection obligation: set plan balance before the step. 2025-07-16 17:40:42 +03:00
ialbert
4351fc9ca3 ObligationAdmission account not active error message fix 2025-07-16 16:45:45 +03:00
ialbert
097f0c649b session updated field 2025-07-16 15:57:38 +03:00
ialbert
5b24b289ef inspection obligation for final session 2025-07-16 14:33:08 +03:00
ialbert
8177204f1e Merge remote-tracking branch 'origin/dev' into dev 2025-07-16 14:29:18 +03:00
ialbert
a36abc2b98 FinalMkrSession state machine integration 2025-07-16 14:28:56 +03:00
etreschenkov
bbac0109a3 update clearing-tester.jar 2025-07-16 14:21:48 +03:00
etreschenkov
ae3245f069 add PSEUDO_waitAfterInspectionError to states collection for all session 2025-07-16 14:11:36 +03:00
etreschenkov
6573f21b7e update clearing-tester.jar 2025-07-16 14:04:53 +03:00
etreschenkov
6540ea0c01 update clearing-tester.jar 2025-07-16 13:30:22 +03:00
etreschenkov
287b58df91 add PSEUDO_waitAfterInspectionError to states collection 2025-07-16 12:57:13 +03:00
etreschenkov
f172b86812 update clearing-tester.jar 2025-07-16 11:52:41 +03:00
etreschenkov
6b7e47c8ae update clearing-tester.jar 2025-07-16 11:30:35 +03:00
ialbert
1e8d56d5ca CurrencySession state machine again revise error fix 2025-07-15 19:01:49 +03:00
etreschenkov
c1d8df629c state machine PSEUDO_waitSdfAfterAgainRevise for other session 2025-07-15 18:58:42 +03:00
etreschenkov
91b95453d7 state machine PSEUDO_waitSdfAfterAgainRevise for other session 2025-07-15 18:51:55 +03:00
etreschenkov
74bd41f985 state machine PSEUDO_waitSdfAfterAgainRevise example UnitSession 2025-07-15 18:46:56 +03:00
ialbert
d7cda6c3c5 state machine PSEUDO_waitSdfAfterAgainRevise example UnitSession 2025-07-15 18:43:56 +03:00
ialbert
5dc32f283e state machine removed sdf_01, sdf_08 events (again) 2025-07-15 18:29:13 +03:00
ialbert
94fb323687 http://jira.mfd.msk:8088/browse/CLS-880 GVTF команда выборки INFO & CLRN 2025-07-15 15:54:42 +03:00
ialbert
2daad95d38 http://jira.mfd.msk:8088/browse/CLS-880 2025-07-14 16:52:14 +03:00
etreschenkov
f1bb965141 Merge branch 'refs/heads/stage-5-state-machine' into dev 2025-07-14 16:48:33 +03:00
etreschenkov
1ff8ea5cef Merge branch 'refs/heads/stage-5-state-machine' into dev 2025-07-14 16:46:48 +03:00
ialbert
efe3d58b2a InspectionObligations guard 2025-07-14 16:02:26 +03:00
Aleksey Kulikov
f861eb731e http://jira.mfd.msk:8088/browse/CLS-879 2025-07-14 14:39:59 +03:00
etreschenkov
b9e0ba49e6 comment not implemented task type 2025-07-14 13:45:04 +03:00
etreschenkov
2e0b17c7f2 pause after step 5 2025-07-14 13:42:18 +03:00
etreschenkov
7c88b461b0 http://jira.mfd.msk:8088/browse/CLS-867 2025-07-14 13:42:14 +03:00
etreschenkov
60d84bc281 pause after step 5 2025-07-14 13:39:25 +03:00
etreschenkov
3eff12f684 pause after step 5 2025-07-14 12:53:39 +03:00
etreschenkov
b755da8927 http://jira.mfd.msk:8088/browse/CLS-867 2025-07-14 12:41:58 +03:00
etreschenkov
6fbbcc308a pause after step 5 2025-07-14 12:41:39 +03:00
etreschenkov
10cb98ac11 pause after step 5 2025-07-11 18:08:48 +03:00
ialbert
5a0842249b Merge remote-tracking branch 'origin/dev' into dev 2025-07-11 14:12:56 +03:00
ialbert
e47ff42602 Obligation Admission PAUSE notification 2025-07-11 14:12:28 +03:00
etreschenkov
dd7595256c http://jira.mfd.msk:8088/browse/CLS-862 2025-07-11 13:25:07 +03:00
Ivan Nikolaev-Axenov
add502ed0b Merge branch 'dev_db-data-fix' into dev 2025-07-11 12:48:35 +03:00
etreschenkov
f72590da62 http://jira.mfd.msk:8088/browse/CLS-862 2025-07-11 12:46:38 +03:00
etreschenkov
cccb4017b3 http://jira.mfd.msk:8088/browse/CLS-862 2025-07-11 11:47:34 +03:00
Ivan Nikolaev-Axenov
bde38d9666 .gitkeep remove in .gitlab-ci.yml added 2025-07-11 11:01:17 +03:00
ialbert
c1c7e168ac PAYM step 5 InspectionObligationsV2Action bugfix 2025-07-10 18:27:56 +03:00
ialbert
6e41eed350 RequirementAndObligationCreation bug fix PAYM, PREP 2025-07-10 17:35:08 +03:00
etreschenkov
3da32d9f41 remove endStageNotification stage 2025-07-10 16:44:36 +03:00
ialbert
e6fc7f75c9 Merge remote-tracking branch 'origin/dev' into dev 2025-07-10 16:37:21 +03:00
ialbert
7bac2a31f9 SessionStatusChangingInterceptor end state statuses update 2025-07-10 16:37:03 +03:00
etreschenkov
6abdf6b132 set createdDt when session create 2025-07-10 14:20:15 +03:00
ialbert
fd7ea384cb PAUS workflow status 2025-07-10 14:06:35 +03:00
Ivan Nikolaev-Axenov
c7b43312e2 run_test_docker_containers.py logging added 2025-07-10 11:14:09 +03:00
Ivan Nikolaev-Axenov
14e4633ee7 test case selection added 2025-07-10 11:03:24 +03:00
etreschenkov
2162dbc7b7 rollback ci 2025-07-09 19:39:30 +03:00
etreschenkov
7e983dbb0e fix trdt session 2025-07-09 18:28:34 +03:00
etreschenkov
70f0e4b9e5 fix unit session 2025-07-09 17:18:01 +03:00
etreschenkov
beb0758ff3 fix unit session 2025-07-09 16:45:56 +03:00
etreschenkov
df7ad80c24 fix unit session 2025-07-09 15:48:36 +03:00
ialbert
88ea9e5a66 unit session deals preparation order, logging 2025-07-09 15:18:40 +03:00
ialbert
b451394004 FinishingSessionAction PAYM bugfix 2025-07-09 15:07:25 +03:00
etreschenkov
bfdf2d152b fix unit session 2025-07-09 14:48:29 +03:00
ialbert
11ba4d9515 Merge remote-tracking branch 'origin/dev' into dev 2025-07-09 14:44:41 +03:00
ialbert
6d143fa5aa inclusion to pool bug fix 2025-07-09 14:44:25 +03:00
etreschenkov
70791d8cac fix RequirementAndObligationCreationAction 2025-07-09 14:32:12 +03:00
etreschenkov
5457773174 http://jira.mfd.msk:8088/browse/CLS-866 2025-07-09 14:31:55 +03:00
etreschenkov
6da33747cb fix unit session 2025-07-09 14:07:29 +03:00
etreschenkov
77f7c6acee fix unit session 2025-07-09 13:33:45 +03:00
etreschenkov
9d4169101b fix unit session 2025-07-09 13:33:31 +03:00
etreschenkov
bbabde159e fix unit session 2025-07-09 12:07:31 +03:00
etreschenkov
aa3c909770 fix unit session 2025-07-09 11:52:58 +03:00
etreschenkov
7acb56ec45 fix unit session 2025-07-09 11:06:20 +03:00
etreschenkov
c7282bf04a http://jira.mfd.msk:8088/browse/CLS-866 2025-07-08 18:39:58 +03:00
etreschenkov
5f24eba895 http://jira.mfd.msk:8088/browse/CLS-866 2025-07-08 18:39:58 +03:00
ialbert
4e50f77576 UNIT session config bugfix
XDEP inclusion to pool selection bugfix
PAYM inclusion to pool selection bugfix
2025-07-08 14:54:02 +03:00
etreschenkov
db9963b337 fix states collection 2025-07-08 10:40:26 +03:00
etreschenkov
2a2c1f0c2b up pom version 2025-07-08 10:39:42 +03:00
etreschenkov
fb2f9983b5 fix section for currency session 2025-07-04 18:19:42 +03:00
ialbert
d812faf77a removed SDF_01 & SDF_08 events from session state machine 2025-07-04 15:57:40 +03:00
ialbert
b264a91769 Merge remote-tracking branch 'origin/dev' into dev 2025-07-04 15:55:42 +03:00
etreschenkov
705b730378 EventReceiver, выпилил continue session события для старых сессий-сервисов. 2025-07-04 15:55:25 +03:00
ialbert
fb84def7b8 Merge branch 'spring-state-machine-template-v2' into dev 2025-07-04 15:36:07 +03:00
ialbert
34cfaa74c8 removed SDF_01 & SDF_08 2025-07-04 15:35:27 +03:00
etreschenkov
6b55112a79 пофиксил конфликты типов в PaymentsWereCreatedListGuard.java; PaymentsWereNotCreatedListGuard.java 2025-07-04 15:32:45 +03:00
etreschenkov
33785cfac0 1. регистрация событий SDF 2025-07-04 15:00:47 +03:00
etreschenkov
453f24f9cd fix 3, 5 [check constructor; 5. @Configuration("...")] 2025-07-04 13:28:59 +03:00
ialbert
bc8c030714 currency session fix 2025-07-04 12:32:25 +03:00
etreschenkov
d3134931ce up pom version 2025-07-04 10:42:32 +03:00
ialbert
767347dbed PrepSession state machine config 2025-07-03 19:30:09 +03:00
ialbert
1ab524aacd Merge remote-tracking branch 'origin/spring-state-machine-template-v2' into spring-state-machine-template-v2 2025-07-03 19:14:07 +03:00
ialbert
a860d8a831 ReturnDepositSession state machine config 2025-07-03 19:13:50 +03:00
ialbert
61c7fb537f ReturnDepositSession state machine config 2025-07-03 19:11:55 +03:00
etreschenkov
2110b2089e UnitedSession state machine config 2025-07-03 18:03:25 +03:00
ialbert
6756a65485 PrimaryAuctionBnSession
SecondaryAuctionT0Session
2025-07-03 15:39:48 +03:00
ialbert
c2b47920e4 PrimaryAuctionT0Session state machine config 2025-07-03 14:15:18 +03:00
ialbert
a89d6194cb PaymSession state machine config 2025-07-03 14:02:31 +03:00
etreschenkov
ec012740cb get section and sessionType from machine context 2025-07-02 19:16:29 +03:00
ialbert
66be672adb CurrencySessionStateMachineConfig refactor 2025-07-02 19:06:48 +03:00
ialbert
c3315d8a62 PrimaryAuctionB0SessionStateMachineConfig refactor 2025-07-02 18:48:21 +03:00
ialbert
79b1446b7a PrimaryAuctionB0SessionStateMachineConfig import bugfix 2025-07-02 15:47:13 +03:00
ialbert
ea3ba70d14 state machine config separate methods 2025-07-02 15:46:20 +03:00
etreschenkov
ff060688a3 add CurrencySessionStateMachineConfig 2025-07-02 15:21:06 +03:00
etreschenkov
70efa31997 rename ReviseStage1 2025-07-02 15:05:15 +03:00
ialbert
6ad317c701 PrimaryAuctionB0Session 2025-07-02 14:39:59 +03:00
ialbert
a1b6cab301 Merge branch 'refs/heads/dev' into spring-state-machine-template-v2 2025-07-02 13:46:59 +03:00
etreschenkov
018d573590 Merge branch 'refs/heads/master' into dev
# Conflicts:
#	clearing-parent/db-scripts/src/main/resources/db/DDL_3.18.sql
2025-07-02 13:45:42 +03:00
etreschenkov
6bfa78c5a6 fix ddl scripts 2025-07-02 13:44:43 +03:00
etreschenkov
fc9be7068d override sessionId and status when recreating execution 2025-07-01 20:00:23 +03:00
Aleksey Kulikov
1226c73821 fix reports-service test 2025-07-01 13:26:39 +03:00
Aleksey Kulikov
d707d6ab6e http://jira.mfd.msk:8088/browse/CLS-877 2025-07-01 13:17:09 +03:00
ialbert
764f3f82d9 PSEUDO tasks rename 2025-07-01 12:52:50 +03:00
ialbert
eb3577fd06 IntermediateMkrSession state config 2025-06-30 17:46:06 +03:00
etreschenkov
193983bc13 fix ddl scripts 2025-06-30 17:30:20 +03:00
ialbert
b5f69e8b59 requirement and obligation creation action bug fix 2025-06-30 14:51:04 +03:00
ialbert
a4ed85b2e2 Merge branch 'dev' into spring-state-machine-template-v2 2025-06-30 14:49:48 +03:00
ialbert
81525450c4 Merge branch 'master' into dev 2025-06-30 14:49:20 +03:00
ialbert
d319f562aa execution loading bugfix 2025-06-30 13:17:35 +03:00
ialbert
5462caf3f1 state machine unit test 2025-06-30 11:09:12 +03:00
ialbert
67939b3776 execution sorting for RequirementsAndObligationCreation 2025-06-30 11:05:41 +03:00
ialbert
a14ca74a69 RequirementAndObligationCreationCompoundAction 2025-06-27 18:07:57 +03:00
ialbert
dff000b496 state machine actions 2025-06-27 17:56:09 +03:00
etreschenkov
c88ce7f56f FormingPaymentInstructionSecurities to action 2025-06-27 17:52:53 +03:00
ialbert
d600ddfb52 ClearingRuntimeException 2025-06-27 17:24:38 +03:00
ialbert
c341878e54 Merge branch 'dev' into spring-state-machine-template-v2 2025-06-27 17:05:11 +03:00
ialbert
62409c3e8a Merge branch 'master' into dev 2025-06-27 17:03:27 +03:00
ialbert
824f263157 exchangeExecutionId одинаковые, сортировка сделок в Unit сессии 2025-06-27 17:00:33 +03:00
etreschenkov
83c65a4f3f http://jira.mfd.msk:8088/browse/CLS-871 2025-06-27 09:36:15 +03:00
etreschenkov
4379d2671f Merge remote-tracking branch 'refs/remotes/origin/master' into dev 2025-06-26 17:55:31 +03:00
etreschenkov
733fe3b383 http://jira.mfd.msk:8088/browse/CLS-871 2025-06-26 17:47:55 +03:00
etreschenkov
614f027943 select counter sTrades 2025-06-26 17:29:36 +03:00
Ivan Nikolaev-Axenov
ef7bcd9c4f README.md added to clr_test 2025-06-26 15:39:54 +03:00
AKurakin
8b1eabafa8 http://jira.mfd.msk:8088/browse/CLS-870 поправил версию в файле DDL.sql 2025-06-26 10:47:12 +03:00
ialbert
79cbc7dfc7 rever test state machine guard 2025-06-25 19:11:23 +03:00
ialbert
06ce9742e2 state machine 2025-06-25 18:24:02 +03:00
ialbert
0834082988 state session continue test 2025-06-25 16:15:21 +03:00
ialbert
07e096cf76 test guard 2025-06-25 15:52:55 +03:00
Ivan Nikolaev-Axenov
564de467ad http://jira.mfd.msk:8088/browse/CLS-875 xml-importer DBF string splitting bug fixed 2025-06-25 12:05:56 +03:00
Ivan Nikolaev-Axenov
e3e8683c10 http://jira.mfd.msk:8088/browse/CLS-874 xml-exporter DBF string splitting bug fixed 2025-06-25 12:05:24 +03:00
ialbert
d64d15dc17 http://jira.mfd.msk:8088/browse/CLS-872 exchangeExecutionId/groupId state machine 2025-06-24 18:14:39 +03:00
ialbert
b8d55c4627 Merge branch 'dev' into spring-state-machine-template-v2
# Conflicts:
#	.gitlab-ci.yml
2025-06-24 17:46:39 +03:00
ialbert
ec3aa6a617 Merge branch 'master' into dev 2025-06-24 17:45:43 +03:00
ialbert
404cd991fd http://jira.mfd.msk:8088/browse/CLS-872 2025-06-24 15:23:46 +03:00
etreschenkov
cea1fc2d39 increase version 2025-06-24 15:23:07 +03:00
etreschenkov
36ba83319d http://jira.mfd.msk:8088/browse/CLS-871 2025-06-24 15:21:56 +03:00
etreschenkov
60fd1bcc0c http://jira.mfd.msk:8088/browse/CLS-871 2025-06-24 15:09:55 +03:00
etreschenkov
2529048485 http://jira.mfd.msk:8088/browse/CLS-871 2025-06-24 15:03:59 +03:00
ialbert
7ba559ad40 http://jira.mfd.msk:8088/browse/CLS-872 2025-06-24 14:07:56 +03:00
etreschenkov
c6b644d118 добавил условие на market на выборку регистри 2025-06-24 11:13:07 +03:00
etreschenkov
4efb263362 группировка registry с учетом market и groupId для шага 11 активной сессии 2025-06-24 10:55:08 +03:00
etreschenkov
1110278d6a группировка registry с учетом market и groupId для шага 7 активной сессии 2025-06-24 10:43:55 +03:00
etreschenkov
1bb489e3cb группировка registry с учетом market и groupId для шага 10 активной сессии 2025-06-24 10:25:25 +03:00
etreschenkov
aa38fa986a группировка registry с учетом market и groupId для шага 7 активной сессии 2025-06-24 09:58:32 +03:00
etreschenkov
8b21e7aec2 группировка registry с учетом market и groupId для шага 5 активной сессии 2025-06-23 18:38:46 +03:00
etreschenkov
485b269dcf группировка registry с учетом market и groupId для шага 3 активной сессии 2025-06-23 18:21:10 +03:00
etreschenkov
f78d4394c3 группировка registry с учетом market и groupId для шага 4 активной сессии 2025-06-23 18:17:17 +03:00
etreschenkov
86917e91fd группировка registry с учетом market и groupId для шага 5 активной сессии 2025-06-23 17:44:08 +03:00
etreschenkov
bd2d8fcc58 группировка registry с учетом market и groupId для шага 7 активной сессии 2025-06-23 17:06:15 +03:00
etreschenkov
d27b7d003d группировка registry с учетом market и groupId для шага 7 активной сессии 2025-06-23 16:44:22 +03:00
ialbert
bacea62e45 Execution условие на маркет 2025-06-23 15:33:04 +03:00
ialbert
f21bafb2d7 Execution условие на маркет 2025-06-23 15:28:06 +03:00
etreschenkov
d5366ab2a1 установка market при создании регистров для активной сессии 2025-06-23 15:24:49 +03:00
Ivan Nikolaev-Axenov
0cded096ae .gitlab-ci.yml changed, master branch added to auto test execution 2025-06-23 11:51:42 +03:00
etreschenkov
15ed82e788 http://jira.mfd.msk:8088/browse/CLS-870 2025-06-20 10:51:12 +03:00
etreschenkov
2f6e8fe99b http://jira.mfd.msk:8088/browse/CLS-870 2025-06-20 10:27:39 +03:00
Ivan Nikolaev-Axenov
4959afe9f0 Dockerfile fixed 2025-06-19 10:38:42 +03:00
Ivan Nikolaev-Axenov
594efc8ec4 kafka Dockerfile created 2025-06-19 10:24:21 +03:00
ialbert
e3d1478752 http://jira.mfd.msk:8088/browse/CLS-865 2025-06-18 20:09:45 +03:00
etreschenkov
1defffc0a1 InspectionObligationsDepositReturn local store registries 2025-06-18 19:22:34 +03:00
Ivan Nikolaev-Axenov
43fdced052 docker-compose.yml fixed 2025-06-18 18:21:13 +03:00
Ivan Nikolaev-Axenov
dacf7e551d zookeeper removed, clearing-tester.jar updated 2025-06-18 18:04:14 +03:00
ialbert
80c9870282 EndStageNotificationAction bugfix 2025-06-18 13:27:09 +03:00
etreschenkov
10b1921487 http://jira.mfd.msk:8088/browse/CLS-861 2025-06-18 12:01:15 +03:00
ialbert
a8aa508639 http://jira.mfd.msk:8088/browse/CLS-862 2025-06-17 17:05:32 +03:00
etreschenkov
af0725284c http://jira.mfd.msk:8088/browse/CLS-864 2025-06-17 13:08:47 +03:00
etreschenkov
5f42c6df63 http://jira.mfd.msk:8088/browse/CLS-863 2025-06-16 17:02:50 +03:00
etreschenkov
2ac98d9f39 http://jira.mfd.msk:8088/browse/CLS-861 2025-06-16 16:38:32 +03:00
etreschenkov
0170de8e73 increase version 2025-06-16 14:17:33 +03:00
etreschenkov
169302163e http://jira.mfd.msk:8088/browse/CLS-863 2025-06-16 14:16:41 +03:00
Ivan Nikolaev-Axenov
eb64328bf1 Merge branch 'dev_clearing-tester-new-version' into dev 2025-06-16 13:51:48 +03:00
etreschenkov
a70efb051d update meta 2025-06-09 15:55:55 +03:00
etreschenkov
7fc0b784d1 up pom version 2025-06-09 15:53:48 +03:00
etreschenkov
24fe8f7d70 add dictionaries values for lcc 2025-06-09 13:19:54 +03:00
etreschenkov
88be2dbe41 add dictionaries values for lcc 2025-06-09 13:05:06 +03:00
etreschenkov
06155c2fa9 add dictionaries values for lcc 2025-06-09 12:09:23 +03:00
Ivan Nikolaev-Axenov
ead7b1cf5d clearing-tester.jar updated 2025-06-09 10:50:45 +03:00
Ivan Nikolaev-Axenov
19fb640d7e clearing_test repository branch changed to successful_set_export_fixed 2025-06-06 16:28:28 +03:00
etreschenkov
c8a317c0c8 actual MARKET_LCC.sql 2025-06-06 13:41:30 +03:00
etreschenkov
ebcdb6a2b0 actual MARKET.sql 2025-06-06 13:40:53 +03:00
etreschenkov
eec121924d http://jira.mfd.msk:8088/browse/CLS-844 2025-06-04 13:15:19 +03:00
etreschenkov
6bff686528 http://jira.mfd.msk:8088/browse/CLS-849 2025-06-04 11:58:08 +03:00
Ivan Nikolaev-Axenov
68bf6a78d0 kafka log level changed to warn in docker-compose.yml 2025-06-03 12:53:11 +03:00
Ivan Nikolaev-Axenov
9e09ca7486 test cases validator added, kafka and zookeeper versions removed in docker-compose.yml 2025-06-03 12:09:52 +03:00
etreschenkov
ecab562499 http://jira.mfd.msk:8088/browse/CLS-851 2025-06-03 12:05:09 +03:00
etreschenkov
4099d3d1c0 http://jira.mfd.msk:8088/browse/CLS-851 2025-06-03 11:39:48 +03:00
etreschenkov
28b5ef8b4b http://jira.mfd.msk:8088/browse/CLS-827 2025-06-02 16:18:23 +03:00
etreschenkov
134de7d9ab up pom version 2025-06-02 13:29:30 +03:00
etreschenkov
04a20c34db http://jira.mfd.msk:8088/browse/CLS-849 2025-06-02 12:48:41 +03:00
etreschenkov
ed0fbdaaaf http://jira.mfd.msk:8088/browse/CLS-851 2025-06-02 12:21:03 +03:00
ialbert
ed7a15410d Merge remote-tracking branch 'origin/spring-state-machine-template-v2' into spring-state-machine-template-v2 2025-05-30 19:24:34 +03:00
ialbert
bb70598d0a state machine bugfix 2025-05-30 19:24:17 +03:00
etreschenkov
7941e3cbba state machine bugfix [StackOverflowError] 2025-05-30 18:40:03 +03:00
ialbert
02038847f2 state machine bugfix 2025-05-30 18:26:17 +03:00
ialbert
3c986b4954 Merge remote-tracking branch 'origin/spring-state-machine-template-v2' into spring-state-machine-template-v2 2025-05-30 18:12:54 +03:00
ialbert
53ead3c5fe state machine bugfix 2025-05-30 18:12:36 +03:00
Ivan Nikolaev-Axenov
da3ac07a00 db-updater container added for updating db data up to current ddl version 2025-05-30 17:39:28 +03:00
etreschenkov
5b632db7db set branch for test 2025-05-30 17:34:34 +03:00
etreschenkov
7d042ad07e set branch for test 2025-05-30 17:33:52 +03:00
etreschenkov
f8fc9a2ee5 http://jira.mfd.msk:8088/browse/CLS-850 2025-05-30 17:12:55 +03:00
etreschenkov
b6f6b74e39 http://jira.mfd.msk:8088/browse/CLS-851 2025-05-30 17:02:26 +03:00
etreschenkov
3c480922d7 http://jira.mfd.msk:8088/browse/CLS-849 2025-05-30 13:08:24 +03:00
etreschenkov
3909af085c http://jira.mfd.msk:8088/browse/CLS-849 2025-05-30 12:37:04 +03:00
etreschenkov
34f376dfae http://jira.mfd.msk:8088/browse/CLS-849 2025-05-30 12:24:13 +03:00
ialbert
bcdbde9a16 fixes from dev 2025-05-29 18:15:31 +03:00
etreschenkov
2ac9ab49ec http://jira.mfd.msk:8088/browse/CLS-849 2025-05-29 17:58:50 +03:00
etreschenkov
46d2bf902c http://jira.mfd.msk:8088/browse/CLS-849 2025-05-29 17:30:50 +03:00
ialbert
ea77a68fb6 FinalMkrSession state machine integration 2025-05-29 17:03:18 +03:00
ialbert
68496730c6 FinalMkrSession spring state machine 2025-05-29 16:32:20 +03:00
ialbert
05d1135ae2 multiple actions 2025-05-29 16:32:20 +03:00
ialbert
4ccca75aad пример spring state machine для FinalSession, тест, понизил версию 2025-05-29 16:32:19 +03:00
ialbert
feb989a85b http://jira.mfd.msk:8088/browse/CLS-859 2025-05-29 12:22:01 +03:00
ialbert
ed6daedece DigitalCertificateSecurityMapStore bugfix 2025-05-28 19:32:59 +03:00
ialbert
b56ad84ec2 Merge remote-tracking branch 'origin/dev' into dev 2025-05-28 18:08:11 +03:00
ialbert
bc02fa7dea http://jira.mfd.msk:8088/browse/CLS-859 2025-05-28 18:07:46 +03:00
etreschenkov
ab4e520d89 update ddl encoding 2025-05-28 17:10:08 +03:00
etreschenkov
c0372315b4 fix ddl versions 2025-05-28 15:54:18 +03:00
etreschenkov
1903620e69 http://jira.mfd.msk:8088/browse/CLS-854 2025-05-28 12:17:06 +03:00
ialbert
040e0e359d http://jira.mfd.msk:8088/browse/CLS-858
http://jira.mfd.msk:8088/browse/CLS-855
2025-05-27 18:07:06 +03:00
etreschenkov
7f81e47fb6 http://jira.mfd.msk:8088/browse/CLS-849 2025-05-27 15:08:35 +03:00
ialbert
edd9c7c08d http://jira.mfd.msk:8088/browse/CLS-855 2025-05-27 13:43:26 +03:00
AKurakin
01aaf031b0 utility-service http://jira.mfd.msk:8088/browse/CLS-844 2025-05-27 13:16:36 +03:00
AKurakin
eb724cb917 db-scripts http://jira.mfd.msk:8088/browse/CLS-854 MARKET sql 2025-05-27 13:00:17 +03:00
etreschenkov
129ebf6acf http://jira.mfd.msk:8088/browse/CLS-850 2025-05-27 12:16:42 +03:00
etreschenkov
79317a7fe7 http://jira.mfd.msk:8088/browse/CLS-849 2025-05-27 11:59:22 +03:00
etreschenkov
522f91a8f9 http://jira.mfd.msk:8088/browse/CLS-849 2025-05-27 11:52:17 +03:00
etreschenkov
210ca99bfc http://jira.mfd.msk:8088/browse/CLS-849 2025-05-27 11:27:31 +03:00
AKurakin
3b9af73e5e utility-service http://jira.mfd.msk:8088/browse/CLS-844 исправил валидатор 2025-05-26 18:15:28 +03:00
etreschenkov
52d3653bdd add endpoint listing_fond_dc 2025-05-26 15:26:10 +03:00
etreschenkov
6ac5dafa74 http://jira.mfd.msk:8088/browse/CLS-850 2025-05-26 15:00:56 +03:00
AKurakin
6c9c43109b up pom version SPCEX-3.18.240 2025-05-26 14:36:58 +03:00
etreschenkov
369d002020 add deserializer for date 2025-05-26 13:35:44 +03:00
etreschenkov
89ce38cc7a http://jira.mfd.msk:8088/browse/CLS-850 2025-05-23 14:28:54 +03:00
etreschenkov
c42323eeb5 http://jira.mfd.msk:8088/browse/CLS-850 2025-05-23 14:18:37 +03:00
ialbert
62ec78c13b http://jira.mfd.msk:8088/browse/CLS-850 2025-05-23 13:53:54 +03:00
etreschenkov
b38c7c1959 http://jira.mfd.msk:8088/browse/CLS-826 2025-05-23 13:37:26 +03:00
ialbert
fb57a4df1b http://jira.mfd.msk:8088/browse/CLS-850 2025-05-23 13:33:18 +03:00
AKurakin
0c22729906 utility-service http://jira.mfd.msk:8088/browse/CLS-844 Обработка ValidationSymbols*Request 2025-05-22 17:16:03 +03:00
AKurakin
3dae3cc633 http://jira.mfd.msk:8088/browse/CLS-845 DDL fix 2025-05-22 14:50:34 +03:00
AKurakin
ed4be6d227 http://jira.mfd.msk:8088/browse/CLS-843 добавил логов 2025-05-22 14:39:01 +03:00
Aleksey Kulikov
39fed03c9e http://jira.mfd.msk:8088/browse/CLS-843 2025-05-21 19:11:41 +03:00
Aleksey Kulikov
d5349a6e5e http://jira.mfd.msk:8088/browse/CLS-843 2025-05-21 19:08:55 +03:00
Aleksey Kulikov
86b832d03c http://jira.mfd.msk:8088/browse/CLS-843 2025-05-21 19:01:59 +03:00
Aleksey Kulikov
89fe02d557 http://jira.mfd.msk:8088/browse/CLS-843 2025-05-21 14:22:40 +03:00
Aleksey Kulikov
7f46dc5b4f http://jira.mfd.msk:8088/browse/CLS-851 2025-05-21 12:25:17 +03:00
AKurakin
781c0645f2 http://jira.mfd.msk:8088/browse/CLS-845 DDL 2025-05-20 12:19:43 +03:00
AKurakin
148870d0c8 Merge branch 'master' into dev 2025-05-19 16:22:39 +03:00
AKurakin
72230cc8f7 up pom version SPCEX-3.17.224 2025-05-16 13:00:18 +03:00
AKurakin
5af38ed6bb http://jira.mfd.msk:8088/browse/CLS-847 xml-importer DF01/06 не обязателен market 2025-05-16 12:06:00 +03:00
AKurakin
f9b7149a74 http://jira.mfd.msk:8088/browse/CLS-825 DDL 2025-05-15 17:38:42 +03:00
etreschenkov
e7aefa6252 http://jira.mfd.msk:8088/browse/CLS-823 2025-05-13 12:04:03 +03:00
etreschenkov
696a03928a http://jira.mfd.msk:8088/browse/CLS-823 2025-05-13 10:33:58 +03:00
AKurakin
f9d989114e http://jira.mfd.msk:8088/browse/CLS-839 Большие Notification.comment 4000. DDL 2025-05-12 18:50:36 +03:00
AKurakin
46ce383b1b http://jira.mfd.msk:8088/browse/CLS-839 Большие Notification.comment 4000. Будет разбивать сообщения при привышении 2500 символов. 2025-05-12 18:44:43 +03:00
etreschenkov
0d877eed76 http://jira.mfd.msk:8088/browse/CLS-823 2025-05-12 13:42:06 +03:00
AKurakin
911dfba6f8 http://jira.mfd.msk:8088/browse/CLS-839 формат переноса строк (надо на ВЭБ доделать) 2025-05-12 13:32:57 +03:00
Ivan Nikolaev-Axenov
5c4161968b launch_and_test.sh changed to not exit on failed test case, kafka logs returned 2025-05-12 10:16:46 +03:00
AKurakin
cec9a0de7b http://jira.mfd.msk:8088/browse/CLS-839 округление до 2 знаков после запятой 2025-05-07 14:56:12 +03:00
AKurakin
318d8bba62 http://jira.mfd.msk:8088/browse/CLS-839 исправил выборку по отдельным ID 2025-05-07 14:43:02 +03:00
AKurakin
6d86fa44f1 http://jira.mfd.msk:8088/browse/CLS-839 добавил логи и тесты 2025-05-07 13:11:43 +03:00
ialbert
6cad412cdf Merge remote-tracking branch 'origin/dev' into dev 2025-05-07 11:41:16 +03:00
ialbert
bcf3e3e3ff http://jira.mfd.msk:8088/browse/CLS-838 2025-05-07 11:40:52 +03:00
Ivan Nikolaev-Axenov
3b5da3ff8f launch_and_test.sh exit code fetching fixed 2025-05-07 09:22:41 +03:00
ialbert
7acc0e81da Merge remote-tracking branch 'origin/dev' into dev 2025-05-06 12:25:39 +03:00
ialbert
6c4e26cbe8 http://jira.mfd.msk:8088/browse/CLS-830 2025-05-06 12:25:19 +03:00
etreschenkov
c557ee97ef http://jira.mfd.msk:8088/browse/CLS-823 2025-05-06 12:22:57 +03:00
AKurakin
5e2080cc29 http://jira.mfd.msk:8088/browse/CLS-832 DDL поправил заголовок, поправил копии старых версий 2025-05-06 11:55:19 +03:00
AKurakin
046d78d63f http://jira.mfd.msk:8088/browse/CLS-840 DICTIONARIES.sql 2025-05-06 10:46:32 +03:00
AKurakin
99198bce9b utility-service http://jira.mfd.msk:8088/browse/CLS-839 . 2025-05-05 19:15:07 +03:00
ialbert
6b6bbecea2 http://jira.mfd.msk:8088/browse/CLS-838 2025-05-05 18:53:07 +03:00
ialbert
6bd12d064e http://jira.mfd.msk:8088/browse/CLS-838 2025-05-05 18:47:56 +03:00
ialbert
f2f5453a4c Merge remote-tracking branch 'origin/dev' into dev 2025-05-05 18:45:08 +03:00
ialbert
4eb63277e0 http://jira.mfd.msk:8088/browse/CLS-838 2025-05-05 18:44:46 +03:00
AKurakin
40f248ad7c utility-service http://jira.mfd.msk:8088/browse/CLS-839 сверка AM_T,AM_F по GVTF 2025-05-05 18:29:51 +03:00
etreschenkov
b6d6db0499 add additional fields 2025-05-05 18:14:57 +03:00
etreschenkov
8f5ae16889 add views for transform 2025-05-05 17:43:50 +03:00
etreschenkov
366a45d115 Revert "add views for transform"
This reverts commit 1629bf1eaf.
2025-05-05 17:35:28 +03:00
etreschenkov
1629bf1eaf add views for transform 2025-05-05 17:35:04 +03:00
ialbert
316871b5c7 http://jira.mfd.msk:8088/browse/CLS-830 2025-05-05 14:31:06 +03:00
etreschenkov
fd9ba2b8e2 new meta json 2025-05-05 12:33:49 +03:00
etreschenkov
898713c2f8 up pom version 2025-05-05 12:27:42 +03:00
etreschenkov
345cd0059c http://jira.mfd.msk:8088/browse/CLS-835 2025-05-05 12:22:11 +03:00
etreschenkov
8415d6a518 http://jira.mfd.msk:8088/browse/CLS-823 2025-05-05 12:21:58 +03:00
AKurakin
b9b57f725a http://jira.mfd.msk:8088/browse/CLS-837 новый Task для scheduler-service 2025-04-30 19:48:40 +03:00
AKurakin
3040ae3734 http://jira.mfd.msk:8088/browse/CLS-834 DICTIONARIES.sql. Добавлены изменения в файлы генерации (dictionaries.xml) из CLS-757 CLS-797 2025-04-30 18:00:55 +03:00
ialbert
9ed076198b http://jira.mfd.msk:8088/browse/CLS-831 2025-04-30 16:27:15 +03:00
AKurakin
106828d83d http://jira.mfd.msk:8088/browse/CLS-832 DDL 2025-04-30 16:16:16 +03:00
AKurakin
4971890b8f xml-importer http://jira.mfd.msk:8088/browse/CLS-824 поправил кросс-валидацию ключевых полей 2025-04-30 14:38:44 +03:00
AKurakin
d542cc6159 xml-importer http://jira.mfd.msk:8088/browse/CLS-824 доделал валидацию ключевых полей 2025-04-30 12:57:58 +03:00
etreschenkov
1eb124b209 http://jira.mfd.msk:8088/browse/CLS-822 2025-04-22 19:19:05 +03:00
etreschenkov
059872518e http://jira.mfd.msk:8088/browse/CLS-822 2025-04-22 14:46:18 +03:00
AKurakin
fa696013ce up pom version SPCEX-3.16.222 2025-04-22 13:44:24 +03:00
Ivan Nikolaev-Axenov
03a8507922 clearing-tester.jar and dbf-swt-checker.jar version updated 2025-04-18 17:32:41 +03:00
Ivan Nikolaev-Axenov
0ddb6835f6 clearing-tester.jar updated 2025-04-18 12:45:31 +03:00
Ivan Nikolaev-Axenov
51b0224b7e dbf-swt-checker.jar and clearing-tester.jar updated, test cases branch changed to successful_set_with_df01_renamed 2025-04-17 14:03:50 +03:00
AKurakin
c7bd6c17ad xml-importer http://jira.mfd.msk:8088/browse/CLS-824 валидация ключевых полей 2025-04-17 12:37:49 +03:00
AKurakin
9f3ed39ef3 trade-importer http://jira.mfd.msk:8088/browse/CLS-820 поправил поля 2025-03-28 10:59:03 +03:00
AKurakin
4be350ad19 trade-importer http://jira.mfd.msk:8088/browse/CLS-820 и CLS-821 поправил опциональные кавычки, убрал загрузку необязательного поля ClassName (в новой версии его нет) 2025-03-27 13:50:00 +03:00
AKurakin
81e19b36d2 Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	clearing-parent/extdb-importer/src/main/java/ru/spcex/clearing/extdb/importer/services/ExtDBImporterService.java
2025-03-26 18:54:16 +03:00
AKurakin
1c4df656b7 extdb-importer http://jira.mfd.msk:8088/browse/CLS-821 там вью, без кавычек работает 2025-03-26 18:52:32 +03:00
AKurakin
b0e1cf2ef4 extdb-importer http://jira.mfd.msk:8088/browse/CLS-821 там вью, без кавычек работает 2025-03-26 18:47:57 +03:00
AKurakin
b3bc8f216b Up pom version SPCEX-3.16.221 2025-03-25 15:19:52 +03:00
AKurakin
1835673dd4 extdb-importer http://jira.mfd.msk:8088/browse/CLS-821 2025-03-25 14:37:54 +03:00
AKurakin
73d3250ce0 trade-importer http://jira.mfd.msk:8088/browse/CLS-820 2025-03-25 14:37:44 +03:00
Ivan Nikolaev-Axenov
f63c3e512e Merge remote-tracking branch 'origin/dev_gitlab_sftp_integration' into dev_gitlab_sftp_integration 2025-03-21 17:32:38 +03:00
Ivan Nikolaev-Axenov
5ab6464673 sftp integration added for test pipeline 2025-03-21 17:31:57 +03:00
Ivan Nikolaev-Axenov
f53dadf62b fix v14 2025-03-21 16:44:39 +03:00
Ivan Nikolaev-Axenov
140b5ab68f fix v13 2025-03-21 14:20:58 +03:00
Ivan Nikolaev-Axenov
324ba79b9f fix v12 2025-03-21 14:02:17 +03:00
Ivan Nikolaev-Axenov
d2aac78f56 fix v11 2025-03-21 13:48:30 +03:00
Ivan Nikolaev-Axenov
1f49b41cf3 fix v10 2025-03-21 13:26:29 +03:00
Ivan Nikolaev-Axenov
a4c27b6f88 fix v9 2025-03-21 12:53:27 +03:00
Ivan Nikolaev-Axenov
5d1d5a2b73 fix v8 2025-03-21 11:51:04 +03:00
Ivan Nikolaev-Axenov
e987b4cbdb fix v7 2025-03-21 11:38:29 +03:00
Ivan Nikolaev-Axenov
7827f4c509 fix v6 2025-03-21 11:20:18 +03:00
Ivan Nikolaev-Axenov
3a9fb12a98 fix v5 2025-03-21 11:17:30 +03:00
Ivan Nikolaev-Axenov
063877f3dd fix v4 2025-03-21 10:55:21 +03:00
Ivan Nikolaev-Axenov
b3f04e678d fix v3 2025-03-21 10:24:52 +03:00
Ivan Nikolaev-Axenov
778a049139 fix v2 2025-03-20 18:35:18 +03:00
Ivan Nikolaev-Axenov
a669f34fcc fix v1 2025-03-20 18:16:04 +03:00
Ivan Nikolaev-Axenov
16b51c34ed sftp integration added for test pipeline 2025-03-20 17:43:37 +03:00
Ivan Nikolaev-Axenov
30fc9c2a03 run_test_docker_containers.py refactoring, artifacts copy algorithm improved 2025-03-20 10:57:25 +03:00
Ivan Nikolaev-Axenov
8f30ccad7e run_test_docker_containers.py fixed 2025-03-19 17:18:37 +03:00
Ivan Nikolaev-Axenov
31b35c9ffb clearing-tester.jar updated, sleeping algorithm improved 2025-03-19 16:58:26 +03:00
Ivan Nikolaev-Axenov
c76acbf1a0 now tests works on prepared database data, account-service added, clearing-tester.jar and swt-dbf-converter.jar updated 2025-03-19 15:43:30 +03:00
Ivan Nikolaev-Axenov
2ebe71b479 clearing-tester.jar updated 2025-03-14 11:27:32 +03:00
Ivan Nikolaev-Axenov
510fbcf29d clearing-tester.jar updated, importer out directories paths removed from clearing tester's application.properties file 2025-03-12 11:46:17 +03:00
AKurakin
4145388f9b account-service http://jira.mfd.msk:8088/browse/CLS-819 2025-03-10 16:02:12 +03:00
ialbert
24347c6489 http://jira.mfd.msk:8088/browse/CLS-818 2025-03-10 14:14:25 +03:00
ialbert
2017d1f059 http://jira.mfd.msk:8088/browse/CLS-815 2025-02-19 16:23:12 +03:00
ialbert
47bcf7acc8 http://jira.mfd.msk:8088/browse/CLS-815 2025-02-19 15:49:20 +03:00
etreschenkov
02c7669d9f http://jira.mfd.msk:8088/browse/CLS-728 2025-02-18 18:47:30 +03:00
ialbert
d11e45c08c Merge remote-tracking branch 'origin/dev' into dev 2025-02-12 14:52:00 +03:00
ialbert
6094623426 SPCEX-3.16.218 -> SPCEX-3.16.219 session InspectionObligationsV2 bugfix 2025-02-12 14:51:13 +03:00
akulikov
9b726a3c4f reports-service hot fix 2025-02-03 16:24:53 +03:00
ialbert
951a35baae http://jira.mfd.msk:8088/browse/CLS-813 2025-01-30 14:56:26 +03:00
akulikov
89c11c4305 http://jira.mfd.msk:8088/browse/CLS-814 2025-01-29 18:31:11 +03:00
akulikov
ee781393fb http://jira.mfd.msk:8088/browse/CLS-814 2025-01-29 17:59:55 +03:00
etreschenkov
91f5952a58 up pom version 2025-01-29 17:31:53 +03:00
akulikov
be9521af85 http://jira.mfd.msk:8088/browse/CLS-814 2025-01-29 16:36:25 +03:00
ialbert
25090d5499 http://jira.mfd.msk:8088/browse/CLS-813 2025-01-28 14:01:57 +03:00
ialbert
2566140140 http://jira.mfd.msk:8088/browse/CLS-812 2025-01-22 15:05:00 +03:00
etreschenkov
360c566ab2 up pom version 2024-12-28 11:50:20 +03:00
etreschenkov
aa3ae5f936 http://jira.mfd.msk:8088/browse/CLS-810 2024-12-27 12:03:16 +03:00
etreschenkov
abefe20617 http://jira.mfd.msk:8088/browse/CLS-811 2024-12-27 12:01:47 +03:00
etreschenkov
60b6004949 up pom version 2024-12-23 15:20:51 +03:00
akulikov
1d300c965b http://jira.mfd.msk:8088/browse/CLS-809 2024-12-23 14:21:00 +03:00
ialbert
557b9333b5 http://jira.mfd.msk:8088/browse/CLS-807 2024-12-20 18:19:33 +03:00
etreschenkov
37ef9ec2d6 http://jira.mfd.msk:8088/browse/CLS-803 2024-12-18 18:49:23 +03:00
akulikov
7c57fd8676 fix KSRepLccValueReport 2024-12-18 14:20:25 +03:00
ialbert
cf24c196bc http://jira.mfd.msk:8088/browse/CLS-807 2024-12-18 13:19:46 +03:00
ialbert
fb24977c86 http://jira.mfd.msk:8088/browse/CLS-802 2024-12-18 13:16:50 +03:00
Ivan Nikolaev-Axenov
f59537b0bd http://jira.mfd.msk:8088/browse/CLS-806 NullSerializer added, tests updated 2024-12-18 13:07:07 +03:00
etreschenkov
9a0aebfee4 http://jira.mfd.msk:8088/browse/CLS-803 2024-12-18 12:19:36 +03:00
etreschenkov
f9edf0746e up pom version 2024-12-18 12:16:33 +03:00
Ivan Nikolaev-Axenov
7b4ede233b http://jira.mfd.msk:8088/browse/CLS-806 null fixed 2024-12-18 11:13:05 +03:00
Ivan Nikolaev-Axenov
c94bf2a57a http://jira.mfd.msk:8088/browse/CLS-806 add null as empty on serialization 2024-12-18 10:41:18 +03:00
akulikov
8a62e9fcae fix KSRepDepoNettoReport 2024-12-17 17:43:29 +03:00
etreschenkov
ba354d8fca up pom version 2024-12-16 17:24:33 +03:00
akulikov
8664625c89 http://jira.mfd.msk:8088/browse/CLS-795 2024-12-16 17:20:31 +03:00
akulikov
045a806dc7 http://jira.mfd.msk:8088/browse/CLS-795 2024-12-13 13:17:31 +03:00
akulikov
c3b9142dc2 http://jira.mfd.msk:8088/browse/CLS-795 2024-12-13 13:07:37 +03:00
akulikov
7efde73c9e http://jira.mfd.msk:8088/browse/CLS-795 2024-12-13 12:51:37 +03:00
akulikov
394782a6d0 http://jira.mfd.msk:8088/browse/CLS-795 2024-12-13 11:14:20 +03:00
akulikov
4e27aa3e25 http://jira.mfd.msk:8088/browse/CLS-795 2024-12-13 11:08:44 +03:00
ialbert
7d672a905b CI log artifact 2024-12-10 19:12:35 +03:00
Ivan Nikolaev-Axenov
5e4767c2d5 Merge remote-tracking branch 'origin/dev' into dev 2024-12-10 12:39:26 +03:00
Ivan Nikolaev-Axenov
484d71051e clearing-tester.jar updated f9c89855, dbf-swt-checker-1.0.jar updated 5cbfd60a, swt-dbf-converter-0.0.1.jar updated e444a8a7 2024-12-10 12:39:09 +03:00
akulikov
10a3539130 http://jira.mfd.msk:8088/browse/CLS-795 2024-12-09 18:59:26 +03:00
akulikov
a2e89e6a29 http://jira.mfd.msk:8088/browse/CLS-795 add some logs 2024-12-09 18:26:52 +03:00
akulikov
95fd3012ec http://jira.mfd.msk:8088/browse/CLS-795 2024-12-09 17:32:10 +03:00
akulikov
88a45e7361 http://jira.mfd.msk:8088/browse/CLS-795 2024-12-09 16:07:17 +03:00
etreschenkov
4a38552b3f up pom version 2024-12-09 11:43:43 +03:00
ialbert
cd0e5a7165 refactor outbound var name 2024-12-06 12:09:37 +03:00
ialbert
88c2717a8e xml-exporter SDF02/07/53 filename 2024-12-06 12:09:20 +03:00
ialbert
e9858a2f47 http://jira.mfd.msk:8088/browse/CLS-799 2024-12-05 19:12:46 +03:00
ialbert
d71fdd4359 http://jira.mfd.msk:8088/browse/CLS-799 2024-12-05 17:02:11 +03:00
ialbert
5ad2b3eb76 http://jira.mfd.msk:8088/browse/CLS-800 2024-12-04 17:41:11 +03:00
ialbert
8aad63da12 http://jira.mfd.msk:8088/browse/CLS-799 2024-12-04 16:46:36 +03:00
akulikov
70d510a296 http://jira.mfd.msk:8088/browse/CLS-794 add Override annotation 2024-12-04 13:22:21 +03:00
etreschenkov
a7b3ac478e change section for REPORT_KS_VALUE request 2024-12-04 11:05:40 +03:00
akulikov
8d0985d547 http://jira.mfd.msk:8088/browse/CLS-795 REPORT_KS_VALUE to gateway 2024-12-04 10:59:49 +03:00
akulikov
a42303ec45 http://jira.mfd.msk:8088/browse/CLS-795 risk value = 0 if not found 2024-12-04 10:50:10 +03:00
akulikov
95d0c65b1a http://jira.mfd.msk:8088/browse/CLS-795 fix filename 2024-12-03 17:22:53 +03:00
akulikov
968616c93d http://jira.mfd.msk:8088/browse/CLS-795 add extended logs 2024-12-03 16:52:26 +03:00
akulikov
1940d47344 http://jira.mfd.msk:8088/browse/CLS-795 fixes 2024-12-03 15:01:23 +03:00
akulikov
4a31317f85 http://jira.mfd.msk:8088/browse/CLS-795 KSRepLccValueReport 2024-12-03 13:30:29 +03:00
akulikov
82ec3869db xml-importer fix sftp path 2024-12-03 12:59:54 +03:00
etreschenkov
50a67133ef DICTIONARIES.sql version increase 2024-12-02 18:23:40 +03:00
akulikov
1fe25f814e http://jira.mfd.msk:8088/browse/CLS-795 (in progress) 2024-12-02 18:10:17 +03:00
etreschenkov
e6329fa778 fix value for CX84 Task 2024-12-02 17:51:12 +03:00
akulikov
f951575425 http://jira.mfd.msk:8088/browse/CLS-795 (in progress) 2024-12-02 15:36:07 +03:00
akulikov
0c75d61840 http://jira.mfd.msk:8088/browse/CLS-795 add new ReportKeys 2024-12-02 14:06:02 +03:00
etreschenkov
2b9345490d http://jira.mfd.msk:8088/browse/CLS-797 2024-12-02 12:30:41 +03:00
akulikov
8dfb086191 http://jira.mfd.msk:8088/browse/CLS-794 messageId type -> UUID and remove "-" for messageId (fix xml-exporter) 2024-11-29 17:51:47 +03:00
akulikov
edb3760b51 http://jira.mfd.msk:8088/browse/CLS-794 messageId type -> UUID and remove "-" for messageId 2024-11-29 17:20:55 +03:00
akulikov
dd19fa74d9 http://jira.mfd.msk:8088/browse/CLS-794 remove "-" for parentId 2024-11-29 16:51:31 +03:00
akulikov
75ac48c00d http://jira.mfd.msk:8088/browse/CLS-794 2024-11-29 16:35:20 +03:00
AKurakin
dc3427bdf9 http://jira.mfd.msk:8088/browse/CLS-793 Увеличил поля messageId, parentId до 128 символов 2024-11-28 17:31:04 +03:00
AKurakin
133a5105d1 up pom version, meta version SPCEX-3.16.210 2024-11-28 16:39:51 +03:00
AKurakin
109d3616e1 up pom version, meta version 2024-11-28 16:31:29 +03:00
AKurakin
4315b66af3 up pom version SPCEX-3.16.209 2024-11-28 16:24:00 +03:00
akulikov
07df32cfad http://jira.mfd.msk:8088/browse/CLS-792 2024-11-28 15:15:29 +03:00
AKurakin
5ccd97f528 http://jira.mfd.msk:8088/browse/CLS-793 DDL registry 2024-11-28 12:47:32 +03:00
akulikov
1f352d0eb6 http://jira.mfd.msk:8088/browse/CLS-792 2024-11-27 16:50:38 +03:00
akulikov
50b153df79 fix tests xml_exporter/xml_importer 2024-11-27 16:46:39 +03:00
etreschenkov
e8c6f1cb48 Merge branch 'refs/heads/dev_xml-importer-changes' into dev
# Conflicts:
#	clearing-parent/xml-exporter/src/main/java/ru/spcex/clearing/xml/exporter/logic/stages/ExportFromHazelcast.java
#	clearing-parent/xml-exporter/src/test/java/ru/spcex/clearing/xml/exporter/logic/stages/ExportFromHazelcastTest.java
2024-11-27 14:51:52 +03:00
akulikov
35e056c990 http://jira.mfd.msk:8088/browse/CLS-794 2024-11-25 17:33:30 +03:00
akulikov
51e226caf2 extract interfaces WithParentId, WithMessageId 2024-11-25 14:44:36 +03:00
AKurakin
c31797e3d0 http://jira.mfd.msk:8088/browse/CLS-793 DDL & meta 2024-11-25 13:53:52 +03:00
Ivan Nikolaev-Axenov
a0f4a5d8f2 double quoted xml declaration added 2024-11-21 18:07:23 +03:00
Ivan Nikolaev-Axenov
aebfc35eb4 http://jira.mfd.msk:8088/browse/CLS-792 SFTP export fixed, tests updated 2024-11-21 17:42:17 +03:00
Ivan Nikolaev-Axenov
dbe967de51 http://jira.mfd.msk:8088/browse/CLS-791 DF56 empty values fixed 2024-11-21 17:14:30 +03:00
Ivan Nikolaev-Axenov
a2bf45e292 http://jira.mfd.msk:8088/browse/CLS-791 sender and receiver added to application.properties 2024-11-21 16:50:40 +03:00
Ivan Nikolaev-Axenov
9db8a6f4a8 http://jira.mfd.msk:8088/browse/CLS-791 setting section to filename added 2024-11-21 13:00:05 +03:00
Ivan Nikolaev-Axenov
e3099abb42 http://jira.mfd.msk:8088/browse/CLS-790 sftp folder path trailing slash bug fixed 2024-11-21 12:58:50 +03:00
Ivan Nikolaev-Axenov
939c545365 tag attribute renamed in xml-importer/exporter 2024-11-20 18:34:22 +03:00
Ivan Nikolaev-Axenov
70036d214b xml-importer updated 2024-11-20 17:51:27 +03:00
AKurakin
e9fe149587 up pom version 3.15.209 2024-10-31 18:01:22 +03:00
AKurakin
492e2bef95 registry-service http://jira.mfd.msk:8088/browse/CLS-788 заполнение ТКР для ЛКЦ 2024-10-31 17:58:39 +03:00
AKurakin
bf63c85837 registry-service http://jira.mfd.msk:8088/browse/CLS-788 2024-10-31 15:16:12 +03:00
ialbert
cf317b252b Merge remote-tracking branch 'origin/dev' into dev 2024-10-18 16:05:00 +03:00
ialbert
54b0f08050 sdf54 поля SCLIENTN1, INN_DEB, KPP_DEB 2024-10-18 16:04:40 +03:00
akulikov
5f095e2038 reports-service: KSRepLccTradesReportBuilder remove settlementDate condition 2024-10-18 15:51:26 +03:00
ialbert
301ffed9d6 Merge remote-tracking branch 'origin/dev' into dev 2024-10-17 15:04:47 +03:00
ialbert
7e4c8b337c PAYM session execution.coverageStatus 2024-10-17 15:04:33 +03:00
akulikov
09e05770af reports-service: fix number format for netto_sum (fix tests) 2024-10-17 13:27:24 +03:00
akulikov
5a0ac8a373 reports-service: fix number format for netto_sum 2024-10-17 13:21:40 +03:00
ialbert
0846e6a381 PAYM session execution.coverageStatus 2024-10-17 12:16:24 +03:00
ialbert
1999a10786 PAYM session execution.sessionId 2024-10-17 12:15:11 +03:00
ialbert
8abd74f42c Merge remote-tracking branch 'origin/dev' into dev 2024-10-17 11:50:46 +03:00
ialbert
46ac71e6e4 PAYM session
1) load execution SETTLEMENT_DATE >= today
2) set execution.sessionId
2024-10-17 11:50:32 +03:00
etreschenkov
620370c9eb fix bug gateway-api 2024-10-16 18:57:53 +03:00
etreschenkov
46cf5f0bf8 fix version 2024-10-16 14:42:59 +03:00
etreschenkov
343e031755 up pom version 2024-10-16 14:37:23 +03:00
akulikov
e50a4eb33a http://jira.mfd.msk:8088/browse/CLS-783 new settings 2024-10-16 11:45:37 +03:00
etreschenkov
833532e0fc http://jira.mfd.msk:8088/browse/CLS-699 2024-10-15 14:31:04 +03:00
etreschenkov
1bf0faf8d4 http://jira.mfd.msk:8088/browse/CLS-778 2024-10-15 13:43:10 +03:00
etreschenkov
b1ce26ed89 delete new fields from bankAccount 2024-10-15 13:19:16 +03:00
ialbert
a1b1bbc1a5 Merge remote-tracking branch 'origin/dev' into dev 2024-10-15 12:37:30 +03:00
ialbert
f1a83d7ae4 http://jira.mfd.msk:8088/browse/CLS-784 2024-10-15 12:37:16 +03:00
akulikov
4e66ed3889 fix KSRepCashNettoReport 2024-10-13 12:10:20 +03:00
ialbert
99f96e6df0 ialbert 2 minutes ago identification funds ANLT search by DMAU [3] 2024-10-12 10:23:28 +03:00
ialbert
d027b75fe9 identification funds ANLT search by DMAU [2] 2024-10-12 10:20:57 +03:00
ialbert
9d06d5a758 Merge remote-tracking branch 'origin/dev' into dev 2024-10-12 10:08:26 +03:00
ialbert
1814f212eb identification funds ANLT search by DMAU 2024-10-12 10:08:11 +03:00
akulikov
8d37702e3d http://jira.mfd.msk:8088/browse/CLS-767 2024-10-11 16:59:39 +03:00
ialbert
d9c46c3ec5 Merge remote-tracking branch 'origin/dev' into dev 2024-10-11 15:46:20 +03:00
ialbert
85d9fc6154 http://jira.mfd.msk:8088/browse/CLS-781 проверка 08 21 для ЦК 2024-10-11 15:46:04 +03:00
akulikov
ffb3e13ba2 http://jira.mfd.msk:8088/browse/CLS-767 2024-10-10 18:27:09 +03:00
etreschenkov
68a10e5f2a account service bug fix 2024-10-10 16:24:57 +03:00
etreschenkov
868540ffa3 account service bug fix 2024-10-10 16:24:27 +03:00
etreschenkov
115fcc1aac account service bug fix 2024-10-10 16:05:42 +03:00
etreschenkov
52fc4f50b1 fix config 2024-10-10 14:14:56 +03:00
akulikov
ab98240a00 http://jira.mfd.msk:8088/browse/CLS-765 2024-10-09 17:40:55 +03:00
AKurakin
6bd925c231 trade-importer http://jira.mfd.msk:8088/browse/CLS-777 2024-10-09 17:04:19 +03:00
AKurakin
94a0a3ab57 http://jira.mfd.msk:8088/browse/CLS-769 добавил пример настройки 2024-10-09 16:06:54 +03:00
ialbert
e007a42226 Merge remote-tracking branch 'origin/dev' into dev 2024-10-09 15:05:28 +03:00
ialbert
72674920d1 http://jira.mfd.msk:8088/browse/CLS-769 вывод средств 2024-10-09 14:55:31 +03:00
akulikov
8e87025c73 http://jira.mfd.msk:8088/browse/CLS-765 2024-10-09 14:44:02 +03:00
akulikov
5182a1ec8c http://jira.mfd.msk:8088/browse/CLS-765 2024-10-09 14:42:55 +03:00
AKurakin
bdadbe1caa DDL восстановил историю версии 3.14 2024-10-09 14:14:08 +03:00
AKurakin
398f4cbd24 http://jira.mfd.msk:8088/browse/CLS-776 DDL 3.15 +повые поля 2024-10-09 14:02:07 +03:00
ialbert
15f24ad82b Merge remote-tracking branch 'origin/dev' into dev 2024-10-09 14:00:34 +03:00
ialbert
95e97d9ff4 PAYM session forming payment instructions account condition: remove companyId=1 2024-10-09 14:00:20 +03:00
akulikov
7782c3bc1f http://jira.mfd.msk:8088/browse/CLS-767 2024-10-08 16:50:06 +03:00
akulikov
08cfe0485c http://jira.mfd.msk:8088/browse/CLS-765 2024-10-08 16:46:55 +03:00
ialbert
356dbeb7cb Merge remote-tracking branch 'origin/dev' into dev 2024-10-08 14:32:39 +03:00
ialbert
92243b0855 PAYM session bugfix revise error 2024-10-08 14:32:14 +03:00
etreschenkov
1229a2e783 http://jira.mfd.msk:8088/browse/CLS-767#comment-62140 2024-10-07 13:18:45 +03:00
etreschenkov
0a7ba03f56 http://jira.mfd.msk:8088/browse/CLS-774 chery pick 2024-10-07 11:34:09 +03:00
ialbert
1c6f6ce36c Merge remote-tracking branch 'origin/dev' into dev 2024-10-07 11:14:47 +03:00
etreschenkov
de49489f0a fix GatewayService 2024-10-07 09:27:55 +03:00
etreschenkov
57f8f32730 http://jira.mfd.msk:8088/browse/CLS-774 chery pick 2024-10-04 19:11:20 +03:00
etreschenkov
402af8f4a0 http://jira.mfd.msk:8088/browse/CLS-774 2024-10-04 19:08:46 +03:00
ialbert
ef0bb6cf7d http://jira.mfd.msk:8088/browse/CLS-769 вывод средств OM*T checks 2024-10-04 15:22:07 +03:00
etreschenkov
58840bdd76 fix ddl 2024-10-04 12:53:11 +03:00
akulikov
592e61ae49 http://jira.mfd.msk:8088/browse/CLS-765 fix (property must be unnecessary) 2024-10-03 20:28:31 +03:00
akulikov
128b5b681b http://jira.mfd.msk:8088/browse/CLS-765 fix (property must be unnecessary) 2024-10-03 20:20:57 +03:00
etreschenkov
dccfc37439 http://jira.mfd.msk:8088/browse/CLS-760 2024-10-03 17:35:03 +03:00
akulikov
7e2b80b317 http://jira.mfd.msk:8088/browse/CLS-765 fix (property must be unnecessary) 2024-10-03 17:00:21 +03:00
akulikov
fa76a3b137 http://jira.mfd.msk:8088/browse/CLS-767 fixes 2024-10-03 16:55:27 +03:00
etreschenkov
27c44fa262 http://jira.mfd.msk:8088/browse/CLS-768 2024-10-03 16:44:01 +03:00
etreschenkov
70a0316d19 http://jira.mfd.msk:8088/browse/CLS-768 2024-10-03 16:42:07 +03:00
etreschenkov
9976273567 http://jira.mfd.msk:8088/browse/CLS-772 2024-10-03 15:55:23 +03:00
akulikov
be90d018d1 http://jira.mfd.msk:8088/browse/CLS-765 2024-10-03 15:50:47 +03:00
etreschenkov
a849d5d026 http://jira.mfd.msk:8088/browse/CLS-770 2024-10-03 14:04:39 +03:00
etreschenkov
345feb19b8 http://jira.mfd.msk:8088/browse/CLS-770 2024-10-02 19:29:57 +03:00
etreschenkov
c6767821aa http://jira.mfd.msk:8088/browse/CLS-770 2024-10-02 18:46:16 +03:00
etreschenkov
f26826bb4e http://jira.mfd.msk:8088/browse/CLS-764 2024-10-02 18:35:52 +03:00
etreschenkov
454bb99dfa fix naming for riskParameter/rates 2024-10-02 18:14:33 +03:00
etreschenkov
2615cc79e4 fix naming for riskParameter/rates 2024-10-02 17:40:26 +03:00
etreschenkov
78e38d0e0a fix naming for riskParameter/rates 2024-10-02 17:32:54 +03:00
akulikov
fd87786d85 http://jira.mfd.msk:8088/browse/CLS-767 2024-10-02 17:00:17 +03:00
akulikov
05ca97688a http://jira.mfd.msk:8088/browse/CLS-767 2024-10-02 16:39:34 +03:00
etreschenkov
24824f55c2 http://jira.mfd.msk:8088/browse/CLS-756 2024-10-02 16:29:42 +03:00
etreschenkov
2efb93702d http://jira.mfd.msk:8088/browse/CLS-760 2024-10-02 16:10:03 +03:00
etreschenkov
51811cee42 http://jira.mfd.msk:8088/browse/CLS-757 2024-10-02 15:34:06 +03:00
ialbert
62f0f3246f Merge remote-tracking branch 'origin/dev' into dev 2024-10-02 15:32:53 +03:00
ialbert
c4390848c5 Merge branch 'dev' into session-PREP-PAYM 2024-10-02 15:31:54 +03:00
etreschenkov
39655fefd0 http://jira.mfd.msk:8088/browse/CLS-761 2024-10-02 15:31:40 +03:00
ialbert
e729c698f6 PAYM session revise fix 2024-10-02 15:25:26 +03:00
etreschenkov
2a365606fa http://jira.mfd.msk:8088/browse/CLS-764 [rates] 2024-10-02 15:14:47 +03:00
ialbert
8e0c70cfd0 PAYM session inspection obligations bugfix 2024-10-02 14:07:19 +03:00
etreschenkov
c70874b179 http://jira.mfd.msk:8088/browse/CLS-764 [risk-parameter] 2024-10-02 14:01:31 +03:00
etreschenkov
b87f5dbb80 http://jira.mfd.msk:8088/browse/CLS-764 2024-10-02 13:48:33 +03:00
etreschenkov
cc48b21066 http://jira.mfd.msk:8088/browse/CLS-761 2024-10-02 13:48:10 +03:00
ialbert
8a82bb5f63 PAYM session requirement and obligations execution matching bugfix 2024-10-02 13:14:21 +03:00
akulikov
d9fdfba69a http://jira.mfd.msk:8088/browse/CLS-767 new topic 2024-10-02 11:07:02 +03:00
ialbert
38ff413e84 PAYM session bugfix 2024-10-01 19:50:30 +03:00
ialbert
6534ab34ce PAYM session section MKR -> CURR 2024-10-01 19:23:01 +03:00
ialbert
0334d8fcdf PAYM session start & continue 2024-10-01 19:19:15 +03:00
ialbert
3b37d06e56 PAYM session: removed ClearingAvailable check for Central Counterparty 2024-10-01 18:58:55 +03:00
Ivan Nikolaev-Axenov
7a03fd1f62 http://jira.mfd.msk:8088/browse/CLS-754 bug fixed 2024-10-01 14:51:41 +03:00
etreschenkov
6a8c716f3f http://jira.mfd.msk:8088/browse/CLS-757 2024-10-01 14:24:07 +03:00
etreschenkov
b25c99fb94 http://jira.mfd.msk:8088/browse/CLS-757 2024-10-01 14:19:46 +03:00
etreschenkov
baee68f25b http://jira.mfd.msk:8088/browse/CLS-754 2024-10-01 14:05:12 +03:00
ialbert
33bc8ce75d PAYM session 2024-10-01 13:14:32 +03:00
ialbert
bfb6cb7380 PREP session 2024-10-01 13:09:20 +03:00
ialbert
fbc0836c07 PREP session & PAYM session 2024-10-01 13:07:28 +03:00
etreschenkov
6f3c205fd3 http://jira.mfd.msk:8088/browse/CLS-747 2024-10-01 12:07:22 +03:00
Ivan Nikolaev-Axenov
cda217e276 http://jira.mfd.msk:8088/browse/CLS-754 ArrayIndexOutOfBoundsException fixed 2024-10-01 11:37:50 +03:00
etreschenkov
992bbacce6 http://jira.mfd.msk:8088/browse/CLS-755 2024-09-30 17:39:08 +03:00
Ivan Nikolaev-Axenov
8e156bca82 .gitlab-ci.yml changed 2024-09-26 16:12:11 +03:00
Ivan Nikolaev-Axenov
b9ec6485c7 clt_test bug fixed 2024-09-26 14:19:32 +03:00
Ivan Nikolaev-Axenov
99c21919bb clr_test no longer relying on external ddl.sql 2024-09-26 14:06:00 +03:00
ialbert
95b27f3bd4 Merge remote-tracking branch 'origin/dev' into dev 2024-09-26 12:50:49 +03:00
ialbert
bfde155d9f http://jira.mfd.msk:8088/browse/CLS-757 2024-09-26 12:49:48 +03:00
etreschenkov
245b3481db http://jira.mfd.msk:8088/browse/CLS-747 2024-09-25 18:27:59 +03:00
etreschenkov
b48c455a3e up pom version 2024-09-25 18:27:52 +03:00
etreschenkov
b61f3956f3 Merge remote-tracking branch 'refs/remotes/origin/new' into dev 2024-09-24 12:27:09 +03:00
ialbert
4c804d243e Revert "пример spring state machine для FinalSession, тест, понизил версию"
This reverts commit 2e60049163.
2024-09-23 19:08:43 +03:00
ialbert
2e60049163 пример spring state machine для FinalSession, тест, понизил версию 2024-09-23 18:59:33 +03:00
Ivan Nikolaev-Axenov
fc3fc9cef6 xml-importer minor bug fix and refactoring 2024-09-13 11:37:53 +03:00
AKurakin
b3420edb46 http://jira.mfd.msk:8088/browse/CLS-747 DDL 3.14 поправил скрипт обновления 2024-09-12 19:22:11 +03:00
AKurakin
20aef32798 http://jira.mfd.msk:8088/browse/CLS-754 мелкий рефакторинг 2024-09-12 19:09:54 +03:00
Ivan Nikolaev-Axenov
0ae83b1c52 http://jira.mfd.msk:8088/browse/CLS-730 separate hazelcast and kafka instances removed, application.properties updated 2024-09-12 18:46:16 +03:00
Ivan Nikolaev-Axenov
bcd1aa2b40 http://jira.mfd.msk:8088/browse/CLS-754 2024-09-12 18:15:10 +03:00
AKurakin
3fd5ca37ab Merge branch 'CLS-742' into new 2024-09-12 14:01:26 +03:00
AKurakin
3d58504649 http://jira.mfd.msk:8088/browse/CLS-742 мелкая правка 2024-09-12 14:00:29 +03:00
Ivan Nikolaev-Axenov
80b18d06f0 Merge remote-tracking branch 'origin/new' into new 2024-09-12 13:52:55 +03:00
Ivan Nikolaev-Axenov
d404d58d6c xml-importer saveRequestInfo disabled on kafka 2024-09-12 13:52:35 +03:00
AKurakin
67eab3a186 Merge branch 'CLS-742' into new 2024-09-12 13:46:03 +03:00
Ivan Nikolaev-Axenov
4966cd552e .gitlab-ci.yml updated 2024-09-12 12:59:34 +03:00
Ivan Nikolaev-Axenov
a06300b9f3 http://jira.mfd.msk:8088/browse/CLS-730 messaging to bankAccount kafka's topic fixed 2024-09-12 12:31:16 +03:00
Ivan Nikolaev-Axenov
dc23b32141 http://jira.mfd.msk:8088/browse/CLS-730 messaging to bankAccount kafka's topic added 2024-09-11 15:35:05 +03:00
Ivan Nikolaev-Axenov
426d608a44 http://jira.mfd.msk:8088/browse/CLS-742 bug fixes 2024-09-10 17:51:43 +03:00
Ivan Nikolaev-Axenov
f95541fa79 http://jira.mfd.msk:8088/browse/CLS-730 2024-09-10 16:55:50 +03:00
AKurakin
30d1d660f1 backend-api http://jira.mfd.msk:8088/browse/CLS-746 реквесты для меты 2024-09-09 13:45:09 +03:00
AKurakin
c947aed016 http://jira.mfd.msk:8088/browse/CLS-747 DDL 3.14, часть CLS-746 меты 2024-09-09 13:30:27 +03:00
akulikov
515e293605 Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	clearing-parent/account-service/pom.xml
#	clearing-parent/backend-api/pom.xml
#	clearing-parent/balance-service/pom.xml
#	clearing-parent/classes/pom.xml
#	clearing-parent/cleaning-builders/pom.xml
#	clearing-parent/clearing-service/pom.xml
#	clearing-parent/clearing-validation/pom.xml
#	clearing-parent/company-service/pom.xml
#	clearing-parent/db-scripts/pom.xml
#	clearing-parent/dbf-exporter/pom.xml
#	clearing-parent/dbf-importer/pom.xml
#	clearing-parent/dictionary/pom.xml
#	clearing-parent/extdb-importer/pom.xml
#	clearing-parent/gateway-api/pom.xml
#	clearing-parent/imdg-hist/pom.xml
#	clearing-parent/imdg/pom.xml
#	clearing-parent/lim-exporter/pom.xml
#	clearing-parent/pom.xml
#	clearing-parent/registry-service/pom.xml
#	clearing-parent/reports-service/pom.xml
#	clearing-parent/scheduler-service/pom.xml
#	clearing-parent/securities-service/pom.xml
#	clearing-parent/security-util/pom.xml
#	clearing-parent/swt-exporter/pom.xml
#	clearing-parent/swt-importer/pom.xml
#	clearing-parent/test-clearing/pom.xml
#	clearing-parent/trade-importer/pom.xml
#	clearing-parent/utility-service/pom.xml
#	platform-parent/pom.xml
#	pom.xml
#	z-distr/pom.xml
2024-09-09 12:51:58 +03:00
akulikov
905c4a0fd5 merge CLS-752 2024-09-09 12:51:32 +03:00
akulikov
9701877672 Merge branch 'master' into dev
# Conflicts:
#	clearing-parent/account-service/pom.xml
#	clearing-parent/backend-api/pom.xml
#	clearing-parent/balance-service/pom.xml
#	clearing-parent/classes/pom.xml
#	clearing-parent/cleaning-builders/pom.xml
#	clearing-parent/clearing-service/pom.xml
#	clearing-parent/clearing-validation/pom.xml
#	clearing-parent/company-service/pom.xml
#	clearing-parent/db-scripts/pom.xml
#	clearing-parent/dbf-exporter/pom.xml
#	clearing-parent/dbf-importer/pom.xml
#	clearing-parent/dictionary/pom.xml
#	clearing-parent/extdb-importer/pom.xml
#	clearing-parent/gateway-api/pom.xml
#	clearing-parent/imdg-hist/pom.xml
#	clearing-parent/imdg/pom.xml
#	clearing-parent/lim-exporter/pom.xml
#	clearing-parent/pom.xml
#	clearing-parent/registry-service/pom.xml
#	clearing-parent/reports-service/pom.xml
#	clearing-parent/scheduler-service/pom.xml
#	clearing-parent/securities-service/pom.xml
#	clearing-parent/security-util/pom.xml
#	clearing-parent/swt-exporter/pom.xml
#	clearing-parent/swt-importer/pom.xml
#	clearing-parent/test-clearing/pom.xml
#	clearing-parent/trade-importer/pom.xml
#	clearing-parent/utility-service/pom.xml
#	platform-parent/pom.xml
#	pom.xml
#	z-distr/pom.xml
2024-09-09 12:38:40 +03:00
akulikov
b408fd5375 http://jira.mfd.msk:8088/browse/CLS-753 2024-09-09 12:37:00 +03:00
akulikov
8d3aff8a83 reports-service: http://jira.mfd.msk:8088/browse/CLS-711 fix new settings 2024-09-09 12:11:55 +03:00
etreschenkov
27d90be456 up pom version 2024-09-09 12:03:12 +03:00
etreschenkov
ea74d18b1a http://jira.mfd.msk:8088/browse/CLS-752 2024-09-09 11:54:45 +03:00
etreschenkov
53200b4233 up pom version 2024-09-06 14:31:22 +03:00
etreschenkov
e99ccbfcb3 fix clearingLiabilities 2024-09-06 14:30:43 +03:00
Ivan Nikolaev-Axenov
b752547d4d .gitlab-ci.yml updated to start pipelines on sub-branches 2024-09-05 17:38:31 +03:00
etreschenkov
1ee6fba375 http://jira.mfd.msk:8088/browse/CLS-751 2024-09-04 11:01:06 +03:00
etreschenkov
eca157b75b up pom version 2024-09-04 10:54:34 +03:00
etreschenkov
7d9a18c6f5 http://jira.mfd.msk:8088/browse/CLS-751 2024-09-04 10:53:32 +03:00
etreschenkov
c99d53dd73 http://jira.mfd.msk:8088/browse/CLS-751 2024-09-04 10:48:28 +03:00
etreschenkov
69620bf7b7 http://jira.mfd.msk:8088/browse/CLS-726 2024-09-03 12:50:49 +03:00
Ivan Nikolaev-Axenov
6bd828eb86 clearing-tester.jar updated 2024-09-03 11:18:27 +03:00
etreschenkov
7c51777eb9 http://jira.mfd.msk:8088/browse/CLS-726 2024-09-02 17:04:22 +03:00
etreschenkov
7fc8f95c20 http://jira.mfd.msk:8088/browse/CLS-726 2024-09-02 17:02:58 +03:00
Ivan Nikolaev-Axenov
3a43598223 http://jira.mfd.msk:8088/browse/CLS-742 HazelcastServiceBase 2024-09-02 12:43:07 +03:00
Ivan Nikolaev-Axenov
4256c05345 http://jira.mfd.msk:8088/browse/CLS-742 2024-09-02 10:44:49 +03:00
etreschenkov
e557b948fe up pom version 2024-08-29 15:41:36 +03:00
etreschenkov
7cf8d40896 new implementation QueueConsumer for ReportService 2024-08-29 13:08:21 +03:00
etreschenkov
6e9209d249 disable log trade importer 2024-08-29 13:06:51 +03:00
ialbert
2fc0ce5029 Merge remote-tracking branch 'origin/dev' into dev 2024-08-28 18:54:55 +03:00
ialbert
234bc7e8b6 sdf54#specif_1 = pmt#paymentPurpose + bankAccount#destination 2024-08-28 18:54:42 +03:00
etreschenkov
e88e0f8387 добавлена пагинация для registry ^AM.* 2024-08-28 16:08:37 +03:00
etreschenkov
8400bafe4d добавлена пагинация для execution 2024-08-28 14:57:48 +03:00
ialbert
c35ac0d44c session step 3 (ObligationAdmission) - [account is active validation] NLP bugfix 2024-08-28 12:35:36 +03:00
etreschenkov
e45d499555 добавлена пагинация для execution 2024-08-28 11:42:52 +03:00
etreschenkov
54f305447f http://jira.mfd.msk:8088/browse/CLS-735 2024-08-27 15:08:38 +03:00
Ivan Nikolaev-Axenov
d62f6d9437 Merge remote-tracking branch 'origin/dev' into dev 2024-08-27 13:51:20 +03:00
Ivan Nikolaev-Axenov
57400e0b7b xml-importer XMLImporterService error directory bug fixed 2024-08-27 13:51:05 +03:00
etreschenkov
c38cfaaab9 Merge remote-tracking branch 'refs/remotes/origin/master' into dev
# Conflicts:
#	clearing-parent/account-service/pom.xml
#	clearing-parent/backend-api/pom.xml
#	clearing-parent/balance-service/pom.xml
#	clearing-parent/classes/pom.xml
#	clearing-parent/cleaning-builders/pom.xml
#	clearing-parent/clearing-service/pom.xml
#	clearing-parent/clearing-validation/pom.xml
#	clearing-parent/company-service/pom.xml
#	clearing-parent/db-scripts/pom.xml
#	clearing-parent/dbf-exporter/pom.xml
#	clearing-parent/dbf-importer/pom.xml
#	clearing-parent/dictionary/pom.xml
#	clearing-parent/extdb-importer/pom.xml
#	clearing-parent/gateway-api/pom.xml
#	clearing-parent/imdg-hist/pom.xml
#	clearing-parent/imdg/pom.xml
#	clearing-parent/lim-exporter/pom.xml
#	clearing-parent/pom.xml
#	clearing-parent/registry-service/pom.xml
#	clearing-parent/reports-service/pom.xml
#	clearing-parent/scheduler-service/pom.xml
#	clearing-parent/securities-service/pom.xml
#	clearing-parent/security-util/pom.xml
#	clearing-parent/swt-exporter/pom.xml
#	clearing-parent/swt-importer/pom.xml
#	clearing-parent/test-clearing/pom.xml
#	clearing-parent/trade-importer/pom.xml
#	clearing-parent/utility-service/pom.xml
#	platform-parent/pom.xml
#	pom.xml
#	z-distr/pom.xml
2024-08-27 12:26:42 +03:00
etreschenkov
bee974f113 Merge branch 'refs/heads/db_direct' into dev 2024-08-27 12:26:11 +03:00
etreschenkov
fe3c54aa0c http://jira.mfd.msk:8088/browse/CLS-735 2024-08-27 12:21:08 +03:00
etreschenkov
54ed129de6 http://jira.mfd.msk:8088/browse/CLS-735 2024-08-27 12:20:04 +03:00
Ivan Nikolaev-Axenov
08243c6964 clearing-tester.jar updated 2024-08-26 18:52:46 +03:00
etreschenkov
d48c8ed610 Merge branch 'refs/heads/backendapi-pagination' into dev 2024-08-26 12:27:53 +03:00
etreschenkov
db90b9a388 http://jira.mfd.msk:8088/browse/CLS-734 2024-08-26 12:27:26 +03:00
Ivan Nikolaev-Axenov
c9075bacf8 getByFilter pagination fixed 2024-08-23 17:05:01 +03:00
Ivan Nikolaev-Axenov
e3439cacc2 getAll endpoint returned and added new getByFilter endpoint 2024-08-23 16:09:05 +03:00
Ivan Nikolaev-Axenov
cebd7c2a8c status renamed to registryDesignation 2024-08-23 13:48:59 +03:00
Ivan Nikolaev-Axenov
2fa33e3470 added pagination to get all registries controller 2024-08-23 13:18:33 +03:00
etreschenkov
ca2de38dc0 disable specific registries mapstore 2024-08-23 12:33:43 +03:00
akulikov
05b19f488a reports-service: http://jira.mfd.msk:8088/browse/CLS-711 2024-08-22 19:07:18 +03:00
AKurakin
43020f9631 http://jira.mfd.msk:8088/browse/CLS-740 imdg bug fix 2024-08-22 19:04:14 +03:00
AKurakin
3ed5d8eab2 Merge remote-tracking branch 'origin/CLS-731' into dev 2024-08-22 18:48:16 +03:00
Ivan Nikolaev-Axenov
7e8b3cc13e http://jira.mfd.msk:8088/browse/CLS-741 fixed 2024-08-22 18:34:50 +03:00
AKurakin
41d1c3c261 Merge remote-tracking branch 'origin/CLS-741' into dev 2024-08-22 17:59:22 +03:00
akulikov
3f57080c16 reports-service: http://jira.mfd.msk:8088/browse/CLS-711 2024-08-22 17:45:25 +03:00
akulikov
048eba8b11 reports-service: http://jira.mfd.msk:8088/browse/CLS-711 fix getSingleObjectById for DBMap 2024-08-22 16:56:26 +03:00
akulikov
5a2607607e reports-service: http://jira.mfd.msk:8088/browse/CLS-711 fix dbFieldMatcher 2024-08-22 14:33:00 +03:00
AKurakin
ed5b85daac http://jira.mfd.msk:8088/browse/CLS-740 add BlacklistMarket (2/2) 2024-08-22 14:13:05 +03:00
Ivan Nikolaev-Axenov
1a6ed38fee http://jira.mfd.msk:8088/browse/CLS-741 printing logs on trade in blacklistMarket disabled 2024-08-22 12:04:10 +03:00
AKurakin
fa01562a9c http://jira.mfd.msk:8088/browse/CLS-740 add BlacklistMarket (1/2) 2024-08-22 11:58:45 +03:00
Ivan Nikolaev-Axenov
6dcba1dded http://jira.mfd.msk:8088/browse/CLS-731 trade-importer trading day checker fixed 2024-08-22 11:34:21 +03:00
akulikov
8f9713c055 reports-service: http://jira.mfd.msk:8088/browse/CLS-711 2024-08-21 14:57:29 +03:00
akulikov
77f8e2353b reports-service: http://jira.mfd.msk:8088/browse/CLS-711 2024-08-21 14:47:35 +03:00
etreschenkov
2183ff953a http://jira.mfd.msk:8088/browse/CLS-736 // http://jira.mfd.msk:8088/browse/CLS-733 // http://jira.mfd.msk:8088/browse/CLS-738 // http://jira.mfd.msk:8088/browse/CLS-738 2024-08-21 13:43:16 +03:00
etreschenkov
7a49e4b727 add new registries Map 2024-08-21 13:43:16 +03:00
AKurakin
a0f99a2dc6 trade-importer http://jira.mfd.msk:8088/browse/CLS-731 2024-08-20 19:15:35 +03:00
etreschenkov
eecddc03cc up pom version 2024-08-20 18:49:01 +03:00
etreschenkov
a30cb92e47 http://jira.mfd.msk:8088/browse/CLS-739 2024-08-20 18:48:27 +03:00
ialbert
8ead0d74b5 http://jira.mfd.msk:8088/browse/CLS-732 sdf54 & DM*I hotfix 2024-08-14 16:01:57 +03:00
ialbert
98bb9a26c8 pom upversion SPCEX-3.12.9 -> SPCEX-3.12.10 2024-08-14 12:35:42 +03:00
ialbert
a4febcafb1 http://jira.mfd.msk:8088/browse/CLS-732 sdf54 & DM*I hotfix 2024-08-14 12:23:25 +03:00
Ivan Nikolaev-Axenov
1a2b284bd9 docker-compose.yml rollback 2024-08-12 16:08:44 +03:00
Ivan Nikolaev-Axenov
380e496705 healthcheck for zookeeper added 2024-08-12 15:40:38 +03:00
ialbert
ebbe098ced Merge remote-tracking branch 'origin/dev' into dev 2024-08-12 13:11:44 +03:00
ialbert
fba08b73ea execution upload bugfix 2024-08-12 13:11:19 +03:00
AKurakin
0d0c5530f2 backend-api meta 2024-08-08 19:24:05 +03:00
ialbert
886e9b80a1 execution upload optimization cache 2024-08-08 16:34:08 +03:00
ialbert
c9fd35d1c3 Merge remote-tracking branch 'origin/dev' into dev 2024-08-08 16:15:41 +03:00
ialbert
238cbf4f8e execution load optimization cash 2024-08-08 16:15:29 +03:00
Ivan Nikolaev-Axenov
20b1eef52d resource_group added to .gitlab-ci.yml to control concurrent tests 2024-08-08 13:34:54 +03:00
Ivan Nikolaev-Axenov
632bf30416 Merge remote-tracking branch 'origin/dev' into dev 2024-08-08 11:51:53 +03:00
Ivan Nikolaev-Axenov
43162aa18a xml-importer and xml-exporter added to z-distr 2024-08-08 11:51:29 +03:00
AKurakin
afe781e6df Merge branch 'CLS-724-725-726' into dev 2024-08-08 11:12:54 +03:00
Ivan Nikolaev-Axenov
fe1279ae63 SDf20Table duplicate code fixed 2024-08-08 11:04:12 +03:00
Ivan Nikolaev-Axenov
8d70db939f added allowed branched to .gitlab-ci.yml 2024-08-07 16:59:24 +03:00
Ivan Nikolaev-Axenov
4994ead0d8 pom fixed 2024-08-07 16:41:46 +03:00
Ivan Nikolaev-Axenov
27c2510588 notification sending on duplicate transaction number added in swt-importer http://jira.mfd.msk:8088/browse/CLS-726 2024-08-07 16:41:27 +03:00
Ivan Nikolaev-Axenov
6ccd8d3a3e notification sending on duplicate transaction number added in xml-importer http://jira.mfd.msk:8088/browse/CLS-725 2024-08-07 16:41:04 +03:00
Ivan Nikolaev-Axenov
ed69bd7ec2 notification sending on duplicate transaction number added in dbf-importer http://jira.mfd.msk:8088/browse/CLS-724 2024-08-07 16:40:18 +03:00
ialbert
9974b5ddc2 Merge remote-tracking branch 'origin/dev' into dev 2024-08-07 16:38:57 +03:00
ialbert
a835a59e8d execution uploading logs 2024-08-07 16:38:39 +03:00
AKurakin
cd341bf166 up pom version SPCEX-3.12.103 2024-08-07 16:22:25 +03:00
ialbert
4bf2c45c69 execution uploading optimization 2024-08-07 15:17:29 +03:00
ialbert
fc8d235fce execution uploading optimization 2024-08-07 11:30:41 +03:00
ialbert
21cd02b20a execution uploading optimization 2024-08-06 19:45:50 +03:00
AKurakin
31aced0af6 registry-service http://jira.mfd.msk:8088/browse/CLS-713 2024-08-06 19:28:10 +03:00
akulikov
6e7fce1fe2 reports-service: http://jira.mfd.msk:8088/browse/CLS-711 (fix init) 2024-08-06 19:25:36 +03:00
akulikov
a99104d8dd reports-service: http://jira.mfd.msk:8088/browse/CLS-711 (1st comment) 2024-08-06 19:11:48 +03:00
AKurakin
21d1f180be clearing-service trade-importer http://jira.mfd.msk:8088/browse/CLS-718 2024-08-06 19:08:46 +03:00
akulikov
44c547d07c reports-service new features (direct db) 2024-08-06 18:25:55 +03:00
AKurakin
8076bc22da trade-importer http://jira.mfd.msk:8088/browse/CLS-718 2024-08-06 17:12:54 +03:00
AKurakin
517d67fed3 db-scripts http://jira.mfd.msk:8088/browse/CLS-720 DATA_REGISTER_CODE.sql актуализировал XML и поправил задвоившиеся id 2024-08-06 16:23:27 +03:00
AKurakin
e0d55568fd account-service http://jira.mfd.msk:8088/browse/CLS-722 2024-08-06 15:24:54 +03:00
AKurakin
730f759908 backend-api http://jira.mfd.msk:8088/browse/CLS-721 meta 2024-08-06 14:52:38 +03:00
AKurakin
bbd133093f imdg http://jira.mfd.msk:8088/browse/CLS-728 2024-08-06 13:32:01 +03:00
Ivan Nikolaev-Axenov
d9e93271b0 test v7 2024-08-05 18:04:48 +03:00
Ivan Nikolaev-Axenov
f19e8853b0 test unit session 2024-08-05 15:36:59 +03:00
akulikov
8d797212b5 something ready for test 2024-08-05 14:47:04 +03:00
Ivan Nikolaev-Axenov
b21ae8206f test v6 2024-08-05 14:03:57 +03:00
Ivan Nikolaev-Axenov
07e4ecb37f test v5 2024-08-05 13:43:30 +03:00
Ivan Nikolaev-Axenov
2bb92decad stage removed from .gitlab-ci.yml 2024-08-05 13:11:48 +03:00
ialbert
761204b076 RegistryCodeSqlBuilder 2024-08-05 12:40:46 +03:00
akulikov
10d6ad51f1 RegistryCodeSqlBuilder 2024-08-05 12:18:39 +03:00
akulikov
2c00b9194b RegistryCodeSqlBuilder new interface 2024-08-05 12:18:01 +03:00
Ivan Nikolaev-Axenov
eb6a75a265 test v4 2024-08-05 12:10:19 +03:00
akulikov
18a74ee7b8 directDB 2024-08-05 11:52:09 +03:00
Ivan Nikolaev-Axenov
6f99e219ca python script updated 2024-08-05 11:38:25 +03:00
Ivan Nikolaev-Axenov
2826ced949 clearing tester and checker updated, added mount to dbf exporter output directory 2024-08-05 10:11:30 +03:00
ialbert
e5da447908 remove C/L 2024-08-02 19:20:43 +03:00
ialbert
360414e75d remove C/L 2024-08-02 19:17:09 +03:00
ialbert
d7b3189a80 session step 10 optimization - C/L 2024-08-02 18:54:21 +03:00
ialbert
b74ebc3b0e session InspectionObligationsV2 (step 5) putAll batch size 200 2024-08-02 17:54:32 +03:00
ialbert
4c0dd1739b imdg eviction policy for ExecutionCurrencyHistoryMapStore/RegistryHistoryMapStore 2024-08-02 17:48:16 +03:00
ialbert
f888e27bea Merge remote-tracking branch 'origin/dev' into dev 2024-08-01 19:40:30 +03:00
ialbert
07c5dba41e clearing-service kafka queue-consumer fix consumer timeout 2024-08-01 19:40:05 +03:00
AKurakin
bf66af936a up pom version SPCEX-3.12.102 2024-08-01 17:39:56 +03:00
ialbert
a8ad3eb474 session RequirementsAndObligationCreation (2 step) optimization 2024-08-01 16:38:17 +03:00
ialbert
8c444e4e1c sessions InclusionObligations (step 4) disable execution updates for TRDT/CURR/UNIT/IPOT 2024-07-31 16:49:55 +03:00
ialbert
9a51aa5558 Merge remote-tracking branch 'origin/dev' into dev 2024-07-31 15:56:35 +03:00
ialbert
adcc2d7b3f session step InclusionObligations (4 step) execution update bugfix 2024-07-31 15:56:22 +03:00
AKurakin
01732fbd31 db-scripts http://jira.mfd.msk:8088/browse/CLS-715 поправил версию. 2024-07-31 15:11:36 +03:00
ialbert
b7158efbde imdg execution currency remove index 2024-07-31 14:11:29 +03:00
ialbert
5013fb2c17 Merge remote-tracking branch 'origin/dev' into dev 2024-07-31 13:58:50 +03:00
ialbert
46da00357e sessions step 3/4 optimization
imdg execution currency index
2024-07-31 13:56:34 +03:00
etreschenkov
4d011400b3 checkout successful_set test 2024-07-31 12:28:31 +03:00
AKurakin
9e7aa54e63 imdg http://jira.mfd.msk:8088/browse/CLS-716 (таск CLS-599 сильно переделали, теперь так) 2024-07-31 12:01:16 +03:00
etreschenkov
8d43e29b30 try 5.1.SESN.FOND.TRDT.NODEPO 2024-07-31 11:54:04 +03:00
etreschenkov
7bccd74de9 try 5.0.SESN.FOND.TRDT 2024-07-31 11:24:17 +03:00
AKurakin
5c92dbff96 db-scripts http://jira.mfd.msk:8088/browse/CLS-715 dictionaries 2024-07-31 11:02:29 +03:00
Ivan Nikolaev-Axenov
2c7c5e554c Merge remote-tracking branch 'origin/dev' into dev 2024-07-30 18:20:22 +03:00
Ivan Nikolaev-Axenov
e15e3aae91 new clearing-tester version 2024-07-30 18:20:10 +03:00
AKurakin
80f61e36cd securities-service http://jira.mfd.msk:8088/browse/CLS-709 (bug fix CLS-612) 2024-07-30 12:01:58 +03:00
AKurakin
9fa4920509 up pom version SPCEX-3.12.101 2024-07-30 11:47:21 +03:00
Ivan Nikolaev-Axenov
1a60016a65 xml-importer&exporter object tag and SDf entities conversion methods fixed, tests fixed 2024-07-30 11:13:32 +03:00
Ivan Nikolaev-Axenov
37c55f851f xml-importer&exporter pom version updated to SPCEX-3.12.100 2024-07-30 11:01:51 +03:00
Ivan Nikolaev-Axenov
a4aa04741e .gitlab-ci.yml updated v139 2024-07-30 10:46:40 +03:00
etreschenkov
f3ca29280a Merge branch 'refs/heads/dev_gitlab_cicd' into dev 2024-07-30 09:50:55 +03:00
Ivan Nikolaev-Axenov
cb1cb42d5d .gitlab-ci.yml updated v138 2024-07-29 18:55:17 +03:00
Ivan Nikolaev-Axenov
efd16f068b .gitlab-ci.yml updated v137 2024-07-29 18:36:21 +03:00
Ivan Nikolaev-Axenov
3542a69cc7 .gitlab-ci.yml updated v136 2024-07-29 18:18:45 +03:00
Ivan Nikolaev-Axenov
dd23656703 .gitlab-ci.yml updated v135 2024-07-29 17:47:27 +03:00
etreschenkov
d1f4da4d4e Merge remote-tracking branch 'refs/remotes/origin/dev_gitlab_cicd' into dev 2024-07-29 17:34:19 +03:00
Ivan Nikolaev-Axenov
c67dcd732a .gitlab-ci.yml updated v134 2024-07-29 17:15:51 +03:00
Ivan Nikolaev-Axenov
1ac6bb4885 .gitlab-ci.yml updated v133 2024-07-29 16:33:55 +03:00
Ivan Nikolaev-Axenov
8dfbf09288 .gitlab-ci.yml updated v132 2024-07-29 16:03:25 +03:00
Ivan Nikolaev-Axenov
1ec3fcc1b8 .gitlab-ci.yml updated v131 2024-07-29 15:41:06 +03:00
Ivan Nikolaev-Axenov
fd54ba9be1 .gitlab-ci.yml updated v130 2024-07-29 12:57:15 +03:00
Ivan Nikolaev-Axenov
c06c9c5eea .gitlab-ci.yml updated v129 2024-07-26 18:32:17 +03:00
Ivan Nikolaev-Axenov
74bc1abd19 .gitlab-ci.yml updated v128 2024-07-26 17:57:17 +03:00
etreschenkov
51c5182e47 Merge remote-tracking branch 'refs/remotes/origin/dev_xml-importer-exporter' into dev 2024-07-26 13:54:21 +03:00
ialbert
21f5e6a680 XDEP PaymentInstruction#PaymentPurpose += По итогу клиринга. 2024-07-26 11:53:36 +03:00
ialbert
06b59fc216 Merge branch 'dev' into all_cache_optimization 2024-07-23 15:07:19 +03:00
ialbert
40ec9fde5f sessions 5 step: batch put all optimization 2024-07-23 14:37:39 +03:00
Ivan Nikolaev-Axenov
e63618367f .gitlab-ci.yml updated v127 2024-07-22 19:21:44 +03:00
Ivan Nikolaev-Axenov
a865b8ae45 .gitlab-ci.yml updated v126 2024-07-22 19:18:42 +03:00
ialbert
05893af032 session 2 step hazelcast batch insert 2024-07-19 15:43:45 +03:00
etreschenkov
fb58f6d1f5 up pom version 2024-07-19 08:43:00 +03:00
ialbert
87082147c8 step 5 cash for all sessions
UnitedSession step 5 cash fix
2024-07-18 18:43:22 +03:00
ialbert
48b629f87e currency session fix tcr list cash 2024-07-18 17:10:23 +03:00
ialbert
a1ebfe5f1f currency session cashing 2024-07-18 17:02:44 +03:00
Ivan Nikolaev-Axenov
7d4dd0a812 .gitlab-ci.yml updated v125 2024-07-18 13:14:29 +03:00
Ivan Nikolaev-Axenov
d3ad08ba27 .gitlab-ci.yml updated v124 2024-07-18 13:00:44 +03:00
ialbert
09f874204b InspectionObligations united cash
InspectionObligationsV2 separated cash
RequirementsAndObligationCreation: unnecessary search removed; registry creating for FOND cashed
2024-07-18 12:11:56 +03:00
ialbert
e6e4449b7f hazelcast cashing map 2024-07-18 12:02:29 +03:00
Ivan Nikolaev-Axenov
d3d449c498 .gitlab-ci.yml updated v123 2024-07-18 10:54:28 +03:00
Ivan Nikolaev-Axenov
3139fce44f .gitlab-ci.yml updated v122 2024-07-18 10:33:01 +03:00
Ivan Nikolaev-Axenov
be13c63097 .gitlab-ci.yml updated v121 2024-07-17 17:10:07 +03:00
Ivan Nikolaev-Axenov
877b62118c .gitlab-ci.yml updated v120 2024-07-17 16:46:44 +03:00
Ivan Nikolaev-Axenov
1ccbfccdef .gitlab-ci.yml updated v119 2024-07-17 16:22:38 +03:00
Ivan Nikolaev-Axenov
24058a943c .gitlab-ci.yml updated v118 2024-07-17 16:13:59 +03:00
Ivan Nikolaev-Axenov
c27e377dbf .gitlab-ci.yml updated v117 2024-07-17 15:45:42 +03:00
etreschenkov
7652e28ae9 IPO0 -> IPOT 2024-07-12 12:09:01 +03:00
etreschenkov
88781ff458 up pom version 2024-07-11 17:03:41 +03:00
etreschenkov
7349cc67ab дополнительно к 94715bdd добавил IPO0 и UNIT сессии 2024-07-11 17:03:41 +03:00
AKurakin
38db91a748 imdg поправил лог 2024-07-10 18:23:18 +03:00
AKurakin
603a8e66ca backend-api исправил юнит-тест(ы) (bug at 4b1a834883) 2024-07-10 18:23:18 +03:00
etreschenkov
cd3488c5ec посылать ответ sdf53 - ок все же нужно, даже если счет не был создан 2024-07-10 18:22:19 +03:00
etreschenkov
d6865f8395 по sdf01 и sdf52 в случае если currencyId из счета == 810, то это всегда RUB 2024-07-10 18:02:24 +03:00
AKurakin
3bf8c690a5 backend-api meta OUTV правки 2024-07-10 16:48:42 +03:00
AKurakin
18b94c71fe account-service BankAccount SameAccountValidationRule поле account не обязательное. 2024-07-10 16:01:06 +03:00
AKurakin
1b8e773f26 backend-api обновил мету 3.12.8.99 (утро вечера мудрее) 2024-07-10 15:37:23 +03:00
AKurakin
01685a2f85 backend-api обновил мету 3.12.8.98 (вечерние правки) 2024-07-09 19:44:17 +03:00
AKurakin
4688f55fce account-service backend-api обновил мету 3.12.8.98 (поправил) 2024-07-09 19:33:54 +03:00
AKurakin
89e81604a5 account-service backend-api обновил мету 3.12.8.98 (revert частично) 2024-07-09 19:25:50 +03:00
AKurakin
0c62c91888 account-service backend-api обновил мету 3.12.8.98 2024-07-09 19:05:50 +03:00
AKurakin
2760ddc7d3 dbf-exporter fix broken symbol: replace unsupported character on whitespace (см. также параметр export-dbf-service.common.encoding) 2024-07-09 18:24:53 +03:00
etreschenkov
eceb681861 up pom 2024-07-09 15:48:50 +03:00
etreschenkov
aff20d2c42 add build stage 2024-07-09 14:17:44 +03:00
etreschenkov
281fa4f5d6 Merge branch 'refs/heads/dev' into dev_gitlab_cicd 2024-07-09 14:10:41 +03:00
etreschenkov
94715bdd34 don't send asset to gateway if active session exists and comment contains 'ПО ИТОГУ КЛИРИНГА' 2024-07-09 13:13:32 +03:00
AKurakin
1bd41b8f50 backend-api meta: launcher OUTV добавлено поле correspondentAccountId (переделка - только на фронтэнде поле нужно) 2024-07-08 19:16:27 +03:00
Ivan Nikolaev-Axenov
c72405cbf1 .gitlab-ci.yml updated v116 2024-07-08 18:09:38 +03:00
AKurakin
5f022a5d9d backend-api meta: launcher OUTV добавлено поле correspondentAccountId (fix) 2024-07-08 18:02:47 +03:00
AKurakin
a0e4ea7b49 backend-api meta: launcher OUTV добавлено поле correspondentAccountId 2024-07-08 17:53:41 +03:00
AKurakin
e8d1dc482d up pom version SPCEX-3.12.7 2024-07-08 14:44:19 +03:00
AKurakin
a94cc8ff17 clearing-service правка поиска searchAssetByOMT в InspectionObligationsDepositReturn 2024-07-08 12:58:45 +03:00
Ivan Nikolaev-Axenov
b1779dc8c4 .gitlab-ci.yml updated v115 2024-07-05 15:44:38 +03:00
Ivan Nikolaev-Axenov
9c828e75a1 .gitlab-ci.yml updated v114 2024-07-05 12:42:29 +03:00
AKurakin
de3eb66799 gateway-api добавил логи в GatewayController 2024-07-05 11:56:39 +03:00
Ivan Nikolaev-Axenov
61d1be2fe1 .gitlab-ci.yml updated v114 2024-07-05 11:47:20 +03:00
Ivan Nikolaev-Axenov
19081b98a6 .gitlab-ci.yml updated v113 2024-07-04 18:31:40 +03:00
ialbert
26d6c68734 UNIT session DM*V 2024-07-04 18:23:04 +03:00
Ivan Nikolaev-Axenov
e010e1d200 .gitlab-ci.yml updated v112 2024-07-04 17:35:21 +03:00
ialbert
51517790ce Merge remote-tracking branch 'origin/dev' into dev 2024-07-04 17:07:39 +03:00
ialbert
c1ec29a8be FOND section: TCR#depoAccountId NULL fix 2024-07-04 17:05:03 +03:00
Ivan Nikolaev-Axenov
54fd6ebcbc .gitlab-ci.yml updated v111 2024-07-04 16:49:49 +03:00
Ivan Nikolaev-Axenov
96bb60bb60 .gitignore files added 2024-07-04 16:25:56 +03:00
etreschenkov
c51f473c91 up pom version 2024-07-04 16:10:15 +03:00
AKurakin
51db366432 registry-service RegistryLoader SQL bug-fix 2024-07-04 14:52:27 +03:00
Ivan Nikolaev-Axenov
1981e48274 .gitlab-ci.yml updated v110 2024-07-04 13:27:43 +03:00
Ivan Nikolaev-Axenov
92f6d7ab02 .gitlab-ci.yml updated v109 2024-07-04 11:48:06 +03:00
etreschenkov
1df96b7ef6 up pom version 2024-07-04 10:07:34 +03:00
ialbert
1eb7a9d485 Revert "UNIT session sdf14 - sdf12 condition"
This reverts commit 24fe8346d3.
2024-07-03 15:13:32 +03:00
ialbert
1b72d20ee5 1. порядок сортировки по exchangeExecutionTime/exchangeExecutionId в шаге создания liabilities и claims
2. TCR/TKR/ТКР
2024-07-03 13:06:36 +03:00
ialbert
24fe8346d3 UNIT session sdf14 - sdf12 condition 2024-07-03 12:52:52 +03:00
ialbert
7c7848074a swt-exporter DF-14 UNIT session fix 2024-07-02 20:40:04 +03:00
ialbert
2e533855e2 UNIT session sdf14 2024-07-02 20:10:26 +03:00
ialbert
54ac847b45 в составном шаге RequirementsAndObligationCreationCompound сортируется сначала по времени и потом по exchangeExecutionId для избежания перемешивания сделок попавших в одну миллисекунду 2024-07-02 19:39:18 +03:00
ialbert
a212e5a7b5 InspectionObligations 5 шаг сортировка не по groupId а по min(registry.id) внутри группы 2024-07-02 19:37:42 +03:00
ialbert
544c930148 UNIT session execution sorting by ExchangeExecutionTime instead of ExchangeExecutionId 2024-07-02 18:02:38 +03:00
Ivan Nikolaev-Axenov
f092833de8 .gitlab-ci.yml updated v108 2024-07-02 17:42:37 +03:00
Ivan Nikolaev-Axenov
b011e2c716 .gitlab-ci.yml updated v107 2024-07-02 17:28:24 +03:00
Ivan Nikolaev-Axenov
871e6858f0 .gitlab-ci.yml updated v106 2024-07-02 17:09:55 +03:00
Ivan Nikolaev-Axenov
8382387ffa .gitlab-ci.yml updated v105 2024-07-02 16:50:45 +03:00
Ivan Nikolaev-Axenov
84f672bb62 .gitlab-ci.yml updated v104 2024-07-02 16:46:50 +03:00
Ivan Nikolaev-Axenov
1ec79ead27 .gitlab-ci.yml updated v103 2024-07-02 14:49:24 +03:00
Ivan Nikolaev-Axenov
3bed56dbe8 .gitlab-ci.yml updated v102 2024-07-02 14:20:06 +03:00
Ivan Nikolaev-Axenov
a373827cde .gitlab-ci.yml updated v101 2024-07-02 14:10:35 +03:00
Ivan Nikolaev-Axenov
47ffa77428 .gitlab-ci.yml updated v100 2024-07-02 13:51:55 +03:00
Ivan Nikolaev-Axenov
e43d90a314 .gitlab-ci.yml updated v99 2024-07-02 13:38:06 +03:00
Ivan Nikolaev-Axenov
501238f91d .gitlab-ci.yml updated v98 2024-07-02 13:18:15 +03:00
Ivan Nikolaev-Axenov
a0c7ee3a17 .gitlab-ci.yml updated v97 2024-07-02 13:07:23 +03:00
Ivan Nikolaev-Axenov
41fb033488 .gitlab-ci.yml updated v96 2024-07-02 12:54:08 +03:00
Ivan Nikolaev-Axenov
ae6720798b .gitlab-ci.yml updated v95 2024-07-02 12:35:17 +03:00
Ivan Nikolaev-Axenov
06f763c11f .gitlab-ci.yml updated v94 2024-07-02 12:03:49 +03:00
Ivan Nikolaev-Axenov
2b13c08a9b .gitlab-ci.yml updated v93 2024-07-02 11:55:10 +03:00
Ivan Nikolaev-Axenov
3bb6540fa6 .gitlab-ci.yml updated v92 2024-07-02 11:47:03 +03:00
Ivan Nikolaev-Axenov
a5ee992c9b .gitlab-ci.yml updated v91 2024-07-02 11:37:55 +03:00
etreschenkov
7ff46aae19 http://jira.mfd.msk:8088/browse/CLS-701 2024-07-02 11:26:14 +03:00
Ivan Nikolaev-Axenov
1058719aac .gitlab-ci.yml updated v90 2024-07-02 11:21:35 +03:00
Ivan Nikolaev-Axenov
a6c1b560c4 .gitlab-ci.yml updated v89 2024-07-02 11:07:56 +03:00
Ivan Nikolaev-Axenov
ce3d4d89fa .gitlab-ci.yml updated v88 2024-07-02 10:51:17 +03:00
Ivan Nikolaev-Axenov
73bbe538cd .gitlab-ci.yml updated v87 2024-07-02 10:32:50 +03:00
Ivan Nikolaev-Axenov
0bf97ddb22 .gitlab-ci.yml updated v86 2024-07-02 10:20:52 +03:00
Ivan Nikolaev-Axenov
b566897022 .gitlab-ci.yml updated v85 2024-07-02 10:07:38 +03:00
Ivan Nikolaev-Axenov
dd64342061 .gitlab-ci.yml updated v84 2024-07-02 09:26:59 +03:00
Ivan Nikolaev-Axenov
8b411d78a0 .gitlab-ci.yml updated v83 2024-07-01 18:57:30 +03:00
Ivan Nikolaev-Axenov
fea441c0a7 .gitlab-ci.yml updated v82 2024-07-01 17:57:12 +03:00
Ivan Nikolaev-Axenov
5b038ea281 .gitlab-ci.yml updated v81 2024-07-01 17:44:20 +03:00
Ivan Nikolaev-Axenov
860ed422bf .gitlab-ci.yml updated v80 2024-07-01 17:33:04 +03:00
Ivan Nikolaev-Axenov
9df219c164 .gitlab-ci.yml updated v79 2024-07-01 17:30:14 +03:00
Ivan Nikolaev-Axenov
d2df5bcc1c .gitlab-ci.yml updated v78 2024-07-01 17:19:06 +03:00
Ivan Nikolaev-Axenov
05b9daa65c .gitlab-ci.yml updated v77 2024-07-01 17:11:38 +03:00
Ivan Nikolaev-Axenov
64d37bf247 .gitlab-ci.yml updated v76 2024-07-01 16:54:12 +03:00
Ivan Nikolaev-Axenov
87792aea38 .gitlab-ci.yml updated v75 2024-07-01 16:37:27 +03:00
Ivan Nikolaev-Axenov
9e6ef25ab9 .gitlab-ci.yml updated v74 2024-07-01 16:23:18 +03:00
Ivan Nikolaev-Axenov
a5258c0374 .gitlab-ci.yml updated v73 2024-07-01 16:06:15 +03:00
Ivan Nikolaev-Axenov
4a90d75cb3 .gitlab-ci.yml updated v72 2024-07-01 15:50:15 +03:00
Ivan Nikolaev-Axenov
f131f48dfe .gitlab-ci.yml updated v71 2024-07-01 15:20:53 +03:00
Ivan Nikolaev-Axenov
6ea0899433 .gitlab-ci.yml updated v70 2024-07-01 15:14:33 +03:00
Ivan Nikolaev-Axenov
9955162e94 .gitlab-ci.yml updated v69 2024-07-01 15:11:20 +03:00
AKurakin
cb971d6b2b meta.xml поправил опечатки в кририллице/латинице (см. предыдущий коммит). 2024-07-01 14:53:19 +03:00
AKurakin
4b1a834883 dictionaries.xml (data.sql) поправил опечатки в LICC, добавил юниттест 2024-07-01 14:36:31 +03:00
AKurakin
1ec5303b12 data 3.12.2.93 поправили и убрали поля, переименование файла data.xml -> dictionaries.xml (dictionaries.sql) 2024-07-01 13:04:34 +03:00
etreschenkov
afd35f39e7 up pom version 2024-07-01 12:36:23 +03:00
akulikov
130a19210b report-service fix tests 2024-07-01 12:27:20 +03:00
akulikov
ecb6382607 report-service: fix predicate 2024-07-01 12:24:20 +03:00
ialbert
1145fd17f7 Merge remote-tracking branch 'origin/dev' into dev 2024-06-27 18:21:37 +03:00
ialbert
2e73d1ebd4 UnitSession ожидание SDF_08 bugfix 2024-06-27 18:21:26 +03:00
etreschenkov
ced14c4e10 up pom version 2024-06-27 18:09:27 +03:00
ialbert
0e120a9866 Merge remote-tracking branch 'origin/dev' into dev 2024-06-27 17:30:54 +03:00
ialbert
7ca4b1ded0 UNIT сессия багфикс ожидания 13го и 21го 2024-06-27 17:28:45 +03:00
Ivan Nikolaev-Axenov
7418311ab5 Null pointer exception in object tags fixed 2024-06-27 16:44:46 +03:00
akulikov
c19d881e1d fix expected values for KS_REP_CASH_NETTO extended test 2024-06-27 15:32:09 +03:00
akulikov
cc95a67759 report-service new test 2024-06-26 19:13:33 +03:00
AKurakin
eb8ce07f27 meta 3.12.1.95 поле registry post securitySymbol 2024-06-26 17:41:47 +03:00
etreschenkov
bfdb3b8a6d update data and meta 2024-06-26 17:19:07 +03:00
etreschenkov
64278d10d3 fix building error: account.account was incorect for id < 100 2024-06-26 17:07:29 +03:00
etreschenkov
73f2ed8650 fix building error: account.account was incorect for id < 100 2024-06-26 15:58:17 +03:00
etreschenkov
f345145135 update pom 2024-06-26 15:43:03 +03:00
akulikov
cf8f040ebd report-service fix tests 2024-06-26 10:25:14 +03:00
akulikov
b240af4fd1 report-service fixes 2024-06-26 10:00:10 +03:00
akulikov
ca3e353e86 report-service revert 2024-06-26 10:00:10 +03:00
etreschenkov
70aa7b9748 http://jira.mfd.msk:8088/browse/CLS-690 2024-06-25 14:26:45 +03:00
etreschenkov
e52b42973d http://jira.mfd.msk:8088/browse/CLS-690 2024-06-25 13:14:56 +03:00
etreschenkov
3bd46a0bca http://jira.mfd.msk:8088/browse/CLS-684 2024-06-25 12:44:15 +03:00
etreschenkov
9bb50750c0 send eks account 2024-06-24 16:46:15 +03:00
etreschenkov
06cd123666 send eks account 2024-06-24 16:08:35 +03:00
AKurakin
7c655c2c18 gateway-api добавил запись GATEWAY_RESULT в GatewayService.requestOnTkr 2024-06-24 15:32:05 +03:00
AKurakin
2f0c54ca3c Revert "gateway-api добавил запись GATEWAY_RESULT в GatewayService.requestOnReport"
This reverts commit 7886d13a24.
2024-06-24 15:27:04 +03:00
AKurakin
7886d13a24 gateway-api добавил запись GATEWAY_RESULT в GatewayService.requestOnReport 2024-06-24 15:21:21 +03:00
AKurakin
55080005c8 backend-api добавлен GET для S_DF51 2024-06-24 12:52:09 +03:00
akulikov
d98b2ce176 revert last fixes 2024-06-22 15:14:39 +03:00
akulikov
1d0f669c41 report-service fixes 2024-06-21 18:47:39 +03:00
akulikov
41cf940f42 report-service fixes 2024-06-21 14:17:13 +03:00
AKurakin
e39b71f9cd pom SPCEX-3.12.1, z-distr добавил папку services 2024-06-21 10:45:00 +03:00
AKurakin
2ff71f7cec dbf-importer dbf-exporter поправил / в настройках sftp 2024-06-20 19:33:07 +03:00
ialbert
b901f4dcb0 Merge remote-tracking branch 'origin/dev' into dev 2024-06-20 19:22:49 +03:00
ialbert
ae87df9e86 UNIT session fix: adjust value/5 step returns/inclusion conditions 2024-06-20 19:22:38 +03:00
AKurakin
f6f7c9c446 meta 3.12.0.94, data 3.12.0.92 2024-06-20 13:19:51 +03:00
Ivan Nikolaev-Axenov
300e4c96c6 file name, generation time and id added to object tags 2024-06-20 13:16:27 +03:00
etreschenkov
d2f7ca572d http://jira.mfd.msk:8088/browse/CLS-690 2024-06-20 11:49:32 +03:00
Ivan Nikolaev-Axenov
00c87829a3 added data format conversion, work with sftp fixed 2024-06-20 11:37:09 +03:00
Ivan Nikolaev-Axenov
f026bc95d2 data format changed to existing in database, sftp settings fixed 2024-06-19 16:49:01 +03:00
etreschenkov
edce8ee854 disable EndStageNotification for UnitedSession 2024-06-18 21:29:28 +03:00
etreschenkov
f1982ef5da http://jira.mfd.msk:8088/browse/CLS-690 2024-06-18 19:34:56 +03:00
ialbert
1b0672bba3 Merge remote-tracking branch 'origin/dev' into dev 2024-06-18 19:13:40 +03:00
ialbert
10f1e2a7b9 UNIT финальный шаг coverageStatus 2024-06-18 19:13:28 +03:00
etreschenkov
d1bb78fa1e http://jira.mfd.msk:8088/browse/CLS-690 2024-06-18 18:55:30 +03:00
etreschenkov
cd783ebbbe http://jira.mfd.msk:8088/browse/CLS-685 2024-06-18 16:42:36 +03:00
ialbert
ccef5a7590 Merge remote-tracking branch 'origin/dev' into dev 2024-06-18 15:51:38 +03:00
ialbert
b415d22caf LocaleUtil treat empty currency as RUB 2024-06-18 15:51:27 +03:00
Ivan Nikolaev-Axenov
5b1d672712 Write to XML moved to a separate class from ExportFromHazelcast, xml-exporter ExportFromHazelcast and WriteXMLFile steps tests added 2024-06-18 14:24:59 +03:00
Ivan Nikolaev-Axenov
2588000456 xml-importer ReadXMLFile and ImportToDB steps tests added 2024-06-18 10:34:55 +03:00
AKurakin
03f9c065c7 registry-service http://jira.mfd.msk:8088/browse/CLS-680 обновил application.properties 2024-06-18 10:29:51 +03:00
AKurakin
f020153363 meta 3.12.0.93 новая версия 2024-06-17 14:53:08 +03:00
ialbert
39f9544cfb sdf54.urgent 2024-06-17 14:33:38 +03:00
ialbert
8833818a01 SDF54 sbanknam1/sclientn1 2024-06-17 14:25:06 +03:00
ialbert
a6c3f2f2b3 Sdf54 Doc_Num -> doc_num 2024-06-17 14:12:30 +03:00
AKurakin
0cddc6fb7a account-service backend-api http://jira.mfd.msk:8088/browse/CLS-667 meta bankAccount actions intermediarySwiftCode 2024-06-14 18:58:41 +03:00
Ivan Nikolaev-Axenov
0106d58569
xml-importer xml file processing minor changes 2024-06-14 18:12:07 +03:00
ialbert
fafa3b455a tcr strip from sdf57 specif TKR/TCR
SDF03 for non RUB currencies in session
2024-06-14 17:33:53 +03:00
etreschenkov
702cfacad1 refactoring 2024-06-14 16:02:29 +03:00
ialbert
1037b27165 1. paymentPurpose += " по итогу клиринга"
2. ТКР/TKR sdf57/sdf06 search
3. локализация рус/англ purpose для PaymentInstructionOutboundService
4. ошибка в допуске к CURR сессии
5. swt-exporter bugfix
2024-06-13 18:00:42 +03:00
ialbert
ed010ad64e unit session section -> MULT bugfix 2024-06-11 20:37:48 +03:00
ialbert
960a19c4cc unit session section -> MULT 2024-06-11 18:52:00 +03:00
ialbert
add844bd76 Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Section.java
2024-06-11 18:48:54 +03:00
ialbert
6feeb77b1f split sdf08/21, unit session section -> MULT 2024-06-11 18:48:24 +03:00
AKurakin
1f2326698c data.xml http://jira.mfd.msk:8088/browse/CLS-696 2024-06-11 17:33:38 +03:00
AKurakin
4e2e3d9547 up pom version SPCEX-3.12.0.0 2024-06-11 13:34:46 +03:00
etreschenkov
c51d22a615 fix validation 2024-06-11 11:42:14 +03:00
ialbert
95ad4837e1 session type & section checks: FormingPaymentInstructionAssets/InclusionObligations/InspectionObligations
UNIT session: RequirementsAndObligationCreationCompound sorting order
2024-06-10 18:06:48 +03:00
Ivan Nikolaev-Axenov
10e9ef9079 Minor changes 2024-06-10 12:57:25 +03:00
ialbert
ea73e16a81 Merge remote-tracking branch 'origin/dev' into dev 2024-06-10 11:39:56 +03:00
Ivan Nikolaev-Axenov
c0c6a9813a SFTPConfig fixed 2024-06-10 10:25:21 +03:00
etreschenkov
568f29a62a http://jira.mfd.msk:8088/browse/CLS-684 // http://jira.mfd.msk:8088/browse/CLS-685 2024-06-07 18:40:29 +03:00
ialbert
a52f135ee2 SDF56/51, UNIT session, registry#section 2024-06-07 18:09:05 +03:00
ialbert
bebb114bea Merge remote-tracking branch 'origin/dev' into dev 2024-06-07 17:47:51 +03:00
AKurakin
e2bcf7d117 http://jira.mfd.msk:8088/browse/CLS-667 DDL дополнил мету из версии 3.11 2024-06-07 17:30:01 +03:00
etreschenkov
88db266d26 fix circular dependency 2024-06-07 17:13:05 +03:00
etreschenkov
ed3a6d31f0 new version services [account-service] 2024-06-07 17:12:25 +03:00
ialbert
2d9a49e990 imdg execution fond/depo/currency microseconds fix 2024-06-07 17:03:36 +03:00
etreschenkov
6b2290e0cf new version services [account-service] 2024-06-07 16:24:50 +03:00
AKurakin
5a19686e82 http://jira.mfd.msk:8088/browse/CLS-667 DDL доделал скрипт 2024-06-07 15:10:21 +03:00
AKurakin
69511724c4 http://jira.mfd.msk:8088/browse/CLS-667 DDL (продолжеине CLS-613) 2024-06-07 14:59:58 +03:00
AKurakin
6f723f0cd7 Merge branch 'CLS-613_06052024' into dev
# Conflicts:
#	clearing-parent/backend-api/src/main/resources/meta/meta.json
#	clearing-parent/backend-api/src/main/resources/meta/meta.xml
#	clearing-parent/backend-api/src/test/resources/meta.json
2024-06-07 14:13:28 +03:00
etreschenkov
0ef3aca8b0 http://jira.mfd.msk:8088/browse/CLS-684 // http://jira.mfd.msk:8088/browse/CLS-685 2024-06-07 10:52:45 +03:00
AKurakin
2289d1ed6c registry-service http://jira.mfd.msk:8088/browse/CLS-680 добавил ExecutionCurrency, правки поле 2024-06-06 18:28:43 +03:00
AKurakin
b6f371dfc9 registry-service поправил лог 2024-06-06 14:28:58 +03:00
AKurakin
26ce847f37 registry-service поправил ExecutionDepositLoader, ExecutionFondLoader 2024-06-06 13:58:23 +03:00
etreschenkov
cc87b6ec1e http://jira.mfd.msk:8088/browse/CLS-685 2024-06-06 11:32:19 +03:00
Ivan Nikolaev-Axenov
5edbf4cf79 .gitlab-ci.yml updated v68 2024-06-06 10:17:59 +03:00
etreschenkov
7ce2445fc9 http://jira.mfd.msk:8088/browse/CLS-690 2024-06-05 18:01:13 +03:00
etreschenkov
c9c5fc9297 http://jira.mfd.msk:8088/browse/CLS-684 // http://jira.mfd.msk:8088/browse/CLS-685 2024-06-05 15:41:00 +03:00
Ivan Nikolaev-Axenov
28fd132795 .gitlab-ci.yml updated v67 2024-06-05 13:21:44 +03:00
Ivan Nikolaev-Axenov
f367b48004 .gitlab-ci.yml updated v66 2024-06-05 13:01:25 +03:00
Ivan Nikolaev-Axenov
0842a4bddb .gitlab-ci.yml updated v65 2024-06-05 12:32:13 +03:00
Ivan Nikolaev-Axenov
6758836c70 .gitlab-ci.yml updated v64 2024-06-05 12:22:18 +03:00
Ivan Nikolaev-Axenov
4814c0d362 .gitlab-ci.yml updated v63 2024-06-05 12:06:44 +03:00
akulikov
743f721df5 fixes 2024-06-04 19:35:43 +03:00
AKurakin
3c0cc05d28 backend-api "/registries" добавил фильтрацию, а то очень много лишних записей (из 77000 нужных около 3000). 2024-06-04 18:41:56 +03:00
AKurakin
5f2dcba539 registry-service http://jira.mfd.msk:8088/browse/CLS-680 сделал неповторяющиеся записи по дням для DepoBalanceRegisterReportBuilder, MoneyBalanceRegisterReportBuilder 2024-06-04 15:22:23 +03:00
AKurakin
4ff7dbf586 registry-service http://jira.mfd.msk:8088/browse/CLS-680 удаление и перенос из register_utility (в основном код писал akulikov) 2024-06-04 14:35:22 +03:00
Ivan Nikolaev-Axenov
eed71888c9 .gitlab-ci.yml updated v62 2024-06-04 10:33:28 +03:00
Ivan Nikolaev-Axenov
9727e02c16 .gitlab-ci.yml updated v61 2024-06-04 10:10:06 +03:00
Ivan Nikolaev-Axenov
08e0caabde .gitlab-ci.yml updated v60 2024-06-03 18:41:21 +03:00
Ivan Nikolaev-Axenov
d430d14cf1 .gitlab-ci.yml updated v59 2024-06-03 18:26:11 +03:00
Ivan Nikolaev-Axenov
f74ff70e51 .gitlab-ci.yml updated v58 2024-06-03 18:10:20 +03:00
Ivan Nikolaev-Axenov
0083712e80 .gitlab-ci.yml updated v57 2024-06-03 17:54:41 +03:00
Ivan Nikolaev-Axenov
7650e4b7a1 .gitlab-ci.yml updated v56 2024-06-03 17:44:25 +03:00
AKurakin
eed10a1eec account-service разрешил изменение TCR.DepoAccountId с null 2024-06-03 17:39:20 +03:00
Ivan Nikolaev-Axenov
87d6029649 .gitlab-ci.yml updated v55 2024-06-03 15:55:18 +03:00
AKurakin
585f7cf6e7 backend-api meta правки команды Формирование реестров 2024-06-03 15:47:58 +03:00
Ivan Nikolaev-Axenov
cdb8e280c3 .gitlab-ci.yml updated v54 2024-06-03 15:44:38 +03:00
Ivan Nikolaev-Axenov
9ce9fcc998 .gitlab-ci.yml updated v53 2024-06-03 15:26:13 +03:00
AKurakin
34914fa23e backend-api meta правки текста 2024-06-03 15:17:36 +03:00
Ivan Nikolaev-Axenov
e3c685f4b5 .gitlab-ci.yml updated v52 2024-06-03 14:02:33 +03:00
AKurakin
24a911f6fe backend-api meta правки текста 2024-06-03 13:58:22 +03:00
akulikov
b30ffe62df fix tests 2024-06-03 13:25:12 +03:00
akulikov
35d9fe2d3e KSRepCashNettoReportBuilder fix currency_netto 2024-06-03 13:03:45 +03:00
Ivan Nikolaev-Axenov
6f1ee644bf .gitlab-ci.yml updated v51 2024-06-03 12:30:56 +03:00
Ivan Nikolaev-Axenov
6d84ba760e .gitlab-ci.yml updated v50 2024-06-03 12:12:15 +03:00
Ivan Nikolaev-Axenov
1959e2ece9 .gitlab-ci.yml updated v49 2024-06-03 11:59:31 +03:00
Ivan Nikolaev-Axenov
403e262f83 .gitlab-ci.yml updated v48 2024-06-03 11:35:56 +03:00
etreschenkov
55dd0cc8b6 http://jira.mfd.msk:8088/browse/CLS-684 // http://jira.mfd.msk:8088/browse/CLS-685 2024-06-03 11:09:40 +03:00
Ivan Nikolaev-Axenov
deaf9c31b7 .gitlab-ci.yml updated v47 2024-05-31 18:11:18 +03:00
Ivan Nikolaev-Axenov
b2f26b14b3 .gitlab-ci.yml updated v46 2024-05-31 17:59:07 +03:00
Ivan Nikolaev-Axenov
1b441d1b54 .gitlab-ci.yml updated v45 2024-05-31 17:45:19 +03:00
Ivan Nikolaev-Axenov
caf06224cb .gitlab-ci.yml updated v44 2024-05-31 17:05:03 +03:00
Ivan Nikolaev-Axenov
9926a0feff .gitlab-ci.yml updated v43 2024-05-31 16:45:21 +03:00
Ivan Nikolaev-Axenov
e6dcbc2ede .gitlab-ci.yml updated v42 2024-05-31 16:31:52 +03:00
Ivan Nikolaev-Axenov
a8998d0868 .gitlab-ci.yml updated v41 2024-05-31 16:14:41 +03:00
Ivan Nikolaev-Axenov
42d9bfa94c .gitlab-ci.yml updated v40 2024-05-31 15:58:33 +03:00
Ivan Nikolaev-Axenov
8c698095a2 .gitlab-ci.yml updated v40 2024-05-31 15:47:08 +03:00
etreschenkov
e327c3dbb1 http://jira.mfd.msk:8088/browse/CLS-631#comment-60200 2024-05-31 15:40:38 +03:00
Ivan Nikolaev-Axenov
9c1e3fee4f .gitlab-ci.yml updated v39 2024-05-31 15:03:47 +03:00
Ivan Nikolaev-Axenov
2589c3614e .gitlab-ci.yml updated v38 2024-05-31 14:30:57 +03:00
etreschenkov
5fb1b0526d fix bug when spring app don't up by circular reference error 2024-05-31 14:15:32 +03:00
etreschenkov
dcc0a3c7ce http://jira.mfd.msk:8088/browse/CLS-690 2024-05-31 13:45:06 +03:00
Ivan Nikolaev-Axenov
62289c351b .gitlab-ci.yml updated v37 2024-05-31 12:50:22 +03:00
Ivan Nikolaev-Axenov
9bf1d6cdd3 .gitlab-ci.yml updated v36 2024-05-31 12:38:17 +03:00
etreschenkov
224179a9e1 add new fields 2024-05-31 11:45:02 +03:00
Ivan Nikolaev-Axenov
bba57c2555 .gitlab-ci.yml updated v35 2024-05-31 10:34:03 +03:00
Ivan Nikolaev-Axenov
b82c31e26e .gitlab-ci.yml updated v34 2024-05-30 18:57:03 +03:00
Ivan Nikolaev-Axenov
63f05fdcd1 .gitlab-ci.yml updated v33 2024-05-30 18:48:59 +03:00
AKurakin
69e815f984 trade-importer Оптимизация для большого количества S_TRADES 2024-05-30 18:37:31 +03:00
Ivan Nikolaev-Axenov
0f38c752cf .gitlab-ci.yml updated v32 2024-05-30 18:36:31 +03:00
Ivan Nikolaev-Axenov
27a9b5ea02 .gitlab-ci.yml updated v31 2024-05-30 17:14:12 +03:00
Ivan Nikolaev-Axenov
377977bb03 .gitlab-ci.yml updated v30 2024-05-30 17:10:50 +03:00
Ivan Nikolaev-Axenov
244aff1de9 .gitlab-ci.yml updated v29 2024-05-30 17:06:58 +03:00
Ivan Nikolaev-Axenov
0232edffc2 .gitlab-ci.yml updated v28 2024-05-30 15:55:11 +03:00
Ivan Nikolaev-Axenov
0984884fc0 .gitlab-ci.yml updated v27 2024-05-30 15:37:40 +03:00
Ivan Nikolaev-Axenov
b530c93e2f .gitlab-ci.yml updated v26 2024-05-30 15:30:14 +03:00
Ivan Nikolaev-Axenov
75b82da809 .gitlab-ci.yml updated v25 2024-05-30 15:21:13 +03:00
Ivan Nikolaev-Axenov
4642056f98 .gitlab-ci.yml updated v24 2024-05-30 15:15:08 +03:00
Ivan Nikolaev-Axenov
ba4374280d .gitlab-ci.yml updated v23 2024-05-30 15:05:57 +03:00
Ivan Nikolaev-Axenov
c288636bed .gitlab-ci.yml updated v22 2024-05-30 13:54:51 +03:00
Ivan Nikolaev-Axenov
a7d03ce60f .gitlab-ci.yml updated v21 2024-05-30 13:46:27 +03:00
Ivan Nikolaev-Axenov
99f5661ddf .gitlab-ci.yml updated v20 2024-05-30 13:42:00 +03:00
Ivan Nikolaev-Axenov
51a39663ef .gitlab-ci.yml updated v19 2024-05-30 13:40:57 +03:00
Ivan Nikolaev-Axenov
7ad1f56714 .gitlab-ci.yml updated v18 2024-05-30 13:32:27 +03:00
Ivan Nikolaev-Axenov
ad8c9e72c7 .gitlab-ci.yml updated v17 2024-05-30 13:25:48 +03:00
Ivan Nikolaev-Axenov
ae230bf4dd .gitlab-ci.yml updated v16 2024-05-30 13:19:12 +03:00
Ivan Nikolaev-Axenov
3574f830a8 .gitlab-ci.yml updated v15 2024-05-30 12:47:59 +03:00
Ivan Nikolaev-Axenov
08e3c3acf4 .gitlab-ci.yml updated v14 2024-05-30 12:42:56 +03:00
Ivan Nikolaev-Axenov
e1b88188f8 .gitlab-ci.yml updated v13 2024-05-30 12:41:28 +03:00
Ivan Nikolaev-Axenov
802e087f62 .gitlab-ci.yml updated v12 2024-05-30 12:36:13 +03:00
Ivan Nikolaev-Axenov
44492fd690 .gitlab-ci.yml updated v11 2024-05-30 12:33:03 +03:00
Ivan Nikolaev-Axenov
8e83d882f4 .gitlab-ci.yml updated v10 2024-05-30 12:30:23 +03:00
Ivan Nikolaev-Axenov
ce1c4469c9 .gitlab-ci.yml updated v9 2024-05-30 12:24:30 +03:00
Ivan Nikolaev-Axenov
b21fd76137 .gitlab-ci.yml updated v8 2024-05-30 12:23:07 +03:00
Ivan Nikolaev-Axenov
e6c3137d25 .gitlab-ci.yml updated v7 2024-05-30 12:16:03 +03:00
Ivan Nikolaev-Axenov
a57ba0ae6b .gitlab-ci.yml updated v6 2024-05-30 12:07:36 +03:00
Ivan Nikolaev-Axenov
9dac139e25 .gitlab-ci.yml updated v5 2024-05-30 11:59:57 +03:00
Ivan Nikolaev-Axenov
d8f0527bbd .gitlab-ci.yml updated v4 2024-05-30 11:51:08 +03:00
Ivan Nikolaev-Axenov
dc24683a90 .gitlab-ci.yml updated v3 2024-05-30 11:45:17 +03:00
Ivan Nikolaev-Axenov
852fc61e2f .gitlab-ci.yml updated v2 2024-05-30 11:37:31 +03:00
Ivan Nikolaev-Axenov
0c6736b9c9 .gitlab-ci.yml updated 2024-05-30 11:16:32 +03:00
Ivan Nikolaev-Axenov
eb652a105b docker proxy added 2024-05-30 10:56:19 +03:00
Ivan Nikolaev-Axenov
513f51ba15 clr_test added 2024-05-30 10:47:59 +03:00
Ivan Nikolaev-Axenov
dd7ea61446 GitLab CI/CI yml file added 2024-05-30 10:45:45 +03:00
AKurakin
f0cd944c64 account-service http://jira.mfd.msk:8088/browse/CLS-678 2024-05-29 19:53:14 +03:00
AKurakin
655e8a6571 account-service http://jira.mfd.msk:8088/browse/CLS-679 2024-05-29 19:35:07 +03:00
etreschenkov
2406152394 fix after commit 5a158cec (CURRENCY.ID for RUB always should be hardcoded) 2024-05-29 19:25:24 +03:00
etreschenkov
8449e13e1c http://jira.mfd.msk:8088/browse/CLS-686 2024-05-29 18:50:56 +03:00
etreschenkov
6596046513 http://jira.mfd.msk:8088/browse/CLS-684 // http://jira.mfd.msk:8088/browse/CLS-685 2024-05-29 12:46:58 +03:00
ialbert
16c0693b88 sdf54 swift_int 2024-05-29 12:35:11 +03:00
etreschenkov
e0eebea890 http://jira.mfd.msk:8088/browse/CLS-684 // http://jira.mfd.msk:8088/browse/CLS-685 2024-05-28 11:56:45 +03:00
Ivan Nikolaev-Axenov
e2d043e322 xml-exporter pipelines removed, localdatetime format fixed 2024-05-28 11:31:42 +03:00
etreschenkov
6a4a7ec4e7 mock sftp config for active.profile=test 2024-05-28 10:31:39 +03:00
etreschenkov
b2015a9aa4 http://jira.mfd.msk:8088/browse/CLS-684 // http://jira.mfd.msk:8088/browse/CLS-685 2024-05-28 10:03:21 +03:00
Ivan Nikolaev-Axenov
7a157e9ae2 xml-importer minor code changes 2024-05-27 19:01:08 +03:00
Ivan Nikolaev-Axenov
491577b6f8 SFTP connection mocked, currency logic fixed 2024-05-27 18:45:02 +03:00
Ivan Nikolaev-Axenov
ffa3098650 xml-exporter added 2024-05-27 16:38:02 +03:00
etreschenkov
e00cc21a58 http://jira.mfd.msk:8088/browse/CLS-684 2024-05-27 16:23:59 +03:00
etreschenkov
a35b19467a http://jira.mfd.msk:8088/browse/CLS-685 2024-05-27 16:23:13 +03:00
AKurakin
b29d19cfaa http://jira.mfd.msk:8088/browse/CLS-680 reestry_utility GBRR 2024-05-24 20:43:20 +03:00
Ivan Nikolaev-Axenov
54722afb2c Pipelines removed, minor code changes in ObjectTags 2024-05-24 18:58:19 +03:00
Ivan Nikolaev-Axenov
b958dd0e5c xml-importer added 2024-05-24 18:04:22 +03:00
etreschenkov
6d47a2e322 http://jira.mfd.msk:8088/browse/CLS-684 2024-05-24 13:39:31 +03:00
AKurakin
1349425e09 http://jira.mfd.msk:8088/browse/CLS-680 reestry_utility GBRR 2024-05-23 18:47:12 +03:00
ialbert
11684bf923 currency session step 7 (paymentInstructions) - statements and assets 2024-05-21 16:38:43 +03:00
ialbert
20bd9a0bb5 Merge remote-tracking branch 'origin/dev' into dev 2024-05-21 13:46:34 +03:00
ialbert
d141ff3224 session logging fix 2024-05-21 13:46:19 +03:00
akulikov
09e47209aa reports-service: fixes 2024-05-20 14:41:40 +03:00
ialbert
c5cad4d27c spring 'dev' profile for backend-api & imdg 2024-05-17 16:41:37 +03:00
ialbert
fbc0cfc650 Merge remote-tracking branch 'origin/dev' into dev 2024-05-16 19:29:33 +03:00
ialbert
57c317aed2 sdf20 plan balance if active session is present 2024-05-16 19:29:16 +03:00
AKurakin
42b7bca653 platform-messaging При сериализации Json заголовки NULL полей не попадут в сообщение. 2024-05-16 12:16:07 +03:00
ialbert
22c6ca754c Merge remote-tracking branch 'origin/dev' into dev 2024-05-15 16:04:03 +03:00
ialbert
a7c93234c8 coverageStatus fix 2024-05-15 16:03:29 +03:00
AKurakin
a52265eca5 DATA поправил опечатку в ERROR_CODE_DICTIONARY 2024-05-15 12:11:27 +03:00
AKurakin
e1e96cbbce http://jira.mfd.msk:8088/browse/CLS-673 DATA 2024-05-15 12:02:04 +03:00
akulikov
932eb6d57f reports-service: fix KSRepTradesReportBuilder 2024-05-15 10:02:05 +03:00
AKurakin
1c35dc2881 account-service заполнение bankAccount.currency 2024-05-14 17:32:42 +03:00
ialbert
5a158cec1d correspondent account validation
currency exists check
2024-05-14 17:21:25 +03:00
AKurakin
dc4a252400 account-service http://jira.mfd.msk:8088/browse/CLS-672 заполнение bankAccount.swiftCode 2024-05-14 12:13:47 +03:00
AKurakin
ea5a502a0f http://jira.mfd.msk:8088/browse/CLS-672 meta bankAccount.swiftCode 2024-05-13 17:54:44 +03:00
AKurakin
eac594aeeb http://jira.mfd.msk:8088/browse/CLS-671 meta tradingClearingRegistryList 2024-05-13 17:39:15 +03:00
AKurakin
31a828038a http://jira.mfd.msk:8088/browse/CLS-672 meta BankAccount POST/PUT 2024-05-13 17:09:19 +03:00
AKurakin
ae36188f31 http://jira.mfd.msk:8088/browse/CLS-676 Launcher OUTV 2024-05-13 17:09:19 +03:00
AKurakin
89beec5a83 http://jira.mfd.msk:8088/browse/CLS-673 DATA 2024-05-13 17:09:19 +03:00
ialbert
07e78d6a50 sdf54 C_acc_deb/Doc_Date/Value_date fix 2024-05-13 16:22:07 +03:00
ialbert
23604146f8 1. Sessions currency (TRAN/ANLT accounts) fixes
2. ExecutionDeposit/ExecutionFond SettlementCurrency fix
3. payment-outbound dm*i search currency
4. TcrListNew validation - already present TcrList for specified currency
5. account-service do not create accounts for 'not-found' currencies
2024-05-08 17:57:56 +03:00
ialbert
da63e9c236 Merge remote-tracking branch 'origin/dev' into dev 2024-05-07 12:40:45 +03:00
akulikov
827e6b7954 http://jira.mfd.msk:8088/browse/CLS-629 2024-05-07 12:25:37 +03:00
ialbert
c76b466834 http://jira.mfd.msk:8088/browse/CLS-571 2024-05-07 12:16:35 +03:00
akulikov
d46bd1fc5e http://jira.mfd.msk:8088/browse/CLS-629 2024-05-07 03:17:59 +03:00
ialbert
f2f94ca3e2 identification funds AM*T search bigfix 2024-05-06 16:45:52 +03:00
ialbert
d636a6b0ce currency: sdf06/sdf55/sdf57/identification funds/outbound payment 2024-05-06 14:54:41 +03:00
ialbert
662d083b9c SDF06 tcr search after gateway response bugfix 2024-05-06 11:19:20 +03:00
ialbert
78b511c321 SDF57 fixed empty Dt_in/Kt_in bugfix 2024-05-06 11:16:24 +03:00
psemenkov
ef9f9b3ca2 http://jira.mfd.msk:8088/browse/CLS-665
Добавил логирование пар sdf в pairsdf.
2024-05-06 10:55:52 +03:00
psemenkov
67c0599284 http://jira.mfd.msk:8088/browse/CLS-595
Исправил ошибку(необходимо реализовать новую логику с CompanyId из ТЗ).
2024-05-06 10:28:27 +03:00
AKurakin
4c9b70df5f http://jira.mfd.msk:8088/browse/CLS-613#comment-59858 2024-05-05 22:01:50 +03:00
ialbert
0fb88db608 sdf57 checkBalance and expected balance 2024-05-03 19:12:40 +03:00
ialbert
a65ac4b9b6 currency session registry creation bugfix currency_pair_security search
all sessions 1st step changed sdf51 -> sdf56
2024-05-03 16:19:16 +03:00
ialbert
e3f5236aee Merge remote-tracking branch 'origin/dev' into dev 2024-05-03 14:31:41 +03:00
ialbert
c13f0d8270 sdf04 fix TRAN accounts
SDF57 & SDF06 fix currency on gateway
2024-05-03 14:31:26 +03:00
etreschenkov
2b85cf6f0f fix build account field 2024-05-02 17:12:39 +03:00
ialbert
1ff7fb4b23 TradingClearingRegistryList -> Registry 2024-05-02 15:57:32 +03:00
etreschenkov
d1c9227b58 fix build account field 2024-05-02 15:54:04 +03:00
etreschenkov
6e2364d91c fix build account field 2024-05-02 15:43:42 +03:00
etreschenkov
10fe89dd10 filled accountType
fix build account field
2024-05-02 13:59:56 +03:00
etreschenkov
5739606f8b some refactor 2024-05-02 12:07:05 +03:00
psemenkov
6eb83d2a07 Добавил настройки в objectMapper для сериализации полей типов времени(Instant, ..). 2024-05-02 10:39:30 +03:00
ialbert
95eb359961 account-service account#currency 2024-05-01 18:02:29 +03:00
ialbert
fdc238e510 account-service account#currency from sdf52#account 2024-05-01 17:45:20 +03:00
ialbert
8375759ea2 Merge remote-tracking branch 'origin/dev' into dev 2024-05-01 17:13:33 +03:00
ialbert
aef72cf13f SDF53#accType
currency session
2024-05-01 17:13:17 +03:00
AKurakin
f4425bd987 gateway-api securities-service http://jira.mfd.msk:8088/browse/CLS-663 CURR(currency-pair) Listing 2024-04-27 18:07:33 +03:00
etreschenkov
bbef81e867 http://jira.mfd.msk:8088/browse/CLS-631 2024-04-27 18:03:58 +03:00
AKurakin
53df6b6b62 gateway-api securities-service http://jira.mfd.msk:8088/browse/CLS-663 CURR(currency-pair) 2024-04-27 17:01:22 +03:00
AKurakin
0e5f2ed054 account-service http://jira.mfd.msk:8088/browse/CLS-631 правки валидации TradingClearingRegistryList 2024-04-27 15:23:06 +03:00
AKurakin
9bd0ad49ec account-service http://jira.mfd.msk:8088/browse/CLS-631 TradingClearingRegistryList bug fix 2024-04-27 11:15:51 +03:00
AKurakin
8671f8e64c backend-api imdg-hist http://jira.mfd.msk:8088/browse/CLS-523 session-history (bug fix) 2024-04-26 21:08:12 +03:00
AKurakin
5ca2153a3b backend-api imdg-hist http://jira.mfd.msk:8088/browse/CLS-523 session-history 2024-04-26 20:54:04 +03:00
AKurakin
f6ffca32b4 backend-api account-service META accounts POST currency 2024-04-26 20:09:18 +03:00
AKurakin
6503baf710 imdg http://jira.mfd.msk:8088/browse/CLS-613 DDL поправил UpdateMapService.java 2024-04-26 19:50:56 +03:00
AKurakin
249ef05173 meta ddl http://jira.mfd.msk:8088/browse/CLS-664 с currencyPairSecurity, мелкие правки 2024-04-26 18:50:57 +03:00
psemenkov
21976322c2 http://jira.mfd.msk:8088/browse/CLS-637
Добавил формирование сообщения при отправке запроса в ТС.
2024-04-26 16:22:14 +03:00
AKurakin
d93bf629af http://jira.mfd.msk:8088/browse/CLS-625 улучшил логирование trace 2024-04-25 18:44:35 +03:00
AKurakin
303f026489 ddl imdg CurrencyPairSecurity (сломано в 07db668092) 2024-04-25 18:11:23 +03:00
AKurakin
43a11267fc ddl http://jira.mfd.msk:8088/browse/CLS-664 fix DDL bug 2024-04-25 17:44:51 +03:00
AKurakin
07db668092 meta ddl http://jira.mfd.msk:8088/browse/CLS-664 с currencyPairSecurity, мелкие правки 2024-04-25 16:54:50 +03:00
AKurakin
5891ad4994 meta с currency-pair, куча мелких правок 2024-04-25 15:27:08 +03:00
psemenkov
9cb645b115 http://jira.mfd.msk:8088/browse/CLS-655
Добавил поле acc_type в s_df52.
2024-04-24 18:38:09 +03:00
AKurakin
7f3e1881d2 up POM version SPCEX-3.11.0.0 2024-04-24 16:49:42 +03:00
psemenkov
fce78c196b http://jira.mfd.msk:8088/browse/CLS-625
Сделал экспорт файлов файла .lim для установки лимитов по валютным средствам и отправку сообщения об ошибке формирования.
2024-04-24 16:46:33 +03:00
psemenkov
8315e9814b http://jira.mfd.msk:8088/browse/CLS-589
Добавил отправку сообщений о выгрузке лимитов в торговую систему для utility-service через kafka.
2024-04-24 11:22:21 +03:00
AKurakin
97bdf20975 backend-api account-service http://jira.mfd.msk:8088/browse/CLS-631 изменение API для TradingClearingRegistryList 2024-04-23 19:59:28 +03:00
AKurakin
8305137de5 account-service http://jira.mfd.msk:8088/browse/CLS-585 ClearingAccountService SDF52 2024-04-23 18:14:52 +03:00
akulikov
9376f9f6b1 force stop session feature fixes 2024-04-23 17:34:13 +03:00
akulikov
8a6f2abc8c force stop session feature 2024-04-23 17:34:12 +03:00
AKurakin
4d37475cbc imdg db-scripts meta http://jira.mfd.msk:8088/browse/CLS-613 DDL поправил опечатку в executionCurrency, добавил поле sdf52.acc_type 2024-04-23 16:45:34 +03:00
AKurakin
48c843e5c1 gateway-api http://jira.mfd.msk:8088/browse/CLS-663 CURR(currency-pair) 2024-04-23 15:21:56 +03:00
ialbert
b004b9191a split sdf57/sdf01 2024-04-23 15:07:58 +03:00
ialbert
9971299c70 Merge remote-tracking branch 'origin/dev' into dev 2024-04-22 17:12:13 +03:00
ialbert
e8fda5a8f8 ANLT & TCR search 2024-04-22 17:10:41 +03:00
psemenkov
e5d0e208bd http://jira.mfd.msk:8088/browse/CLS-619
Исправил ошибку.
2024-04-18 13:12:20 +03:00
AKurakin
085acf8a2b dbf-exporter dbf-importer http://jira.mfd.msk:8088/browse/CLS-619 добавил логи для отладки 2024-04-18 11:40:58 +03:00
ialbert
e58a19a511 Merge remote-tracking branch 'origin/dev' into dev 2024-04-17 18:36:17 +03:00
ialbert
3d47b2b2f3 sdf01/sdf57/sdf06 currency 2024-04-17 18:35:53 +03:00
psemenkov
0f5ec7419e http://jira.mfd.msk:8088/browse/CLS-619
Добавил пояснение к настройке.
2024-04-17 14:39:19 +03:00
psemenkov
db4a084e83 http://jira.mfd.msk:8088/browse/CLS-619
Сделал экспорт файлов по папкам, в зависимости от валюты из настроек.
2024-04-17 14:02:10 +03:00
AKurakin
b028aca544 db-scripts http://jira.mfd.msk:8088/browse/CLS-660 2024-04-16 17:03:58 +03:00
AKurakin
7308f69c78 imdg http://jira.mfd.msk:8088/browse/CLS-661 CLS-276 оптимизация: добавил индекс в MarketMapStore 2024-04-16 15:46:25 +03:00
AKurakin
cbad15aab9 dbf-importer swt-importer platform-enum http://jira.mfd.msk:8088/browse/CLS-587 Нотификейшены по sDF загрузке 2024-04-15 19:03:28 +03:00
AKurakin
9d0e092d70 backend-api http://jira.mfd.msk:8088/browse/CLS-613 DDL & meta 2024-04-15 17:47:05 +03:00
psemenkov
4da055edad http://jira.mfd.msk:8088/browse/CLS-619
Изменил импорт файлов по SFTP в dbf-importer.
2024-04-15 17:10:14 +03:00
AKurakin
eb79ccf8d0 backend-api http://jira.mfd.msk:8088/browse/CLS-659 meta 2024-04-12 19:28:25 +03:00
AKurakin
89bf4fe820 account-service utility-service http://jira.mfd.msk:8088/browse/CLS-588 2024-04-12 19:09:47 +03:00
AKurakin
0dfd89d294 clearing-service http://jira.mfd.msk:8088/browse/CLS-628 обработка ExecutionCurrency (доделать некоторые поля) 2024-04-12 18:14:05 +03:00
AKurakin
4580880fe4 backend-api +PairSdfController, GatewayResultController 2024-04-12 12:01:41 +03:00
AKurakin
38c04c7150 http://jira.mfd.msk:8088/browse/CLS-612 currencyPairSecurityService validator bug fix 2024-04-11 14:48:41 +03:00
AKurakin
fe84a88781 sftp добавил лог для OutDir 2024-04-09 18:44:59 +03:00
AKurakin
60deeca9b9 clearing-service http://jira.mfd.msk:8088/browse/CLS-657 (fix s_df51) 2024-04-09 18:31:02 +03:00
psemenkov
2adb585aa2 http://jira.mfd.msk:8088/browse/CLS-655
Исправил пале для экспорта в s_df55.
2024-04-08 12:36:55 +03:00
psemenkov
a8481d0e9e http://jira.mfd.msk:8088/browse/CLS-655
Добавил новые паля для экспорта s_df06, s_df55 и s_df57.
2024-04-08 12:26:15 +03:00
AKurakin
bb35521cb7 http://jira.mfd.msk:8088/browse/CLS-615 http://jira.mfd.msk:8088/browse/CLS-617 TradingClearingRegistryList 2024-04-04 19:14:51 +03:00
AKurakin
7d8def669d http://jira.mfd.msk:8088/browse/CLS-613 DDL 2024-04-03 17:32:51 +03:00
AKurakin
867d5f928a company-service http://jira.mfd.msk:8088/browse/CLS-621 2024-04-03 16:12:56 +03:00
AKurakin
862b7f0006 http://jira.mfd.msk:8088/browse/CLS-621 добавил код 3034 2024-04-03 15:06:33 +03:00
psemenkov
4e205f0f74 http://jira.mfd.msk:8088/browse/CLS-656
Добавил новые паля для экспорта s_df07 и s_df54.
2024-04-03 13:04:32 +03:00
AKurakin
576eaaee9f http://jira.mfd.msk:8088/browse/CLS-613 DDL поправил тип поля Doc_Date 2024-04-02 15:33:57 +03:00
AKurakin
1a940c4322 clearing-service http://jira.mfd.msk:8088/browse/CLS-657 изменение StartRevise для SDf51 2024-04-02 14:04:49 +03:00
AKurakin
ba4b9aa042 Merge branch 'master' into dev 2024-04-01 17:49:51 +03:00
AKurakin
4f0c6a6311 http://jira.mfd.msk:8088/browse/CLS-658 up POM version SPCEX-3.5.10.2 2024-04-01 17:05:53 +03:00
AKurakin
110f95f74c swt-exporter http://jira.mfd.msk:8088/browse/CLS-658 DF09 2024-04-01 16:45:48 +03:00
AKurakin
b6ff7b091d http://jira.mfd.msk:8088/browse/CLS-612 currencyPairSecurityService 2024-03-21 19:51:04 +03:00
AKurakin
d1cf6da58e http://jira.mfd.msk:8088/browse/CLS-613 DDL classes, доделал UpdateMapService поправил CurrencyPairDictionaryMapStore 2024-03-20 16:14:51 +03:00
AKurakin
e32733de60 http://jira.mfd.msk:8088/browse/CLS-631 backend-api методы + CLS-613 meta fix field 2024-03-18 17:10:24 +03:00
AKurakin
634e6200f9 http://jira.mfd.msk:8088/browse/CLS-613 DDL classes версии 3.1 исправление и добавил fileName в SDF 2024-03-15 17:14:09 +03:00
AKurakin
a804a64078 http://jira.mfd.msk:8088/browse/CLS-613 DDL classes версии 3.1, классы 2024-03-15 14:57:30 +03:00
AKurakin
3ab04ca9e8 http://jira.mfd.msk:8088/browse/CLS-613 DDL версии 3.11 вариант 2 2024-03-15 14:57:00 +03:00
AKurakin
481a24be77 registry-service http://jira.mfd.msk:8088/browse/CLS-653 2024-03-04 15:57:01 +03:00
AKurakin
c705b4e27c registry-service http://jira.mfd.msk:8088/browse/CLS-653 improvement MoneyBalanceRegisterService 2024-03-04 13:03:51 +03:00
etreschenkov
42c75db19e up pom version 2024-02-27 16:43:34 +03:00
etreschenkov
7942939aee up pom version 2024-02-27 16:40:18 +03:00
ialbert
afc6983537 http://jira.mfd.msk:8088/browse/CLS-652 2024-02-27 12:49:00 +03:00
AKurakin
619b7d8767 extdb-importer http://jira.mfd.msk:8088/browse/CLS-641 ограничение по дате в SQL 2024-02-13 17:50:07 +03:00
AKurakin
686b15318d backend-api http://jira.mfd.msk:8088/browse/CLS-645 meta 2024-02-13 11:00:36 +03:00
AKurakin
98a77dc53e z-distr добавил db-scripts в сборку дистрибутива 2024-02-12 16:15:24 +03:00
AKurakin
499b196183 backend-api http://jira.mfd.msk:8088/browse/CLS-650 meta 2024-02-12 13:48:30 +03:00
AKurakin
bc5377a752 imdg http://jira.mfd.msk:8088/browse/CLS-649 2024-02-12 13:43:57 +03:00
AKurakin
50962c34b5 imdg CLS-639 2024-02-12 13:43:27 +03:00
AKurakin
0815f66ee7 clearing-service http://jira.mfd.msk:8088/browse/CLS-647 добавил логи 2024-02-12 12:57:29 +03:00
AKurakin
96a0ef78aa backend-api CLS-641 http://jira.mfd.msk:8088/browse/CLS-650 http://jira.mfd.msk:8088/browse/CLS-651 meta 2024-02-12 11:32:15 +03:00
AKurakin
b722a9b90e extdb-importer http://jira.mfd.msk:8088/browse/CLS-641 поправил опечатку 2024-02-09 19:36:49 +03:00
ialbert
4d7a2ebbf7 http://jira.mfd.msk:8088/browse/CLS-643 2024-02-09 18:23:49 +03:00
ialbert
960e4ffab0 http://jira.mfd.msk:8088/browse/CLS-644 2024-02-09 18:23:49 +03:00
ialbert
f64910154c http://jira.mfd.msk:8088/browse/CLS-647 2024-02-09 18:23:49 +03:00
ialbert
5d40c9db34 http://jira.mfd.msk:8088/browse/CLS-643 2024-02-09 18:23:49 +03:00
ialbert
f92941a2fc http://jira.mfd.msk:8088/browse/CLS-640 2024-02-09 18:23:49 +03:00
AKurakin
d06a0efeec extdb-importer http://jira.mfd.msk:8088/browse/CLS-641 поправил опечатку 2024-02-09 13:52:47 +03:00
AKurakin
9e5d54b130 extdb-importer http://jira.mfd.msk:8088/browse/CLS-641 2024-02-09 12:53:38 +03:00
AKurakin
8ee172b075 backend-api classes http://jira.mfd.msk:8088/browse/CLS-639 поправил created/updated 2024-02-09 11:44:30 +03:00
AKurakin
1f2f70d301 extdb-importer http://jira.mfd.msk:8088/browse/CLS-641 2024-02-09 11:37:44 +03:00
AKurakin
f033ea8244 db-scripts добавлена новая CURRENCY 2024-02-08 17:26:48 +03:00
AKurakin
233b301c8f z-distr убрал copy_modules_to_single_dir.cmd 2024-02-08 16:45:10 +03:00
AKurakin
5eff6962fe backend-api http://jira.mfd.msk:8088/browse/CLS-648 2024-02-08 14:14:07 +03:00
AKurakin
4a4c4f94db backend-api http://jira.mfd.msk:8088/browse/CLS-645 meta GALB новый паарметр fromTime 2024-02-08 13:41:38 +03:00
AKurakin
c2bd914e79 backend-api scheduler-service meta GALB новый паарметр fromTime 2024-02-08 13:35:03 +03:00
AKurakin
1e6eb8fd00 backend-api classes db-scripts http://jira.mfd.msk:8088/browse/CLS-639 DDL sCrossRate 2024-02-08 11:28:32 +03:00
AKurakin
57855bd8b5 registry-service ExecutionRegisterReport правки + новое поле 2024-02-06 12:43:19 +03:00
AKurakin
c8f65428ff db-scripts DATA вынесение DATA_REGISTER_CODE 2024-02-01 18:21:04 +03:00
AKurakin
159231763d registry-service LiabilitiesRegistryReport добавил поле в отчёт 2024-02-01 18:20:16 +03:00
AKurakin
43f534e02b registry-service DepoBalanceRegisterReportBuilder поправил опечатку 2024-02-01 15:31:16 +03:00
AKurakin
603bec95b0 registry-service http://jira.mfd.msk:8088/browse/CLS-638 LiabilitiesRegisterService добавлен мэппинг SessionType 2024-01-31 16:59:05 +03:00
AKurakin
1e1840028a registry-service http://jira.mfd.msk:8088/browse/CLS-638 LiabilitiesRegisterService поправил тест 2024-01-31 10:53:45 +03:00
AKurakin
24c203a83f registry-service http://jira.mfd.msk:8088/browse/CLS-638 LiabilitiesRegisterService теперь только в файл, backend-api meta после CLS-635 удалили лишнее - вернул 2024-01-30 18:42:50 +03:00
ialbert
d4285494af Merge branch '10_01_2024_hotfix' into dev 2024-01-30 17:54:10 +03:00
ialbert
624f0dfd29 sessionId for executions 2024-01-30 17:52:54 +03:00
ialbert
35151a172f SDF06/SDF10 timeouts
This reverts commit fd900e27
2024-01-29 14:01:48 +03:00
AKurakin
58f78c39b4 reports-service оправил выборку ExecutionDeposit и ExecutionFond 2024-01-29 12:22:53 +03:00
AKurakin
2c3a08232b Merge branch 'logger_appender' into dev 2024-01-24 13:57:14 +03:00
AKurakin
d5da4b3c1e backend-api http://jira.mfd.msk:8088/browse/CLS-635 meta 3.9.0.72 2024-01-24 13:38:46 +03:00
AKurakin
ad0d807b2c registry-service http://jira.mfd.msk:8088/browse/CLS-634 2024-01-24 13:16:56 +03:00
AKurakin
aefd907ec7 Merge branch 'dev' into logger_appender 2024-01-19 15:54:22 +03:00
AKurakin
2572e7ea26 поправил опциональность опциональной настройки clearing-service.session-stage.inspection-gateway-timeout (bug fix KafkaConfig 0fd9208e41) 2024-01-19 15:53:39 +03:00
AKurakin
b19bc3b426 logback.xml новый appender: logstash-logback-encoder 2024-01-19 12:44:28 +03:00
ialbert
6a20c2faed Merge branch '10_01_2024_hotfix' into dev 2024-01-17 13:22:40 +03:00
ialbert
efce62e518 Merge branch '10_01_2024_hotfix' into dev 2024-01-12 21:22:02 +03:00
ialbert
11fb7509f4 SDF57 cs_blocked to gateway DM_V 2024-01-12 21:21:30 +03:00
akulikov
960e8b2c7e registry-service: fix date/time 2024-01-12 18:36:39 +03:00
akulikov
460642c98c registry-service: remove auto column size 2024-01-12 18:02:30 +03:00
ialbert
e605897cc1 Merge branch '10_01_2024_hotfix' into dev 2024-01-12 11:39:27 +03:00
ialbert
4992cc4bad http://jira.mfd.msk:8088/browse/CLS-311 2024-01-11 15:49:23 +03:00
ialbert
7e40208ce7 http://jira.mfd.msk:8088/browse/CLS-311 2024-01-11 15:49:22 +03:00
ialbert
a7c791e61a SDF06 DM*T.status condition OK/MNG => PROC/MNG 2024-01-11 15:49:22 +03:00
akulikov
cb49f07b10 registry-service: fix report name, fix npe 2024-01-09 16:01:18 +03:00
akulikov
157658962a registry-service: CSV reports -> XLSX reports, rename reports 2024-01-09 15:38:58 +03:00
akulikov
b9b50ba957 http://jira.mfd.msk:8088/browse/CLS-608 fix 2023-12-29 17:44:20 +03:00
akulikov
ce85bbe8be http://jira.mfd.msk:8088/browse/CLS-608 fix 2023-12-29 17:25:15 +03:00
akulikov
8d8322e009 http://jira.mfd.msk:8088/browse/CLS-608 fix 2023-12-29 16:56:09 +03:00
akulikov
227e76a5ce http://jira.mfd.msk:8088/browse/CLS-608 executionRegisterReport 2023-12-29 15:49:28 +03:00
akulikov
ed3c08cdeb http://jira.mfd.msk:8088/browse/CLS-608 fixes 2023-12-29 14:47:13 +03:00
akulikov
256dfafce3 http://jira.mfd.msk:8088/browse/CLS-608 fix money/depo balance register, money/depo payment instruction report added 2023-12-29 14:08:48 +03:00
akulikov
256f88a5c5 http://jira.mfd.msk:8088/browse/CLS-608 2023-12-29 13:15:18 +03:00
akulikov
9b81ee6b35 http://jira.mfd.msk:8088/browse/CLS-610 2023-12-29 11:40:11 +03:00
akulikov
fd2ba48189 http://jira.mfd.msk:8088/browse/CLS-608 Money/DepoBalanceRegisterReport 2023-12-29 10:45:23 +03:00
AKurakin
0f65c05f08 http://jira.mfd.msk:8088/browse/CLS-607 поправил комментарии 2023-12-28 18:01:00 +03:00
akulikov
2cbb8a39ef http://jira.mfd.msk:8088/browse/CLS-609 2023-12-28 17:46:09 +03:00
akulikov
be58666afc remove validation role for reports-service 2023-12-28 13:59:55 +03:00
ialbert
da8adbd052 http://jira.mfd.msk:8088/browse/CLS-607 2023-12-27 12:02:56 +03:00
ialbert
fd900e27b6 http://jira.mfd.msk:8088/browse/CLS-606 2023-12-27 11:32:21 +03:00
AKurakin
97b8a4fd78 http://jira.mfd.msk:8088/browse/CLS-604 скрипт market.sql (добавил автогенерацию) 2023-12-22 13:39:42 +03:00
AKurakin
32c7d50444 http://jira.mfd.msk:8088/browse/CLS-604 скрипт для загрузки режимов market.sql 2023-12-20 15:32:49 +03:00
1345 changed files with 156658 additions and 20538 deletions

76
.gitlab-ci.yml Normal file
View file

@ -0,0 +1,76 @@
image:
name: ${DOCKER_PROXY}/docker:latest
pull_policy: if-not-present
variables:
GIT_SUBMODULE_STRATEGY: recursive
DOCKER_PROXY: "mirror.gcr.io"
ACCESS_TOKEN: "glpat-t_i_xh-qo58ud2hT5vxj"
stages:
- preflight
- build
- test
preflight:
image: ${DOCKER_PROXY}/bitnami/git:latest
stage: preflight
script:
- pwd
- git clone "http://gitlab-ci-token:$ACCESS_TOKEN@git.mfd.msk/mfd/clearing_test.git"
- find /builds/mfd/clearing/clearing_test -name ".gitkeep" -type f -delete
artifacts:
name: "$CI_COMMIT_REF_NAME"
expire_in: 1 day
paths:
- clearing_test
only:
- master
- dev
- /^dev_.*$/
- new
resource_group: clearing-test
build:
image: ${DOCKER_PROXY}/maven:latest
stage: build
script:
- mvn clean package -DskipTests -Pdistributive
artifacts:
name: "$CI_COMMIT_REF_NAME"
expire_in: 1 day
paths:
- /builds/mfd/clearing/z-distr/target/clearing
only:
- master
- dev
- /^dev_.*$/
- new
resource_group: clearing-test
test:
stage: test
variables:
CLEARING_TEST_DIR: "/builds/mfd/clearing/clearing_test"
CLR_TEST_DIR: "/builds/mfd/clearing/clr_test"
RESULT_FILES_DIR: "/builds/mfd/clearing/clr_test/result-files"
script:
- echo "Installing maven and python" && apk update && apk add maven python3
- echo "Copying jar files to clearing-all/bin" && cp -r /builds/mfd/clearing/z-distr/target/clearing/bin ./clr_test/clearing-all/bin
- echo "Copying ddl files to clearing-all/db" && cp -r /builds/mfd/clearing/z-distr/target/clearing/db ./clr_test/clearing-all/db
- echo "Removing old logs folder artifacts/logs" && rm -rf artifacts/logs
- python3 clr_test/run_test_docker_containers.py
- echo "Copying logs" && mkdir -p artifacts/logs && docker run --rm -v clr_test_logs_volume:/logs alpine tar -C /logs -cf - . | tar -C artifacts/logs -xf -
- echo "Cleaning up log volume" && docker volume rm clr_test_logs_volume
- cat clr_test/results.txt && ! grep -q "failed" clr_test/results.txt
artifacts:
expire_in: 7 day
when: always
paths:
- artifacts/logs
only:
- master
- dev
- /^dev_.*$/
- new
resource_group: clearing-test

View file

@ -5,7 +5,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-1.0.0.0</version>
<version>SPCEX-3.22.295</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@ -48,6 +48,12 @@
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- special logging -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.0.1</version>
</dependency>
<!-- TEST -->
<dependency>
<groupId>ru.spcex.clearing</groupId>

View file

@ -3,6 +3,7 @@ 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.account.config.settings.elem.AppSettings;
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;
@ -14,6 +15,7 @@ public class AccountServiceSettings {
private HazelcastClientParams hazelcast;
private KafkaConsumerSettings kafkaConsumer;
private KafkaProducerSettings kafkaProducer;
private AppSettings app;
public HazelcastClientParams getHazelcast() {
return hazelcast;
@ -38,4 +40,12 @@ public class AccountServiceSettings {
public void setKafkaProducer(KafkaProducerSettings kafkaProducer) {
this.kafkaProducer = kafkaProducer;
}
public AppSettings getApp() {
return app;
}
public void setApp(AppSettings app) {
this.app = app;
}
}

View file

@ -0,0 +1,13 @@
package ru.spcex.clearing.account.config.settings.elem;
public class AppSettings {
private String registryUnit = "T";
public String getRegistryUnit() {
return registryUnit;
}
public void setRegistryUnit(String registryUnit) {
this.registryUnit = registryUnit;
}
}

View file

@ -1,5 +1,10 @@
package ru.spcex.clearing.account.config.validation;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
@ -22,17 +27,12 @@ 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.imdg.validation.rule.CurrencyCodeValidationRule;
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 {
@ -48,6 +48,8 @@ public class AccountValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary);
addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary);
addImdg.accept(IMDGDistributedNames.Map_Currency);
return new ValidatorImpl<>(context,
IdPresentRule.instance("companyId",
CorrespondentAccountNewRequest::getCompanyId,
@ -98,7 +100,7 @@ public class AccountValidationConfig {
AccountError.DictionaryNotFound,
accountType -> {
if (IEnumKey.contains(accountType.getCode(), AccountType.Corr, AccountType.Info)) return null;
return AccountError.WrongFieldValue;
return new EnumMessage(AccountError.WrongFieldValue, "accountType");
}).withMessageDecorator((causeEmpty, errorCode, fieldName, fieldValue) -> {
if (errorCode == AccountError.WrongFieldValue)
return DictionaryPresentRule.FIELD_NOT_FOUND_DECORATOR_1.decorator(causeEmpty, errorCode, fieldName, fieldValue);
@ -106,6 +108,16 @@ public class AccountValidationConfig {
return DictionaryPresentRule.DICTIONARY_NOT_FOUND_DECORATOR_2.decorator(causeEmpty, errorCode, fieldName, fieldValue);
}
),
DictionaryPresentRule.instance("currency",
CorrespondentAccountNewRequest::getCurrency,
IMDGDistributedNames.Map_CurrencyCodeDictionary,
ServiceStatusDictionary.class,
null,
AccountError.DictionaryNotFound,
false
),
CurrencyCodeValidationRule.get(AccountError.CurrencyNotFound),
new SameAccountValidationRule<>(AccountType.Corr, CorrespondentAccountNewRequest::getAccount)
);
};

View file

@ -1,5 +1,8 @@
package ru.spcex.clearing.account.config.validation;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
@ -13,10 +16,9 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewReq
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.ValidateSymbolsRule;
import ru.spcex.clearing.validation.common.rules.specific.IdPresentSpecificRule;
import ru.spcex.platform.classes.base.SpcexObjectBase;
import ru.spcex.platform.enumeration.AccountStatus;
@ -27,11 +29,6 @@ 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 {
@ -48,6 +45,7 @@ public class BankAccountValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary);
addImdg.accept(IMDGDistributedNames.Map_ValidationSymbols);
return new ValidatorImpl<>(context,
IdPresentRule.instance("companyId",
BankAccountNewRequest::getCompanyId,
@ -56,10 +54,6 @@ public class BankAccountValidationConfig {
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound,
false),
FieldNotBlankRequiredRule.instance("account",
BankAccountNewRequest::getAccount,
AccountError.RequiredFieldEmpty
),
new SameAccountValidationRule<>(AccountType.Bank, BankAccountNewRequest::getAccount),
DictionaryPresentRule.instance("currency",
BankAccountNewRequest::getCurrency,
@ -67,9 +61,6 @@ public class BankAccountValidationConfig {
CurrencyCodeDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound),
FieldRequiredRule.instance("bankIdentificationCode",
BankAccountNewRequest::getBankIdentificationCode,
AccountError.RequiredFieldEmpty),
FieldRequiredRule.instance("bankName",
BankAccountNewRequest::getBankName,
AccountError.RequiredFieldEmpty),
@ -79,8 +70,41 @@ public class BankAccountValidationConfig {
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
);
false),
ValidateSymbolsRule.required("БИК",
BankAccountNewRequest::getBankIdentificationCode,
AccountError.RequiredFieldEmpty,
AccountError.BadSymbol),
ValidateSymbolsRule.required("Наименование компании",
BankAccountNewRequest::getBankName,
AccountError.RequiredFieldEmpty,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Корр. счет",
BankAccountNewRequest::getCorrespondentAccount,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Наименование корр. счета",
BankAccountNewRequest::getCorrespondentAccountName,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Назначение платежа",
BankAccountNewRequest::getDestination,
AccountError.BadSymbol),
ValidateSymbolsRule.required("Счет",
BankAccountNewRequest::getAccount,
AccountError.RequiredFieldEmpty,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("ИНН",
BankAccountNewRequest::getTaxpayerIdentificationNumber,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("КПП",
BankAccountNewRequest::getTaxRegistrationReasonCode,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("SWIFT",
BankAccountNewRequest::getSwiftCode,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("SWIFT посредника",
BankAccountNewRequest::getIntermediarySwiftCode,
AccountError.BadSymbol)
);
};
}
@ -96,6 +120,7 @@ public class BankAccountValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary);
addImdg.accept(IMDGDistributedNames.Map_BankAccount);
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_ValidationSymbols);
return new ValidatorImpl<>(context,
IdPresentRule.instance("id",
BankAccountUpdateRequest::getId,
@ -119,7 +144,37 @@ public class BankAccountValidationConfig {
CurrencyCodeDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
false),
ValidateSymbolsRule.notRequired("БИК",
BankAccountUpdateRequest::getBankIdentificationCode,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Наименование компании",
BankAccountUpdateRequest::getBankName,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Корр. счет",
BankAccountUpdateRequest::getCorrespondentAccount,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Наименование корр. счета",
BankAccountUpdateRequest::getCorrespondentAccountName,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Назначение платежа",
BankAccountUpdateRequest::getDestination,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("Счет",
BankAccountUpdateRequest::getAccount,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("ИНН",
BankAccountUpdateRequest::getTaxpayerIdentificationNumber,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("КПП",
BankAccountUpdateRequest::getTaxRegistrationReasonCode,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("SWIFT",
BankAccountUpdateRequest::getSwiftCode,
AccountError.BadSymbol),
ValidateSymbolsRule.notRequired("SWIFT посредника",
BankAccountUpdateRequest::getIntermediarySwiftCode,
AccountError.BadSymbol)
);
};
}

View file

@ -1,5 +1,9 @@
package ru.spcex.clearing.account.config.validation;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
@ -7,9 +11,12 @@ import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.account.validation.BackendClientCodeValidationRule;
import ru.spcex.clearing.account.validation.GatewayClientCodeValidationRule;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule;
import ru.spcex.clearing.validation.common.rules.FieldRequiredRule;
@ -20,11 +27,6 @@ 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 {
@ -37,45 +39,46 @@ public class ClientCodeValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_Company);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryList);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
return new ValidatorImpl<>(context,
FieldRequiredRule.instance("companyId", ClientCodeNewRequest::getCompanyId, AccountError.RequiredFieldEmpty),
IdPresentRule.instance("companyId",
ClientCodeNewRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound),
FieldRequiredRule.instance("companyId", ClientCodeNewRequest::getCompanyId, AccountError.RequiredFieldEmpty),
IdPresentRule.instance("companyId",
ClientCodeNewRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound),
IdPresentRule.instance("moneyAccountId",
ClientCodeNewRequest::getMoneyAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
false,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
IdPresentRule.instance("depoAccountId",
ClientCodeNewRequest::getDepoAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
false,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
DictionaryPresentRule.instance("stauts",
ClientCodeNewRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
IdPresentRule.instance("moneyAccountId",
ClientCodeNewRequest::getMoneyAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
false,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
IdPresentRule.instance("depoAccountId",
ClientCodeNewRequest::getDepoAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
false,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
BackendClientCodeValidationRule.AllAccountsPresent,
BackendClientCodeValidationRule.TcrIsNotPresentByAccount,
DictionaryPresentRule.instance("status",
ClientCodeNewRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
);
};
}
@ -91,51 +94,51 @@ public class ClientCodeValidationConfig {
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
),
return new ValidatorImpl<>(context,
IdPresentRule.instance("id",
ClientCodeUpdateRequest::getId,
IMDGDistributedNames.Map_ClientCode,
ClientCode.class,
AccountError.RequiredFieldEmpty,
AccountError.RecordNotFound
),
FieldRequiredRule.instance("companyId", ClientCodeUpdateRequest::getCompanyId, AccountError.RequiredFieldEmpty),
IdPresentRule.instance("companyId",
ClientCodeUpdateRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound),
FieldRequiredRule.instance("companyId", ClientCodeUpdateRequest::getCompanyId, AccountError.RequiredFieldEmpty),
IdPresentRule.instance("companyId",
ClientCodeUpdateRequest::getCompanyId,
IMDGDistributedNames.Map_Company,
Company.class,
AccountError.RequiredFieldEmpty,
AccountError.CompanyNotFound),
IdPresentRule.instance("moneyAccountId",
ClientCodeUpdateRequest::getMoneyAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
false,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
IdPresentRule.instance("depoAccountId",
ClientCodeUpdateRequest::getDepoAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
false,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
DictionaryPresentRule.instance("stauts",
ClientCodeUpdateRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
IdPresentRule.instance("moneyAccountId",
ClientCodeUpdateRequest::getMoneyAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
true,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
IdPresentRule.instance("depoAccountId",
ClientCodeUpdateRequest::getDepoAccountId,
IMDGDistributedNames.Map_Account,
Account.class,
AccountError.RequiredFieldEmpty,
AccountError.AccountNotFound,
false,
acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId())
? null : AccountError.AccountNotFound
),
BackendClientCodeValidationRule.AllAccountsPresent,
DictionaryPresentRule.instance("stauts",
ClientCodeUpdateRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
);
};
}
@ -148,14 +151,35 @@ public class ClientCodeValidationConfig {
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)
IdPresentRule.instance("id",
CommonDeleteRequest::getId,
IMDGDistributedNames.Map_ClientCode,
ClientCode.class,
AccountError.RequiredFieldEmpty,
AccountError.RecordNotFound)
);
};
}
@Bean("tkrAccountsGatewayValidator")
public Function<TkrAccount, IValidator> newTkrAccountsGatewayValidator(Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation) {
return tkrGatewayRequest -> {
ImdgValidationContext<TkrAccount> context = new ImdgValidationContext<>();
context.setValidatedObject(tkrGatewayRequest);
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_TradingClearingRegistry);
return new ValidatorImpl<>(context,
FieldRequiredRule.instance("client_code", TkrAccount::getClientCode, AccountError.RequiredFieldEmpty),
GatewayClientCodeValidationRule.CompanyPresent,
GatewayClientCodeValidationRule.AllAccountsPresent,
GatewayClientCodeValidationRule.DepoAccountsPresent,
GatewayClientCodeValidationRule.TcrIsNotPresent,
GatewayClientCodeValidationRule.TcrListIsNotPresent
);
};
}
}

View file

@ -38,6 +38,7 @@ public class InformationAccountValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_InformationAccount);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_AccountTypeDictionary);
addImdg.accept(IMDGDistributedNames.Map_CurrencyCodeDictionary);
addImdg.accept(IMDGDistributedNames.Map_Account);
return new ValidatorImpl<>(context,
IdPresentRule.instance("companyId",
@ -59,6 +60,10 @@ public class InformationAccountValidationConfig {
DictionaryPresentRule.instance("accountType", InformationAccountNewRequest::getAccountType,
IMDGDistributedNames.Map_AccountTypeDictionary, AccountTypeDictionary.class,
AccountError.RequiredFieldEmpty, AccountError.DictionaryNotFound, false),
DictionaryPresentRule.instance("currency", InformationAccountNewRequest::getCurrency,
IMDGDistributedNames.Map_CurrencyCodeDictionary, ServiceStatusDictionary.class,
null, AccountError.DictionaryNotFound,false
),
new SameAccountValidationRule<>(AccountType.Info, InformationAccountNewRequest::getAccount)
);
};

View file

@ -31,8 +31,12 @@ class SameAccountValidationRule<R> implements IValidationRule<ImdgValidationCont
R req = context.getValidatedObject();
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
ImdgPredicateBuilder pb = accountImdg.predicateBuilder();
String account = accountGetter.apply(req); // req.getAccount()
if (account == null) {
return empty();
}
ImdgPredicate query = pb.and(
pb.equals("account", accountGetter.apply(req)), // req.getAccount()
pb.equals("account", account),
// pb.equals("accountType", accountType), имена всех счетов уникальны, вне зависимости от типа
pb.in("status", ServiceStatus.Active.getKey(), ServiceStatus.Reopened.getKey(), ServiceStatus.Appl.getKey())
);

View file

@ -0,0 +1,254 @@
package ru.spcex.clearing.account.config.validation;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
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.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
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.registry.TradingClearingRegistryListNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListUpdateRequest;
import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule;
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.CurrencyCode;
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.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.IValidationRule;
import ru.spcex.platform.utils.validation.IValidator;
import ru.spcex.platform.utils.validation.ValidatorImpl;
@Configuration
public class TradingClearingRegistryListValidationConfig {
@Bean("tradingClearingRegistryListNewRequestValidator")
public Function<TradingClearingRegistryListNewRequest, IValidator> tradingClearingRegistryListNewRequestValidator(Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation) {
return tradingClearingRegistryListUpdateRequest -> {
ImdgValidationContext<TradingClearingRegistryListNewRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(tradingClearingRegistryListUpdateRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryList);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
return new ValidatorImpl<>(context,
IdPresentRule.instance("tradingClearingRegistryId",
TradingClearingRegistryListNewRequest::getTradingClearingRegistryId,
IMDGDistributedNames.Map_TradingClearingRegistry,
TradingClearingRegistry.class,
AccountError.RequiredFieldEmpty,
AccountError.TradingClearingRegistryNotFound,
false),
new ExistAllAccountId<>("accountId",
TradingClearingRegistryListNewRequest::getCurrencyAccountList,
TradingClearingRegistryListNewRequest::getAccountId,
TradingClearingRegistryListNewRequest::getTradingClearingRegistryId,
false,
null),
DictionaryPresentRule.instance("stauts",
TradingClearingRegistryListNewRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false),
NotAlreadyPresent.instance
);
};
}
@Bean("tradingClearingRegistryListUpdateRequestValidator")
public Function<TradingClearingRegistryListUpdateRequest, IValidator> tradingClearingRegistryListUpdateRequestValidator(Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation) {
return tradingClearingRegistryListUpdateRequest -> {
ImdgValidationContext<TradingClearingRegistryListUpdateRequest> context = new ImdgValidationContext<>();
context.setValidatedObject(tradingClearingRegistryListUpdateRequest);
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryList);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
return new ValidatorImpl<ImdgValidationContext<TradingClearingRegistryListUpdateRequest>>(context,
IdPresentRule.instance2("id",
TradingClearingRegistryListUpdateRequest::getId,
IMDGDistributedNames.Map_TradingClearingRegistryList,
TradingClearingRegistryList.class,
AccountError.RequiredFieldEmpty,
AccountError.RecordNotFound,
true,
(tcrList) -> {
Long accountId = tcrList.getAccountId();
if (accountId == null)
return null;
if (!IEnumKey.contains(context.getValidatedObject().getStatus(),
ServiceStatus.Active, ServiceStatus.Reopened))
return null;
Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
ImdgPredicateBuilder pb = tradingClearingRegistryListImdg.predicateBuilder();
ImdgPredicate query = pb.and(pb.equals("status", WorkflowStatus.Active.getKey()),
pb.equals("accountId", accountId));
query = pb.and(query, pb.not(pb.equals("id", tcrList.getId())));
Collection<TradingClearingRegistryList> inOtherLists = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate(query);
if (!inOtherLists.isEmpty()) {
Collection<Long> duplicateAccounts = inOtherLists.stream()
.map(TradingClearingRegistryList::getAccountId)
.filter(accountId::equals)
.collect(Collectors.toSet());
return new EnumMessage(AccountError.AccountForTradingClearingRegistryAlreadyUsed, duplicateAccounts, "accountId"); // (5023) «Счет %s уже используется»
}
return null;
}),
DictionaryPresentRule.instance("status",
TradingClearingRegistryListUpdateRequest::getStatus,
IMDGDistributedNames.Map_ServiceStatusDictionary,
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
true)
);
};
}
public static class NotAlreadyPresent implements IValidationRule<ImdgValidationContext<TradingClearingRegistryListNewRequest>> {
private static final NotAlreadyPresent instance = new NotAlreadyPresent();
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TradingClearingRegistryListNewRequest> ctx) {
TradingClearingRegistryListNewRequest tcrListReq = ctx.getValidatedObject();
Long accountId = tcrListReq.getAccountId();
Imdg<TradingClearingRegistryList> tcrListImdg = ctx.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
ImdgPredicateBuilder pb = tcrListImdg.predicateBuilder();
Collection<TradingClearingRegistryList> tcrLists = tcrListImdg.getCollectionObjectsByPredicate(
pb.and(
pb.equals("tradingClearingRegistryId", tcrListReq.getTradingClearingRegistryId()),
pb.equals("status", WorkflowStatus.Active.getKey())
)
);
if (tcrLists.stream().anyMatch(tcrList -> Objects.equals(accountId, tcrList.getAccountId()))) {
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, accountId);
}
return empty();
}
@Override
public String ruleName() {
return "TradingClearingRegistryList.AlreadyPresent";
}
}
public static class ExistAllAccountId<R> implements IValidationRule<ImdgValidationContext<R>> {
String fieldName;
Function<R, List<Long>> accountIdListGetter;
Function<R, Long> accountIdGetter;
Function<R, Long> tkrIdGetter;
boolean required;
Function<R, Long> idGetter;
public ExistAllAccountId(String fieldName,
Function<R, List<Long>> accountIdListGetter,
Function<R, Long> accountIdGetter,
Function<R, Long> tkrIdGetter,
boolean required, Function<R, Long> idGetter) {
this.fieldName = fieldName;
this.accountIdListGetter = accountIdListGetter;
this.accountIdGetter = accountIdGetter;
this.tkrIdGetter = tkrIdGetter;
this.required = required;
this.idGetter = idGetter;
}
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<R> context) {
R validatedObject = context.getValidatedObject();
List<Long> accounts = accountIdListGetter.apply(validatedObject);
if (accounts == null) {
accounts = new ArrayList<>();
}
Long singleAccountId = accountIdGetter.apply(validatedObject);
if (singleAccountId != null) {
accounts.add(singleAccountId);
}
if (accounts.isEmpty()) {
if (required)
return of(AccountError.RequiredFieldEmpty, fieldName); // обязательное поле
else
return Optional.empty();
}
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
// Проверить существование счетов
{
for (Long accountId : accounts) {
Account byIdObject = accountImdg.getSingleObjectByID(accountId);
if (byIdObject == null)
return of(AccountError.AccountNotFound, accountId, fieldName);
if (!IEnumKey.contains(byIdObject.getAccountType(), AccountType.Clrn, AccountType.Info)) {
return of(AccountError.AccountIsNotACurrency, accountId,
fieldName, "expected: CLRN/INFO but is " + byIdObject.getAccountType()); // Счет %S не
}
if (CurrencyCode.isRub(byIdObject.getCurrency()) || StringUtils.isEmpty(byIdObject.getCurrency())) {
return of(AccountError.AccountIsNotACurrency, accountId, fieldName); // Счет %S не валютный
}
// Проверка отсутствия других TradingClearingRegistryList с этими счетами
Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
ImdgPredicateBuilder pb = tradingClearingRegistryListImdg.predicateBuilder();
Collection<TradingClearingRegistryList> listWithAccountId = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate(
pb.and(
pb.equals("accountId", accountId),
pb.equals("status", WorkflowStatus.Active.getKey())
));
if (!listWithAccountId.isEmpty()){
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, byIdObject.getAccount(), fieldName); // (5023) «Данная счет %s уже используется»
}
Long tkrId = tkrIdGetter.apply(validatedObject);
ImdgPredicate query = pb.and(
pb.equals("tradingClearingRegistryId", tkrId),
pb.equals("status", WorkflowStatus.Active.getKey()),
pb.equals("currency", byIdObject.getCurrency()));
if (idGetter != null) {
Long id = idGetter.apply(validatedObject);
if (id == null) // never
return of(AccountError.RequiredFieldEmpty, "id");
query = pb.and(query, pb.not(pb.equals("id", id)));
}
Collection<TradingClearingRegistryList> inOtherLists = tradingClearingRegistryListImdg.getCollectionObjectsByPredicate(query);
if (!inOtherLists.isEmpty()) {
// Collection<String> duplicateAccounts = inOtherLists.stream()
// .map(tradingClearingRegistryList ->
// accountImdg.getSingleObjectByID(tradingClearingRegistryList.getAccountId()).getAccount())
// .collect(Collectors.toSet());
return of(AccountError.CurrencyForTradingClearingRegistryListAlreadyUsed, byIdObject.getCurrency(), fieldName); // (5023) «Данная валюта %s уже используется»
}
}
}
return empty();
}
@Override
public String ruleName() {
return getClass().getSimpleName() + "{" + fieldName + "}";
}
}
}

View file

@ -1,5 +1,11 @@
package ru.spcex.clearing.account.config.validation;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.Account;
@ -8,6 +14,7 @@ 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.clearing.platform.dictionary.TradingClearingRegistryTypeDictionary;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest;
@ -29,12 +36,6 @@ 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 {
@ -53,6 +54,7 @@ public class TradingClearingRegistryValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_DepoAccount);
addImdg.accept(IMDGDistributedNames.Map_InformationAccount);
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryTypeDictionary);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
return new ValidatorImpl<>(context,
IdPresentSpecificRule.instance("companyId",
@ -126,6 +128,13 @@ public class TradingClearingRegistryValidationConfig {
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false),
DictionaryPresentRule.instance("tradingClearingRegistryType",
TradingClearingRegistryNewRequest::getTradingClearingRegistryType,
IMDGDistributedNames.Map_TradingClearingRegistryTypeDictionary,
TradingClearingRegistryTypeDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false),
new newTCRDuplicateCheck()
);
};
@ -140,11 +149,6 @@ public class TradingClearingRegistryValidationConfig {
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) {
@ -157,11 +161,67 @@ public class TradingClearingRegistryValidationConfig {
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);
Account dubAcc = null;
for (TradingClearingRegistry duplicate : existTCR) {
if (Objects.equals(duplicate.getMoneyAccountId(), validatedObject.getMoneyAccountId())) {
dubAcc = accountImdg.getSingleObjectByID(validatedObject.getMoneyAccountId());
}
if (Objects.equals(duplicate.getDepoAccountId(), validatedObject.getDepoAccountId())) {
dubAcc = accountImdg.getSingleObjectByID(validatedObject.getDepoAccountId());
}
if (dubAcc != null) {
break;
}
}
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed,
dubAcc != null ? dubAcc.getAccount() : "null");
}
}
}
static class updateTCRDepoCheck implements IValidationRule<ImdgValidationContext<TradingClearingRegistryUpdateRequest>> {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TradingClearingRegistryUpdateRequest> context) {
TradingClearingRegistryUpdateRequest validatedObject = context.getValidatedObject();
Long depoAccountId = validatedObject.getDepoAccountId();
if (depoAccountId == null) // необязательное поле
return empty();
// Проверка типа счёта ДЕПО, что существует
Imdg<DepoAccount> depoAccountImdg = context.obtainMap(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
DepoAccount depoAccount = depoAccountImdg.getFirstObjectByFieldValues(
Map.of("accountId", depoAccountId)
);
if (depoAccount == null)
return of(AccountError.AccountNotFound, depoAccountId);
// Проверка компании ТКР и счёта
Imdg<TradingClearingRegistry> tcrMap = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
Imdg<Account> accountImdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
Account account = accountImdg.getSingleObjectByID(validatedObject.getMoneyAccountId());
if (account == null) { // never
return of(AccountError.AccountNotFound, validatedObject.getMoneyAccountId());
}
TradingClearingRegistry updateObject = tcrMap.getSingleObjectByID(validatedObject.getId());
if (!Objects.equals(account.getCompanyId(), updateObject.getCompanyId())) {
return of(AccountError.AccountNotFound, validatedObject.getMoneyAccountId()); // или UserVerifyDenial
}
// Проверка использования счёта в других ТКР
ImdgPredicateBuilder pb = tcrMap.predicateBuilder();
ImdgPredicate query = pb.and(pb.equals("depoAccountId", validatedObject.getDepoAccountId()),
pb.not(pb.equals("id", validatedObject.getId()))
);
Collection<TradingClearingRegistry> existTCR = tcrMap.getCollectionObjectsByPredicate(query);
if (existTCR.isEmpty()) {
return empty();
} else {
String depoAccountValue = Optional
.ofNullable(depoAccount.getAccountId())
.map(accountImdg::getSingleObjectByID)
.map(Account::getAccount)
.orElse("null");
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, depoAccountValue);
}
}
}
@ -177,6 +237,8 @@ public class TradingClearingRegistryValidationConfig {
Consumer<String> addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s));
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry);
addImdg.accept(IMDGDistributedNames.Map_Account);
addImdg.accept(IMDGDistributedNames.Map_DepoAccount);
return new ValidatorImpl<>(context,
IdPresentRule.instance("id",
TradingClearingRegistryUpdateRequest::getId,
@ -190,7 +252,9 @@ public class TradingClearingRegistryValidationConfig {
ServiceStatusDictionary.class,
AccountError.RequiredFieldEmpty,
AccountError.DictionaryNotFound,
false)
false),
new updateTCRDepoCheck()
);
};
}

View file

@ -1,14 +1,30 @@
package ru.spcex.clearing.account.config.validation;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.account.*;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.AccountSymbols;
import ru.clearing.classes.statics.data.account.BankAccount;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.misc.Currency;
import ru.clearing.classes.statics.data.misc.ValidationSymbols;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.platform.dictionary.*;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.clearing.platform.dictionary.AccountTypeDictionary;
import ru.clearing.platform.dictionary.ClearingAccountTypeDictionary;
import ru.clearing.platform.dictionary.CurrencyCodeDictionary;
import ru.clearing.platform.dictionary.ServiceStatusDictionary;
import ru.clearing.platform.dictionary.TradingClearingRegistryTypeDictionary;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.classes.base.SpcexObjectBase;
@ -16,10 +32,6 @@ import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
@Configuration
public class ValidationConfig {
@ -42,6 +54,10 @@ public class ValidationConfig {
addImdg.accept(IMDGDistributedNames.Map_ServiceStatusDictionary, ServiceStatusDictionary.class);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
addImdg.accept(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
addImdg.accept(IMDGDistributedNames.Map_Currency, Currency.class);
addImdg.accept(IMDGDistributedNames.Map_TradingClearingRegistryTypeDictionary, TradingClearingRegistryTypeDictionary.class);
addImdg.accept(IMDGDistributedNames.Map_ValidationSymbols, ValidationSymbols.class);
//for ClientCodeValidationConfig
addImdg.accept(IMDGDistributedNames.Map_ClientCode, ClientCode.class);

View file

@ -23,7 +23,16 @@ public enum AccountError implements IErrorEnumId {
AccountForTradingClearingRegistryAlreadyUsed(5023L),
AccountFieldNotSet(5024L),
AccountDepoTypeRequired(5025L),
AccountIsNotACurrency(5026L), // Счет %S не валютный
CompanyHasNotClearingMemberCategory(5027L),
//ошибки для трансляции в модуль gateway
TCR_NOT_FOUND_GTW(5028L),
ACCOUNT_NOT_FOUND_GTW(5029L),
COMPANY_NOT_FOUND_GTW(5030L),
CurrencyForTradingClearingRegistryListAlreadyUsed(5031L),
BadSymbol(5032L),
TradingClearingRegistryNotFound(3022L),
CurrencyNotFound(1016L),
;
private final Long id;

View file

@ -0,0 +1,28 @@
package ru.spcex.clearing.account.model;
import java.util.List;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.platform.enumeration.Status;
public class ClientCodeBusiness {
private Status code;
private Company company;
private Account moneyAccount;
private Account depoAccount;
private List<Account> currentAccounts;
private TradingClearingRegistry tradingClearingRegistry;
private Status status;
public ClientCodeBusiness(Status code,
Company company, Account moneyAccount, Account depoAccount, List<Account> currentAccounts, TradingClearingRegistry tradingClearingRegistry, Status status) {
this.code = code;
this.company = company;
this.moneyAccount = moneyAccount;
this.depoAccount = depoAccount;
this.currentAccounts = currentAccounts;
this.tradingClearingRegistry = tradingClearingRegistry;
this.status = status;
}
}

View file

@ -0,0 +1,79 @@
package ru.spcex.clearing.account.model;
import java.util.Optional;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
public class TradingClearingRegistryBusiness {
private Company company;
private Account moneyAccount;
private Status status;
private Optional<DepoAccount> depoAccount;
private Optional<TradingClearingRegistryType> tradingClearingRegistryType;
private TradingClearingRegistryBusiness() {
this.depoAccount = Optional.empty();
this.tradingClearingRegistryType = Optional.empty();
}
public static TradingClearingRegistryBusiness builder() {
return new TradingClearingRegistryBusiness();
}
public TradingClearingRegistryBusiness company(Company company) {
this.company = company;
return this;
}
public TradingClearingRegistryBusiness moneyAccount(Account moneyAccount) {
this.moneyAccount = moneyAccount;
return this;
}
public TradingClearingRegistryBusiness depoAccount(DepoAccount depoAccount) {
this.depoAccount = Optional.of(depoAccount);
return this;
}
public TradingClearingRegistryBusiness status(Status status) {
this.status = status;
return this;
}
public TradingClearingRegistryBusiness tradingClearingRegistryType(TradingClearingRegistryType type) {
this.tradingClearingRegistryType = Optional.of(type);
return this;
}
public TradingClearingRegistryBusiness build() {
TradingClearingRegistryBusiness tradingClearingRegistryBusiness = new TradingClearingRegistryBusiness();
tradingClearingRegistryBusiness.company = this.company;
tradingClearingRegistryBusiness.status = this.status;
tradingClearingRegistryBusiness.depoAccount = this.depoAccount;
tradingClearingRegistryBusiness.moneyAccount = this.moneyAccount;
tradingClearingRegistryBusiness.tradingClearingRegistryType = this.tradingClearingRegistryType;
return tradingClearingRegistryBusiness;
}
public Company getCompany() {
return company;
}
public Account getMoneyAccount() {
return moneyAccount;
}
public Optional<DepoAccount> getDepoAccount() {
return depoAccount;
}
public Status getStatus() {
return status;
}
public Optional<TradingClearingRegistryType> getTradingClearingRegistryType() {
return tradingClearingRegistryType;
}
}

View file

@ -0,0 +1,12 @@
package ru.spcex.clearing.account.model;
import java.util.Optional;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidator;
public record ValidationResult(IValidator validator, Optional<EnumMessage> error, Optional<String> errorMsg) {
public boolean isValid() {
return error.isEmpty();
}
}

View file

@ -1,5 +1,10 @@
package ru.spcex.clearing.account.service;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
import java.util.function.Function;
import org.apache.commons.lang3.StringUtils;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
@ -14,6 +19,7 @@ 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.clearing.classes.statics.data.misc.Currency;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
@ -28,22 +34,22 @@ 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.enumeration.AccountType;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.DepoAccountType;
import ru.spcex.platform.enumeration.Sender;
import ru.spcex.platform.enumeration.ServiceStatus;
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.imdg.validation.Stored;
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());
@ -51,6 +57,7 @@ public class AccountService extends QueueConsumer implements InitializingBean {
private final Imdg<Account> accountMap;
private final Imdg<ClearingMemberCategory> clearingMemberCategoryMap;
private final Imdg<Relation> relationMap;
private final Imdg<Currency> currencyMap;
private final KafkaSender kafkaSender;
private final IMessageResolver messageResolver;
private final UserRoleVerification userRoleVerification;
@ -72,22 +79,25 @@ public class AccountService extends QueueConsumer implements InitializingBean {
AccountHelper accountHelper,
InformationAccountService informationAccountService,
@Qualifier("correspondentAccountNewRequestValidator")
Function<CorrespondentAccountNewRequest, IValidator> accountNewRequestValidator,
Function<CorrespondentAccountNewRequest, IValidator> accountNewRequestValidator,
@Qualifier("correspondentAccountUpdateRequestValidator")
Function<CorrespondentAccountUpdateRequest, IValidator> accountUpdateRequestValidator,
Function<CorrespondentAccountUpdateRequest, IValidator> accountUpdateRequestValidator,
@Qualifier("correspondentAccountBlockRequestValidator")
Function<CommonIdRequest, IValidator> accountBlockRequestValidator) {
Function<CommonIdRequest, IValidator> accountBlockRequestValidator) {
super(kafkaQueue, kafkaProducer);
this.accountHelper = accountHelper;
this.imdgProvider = imdgProvider;
this.accountMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_Account, Account.class
IMDGDistributedNames.Map_Account, Account.class
);
this.clearingMemberCategoryMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class
IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class
);
this.relationMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_Relation, Relation.class
IMDGDistributedNames.Map_Relation, Relation.class
);
this.currencyMap = imdgProvider.getImdg(
IMDGDistributedNames.Map_Currency, Currency.class
);
this.kafkaSender = kafkaSender;
this.messageResolver = messageResolver;
@ -103,18 +113,18 @@ public class AccountService extends QueueConsumer implements InitializingBean {
public void afterPropertiesSet() {
imdgProvider.waitAvailable();
callback(CorrespondentAccountNewRequest.class)
.setFunction(this::accountCorrespondentNew)
.forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_NEW, callbacks::put);
.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);
.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);
.setFunction(this::correspondentAccountBlock)
.forDestination(Consts.DESTINATION_CORRESPONDENT_ACCOUNT_BLOCK, callbacks::put);
callback(AccountTerminationRequest.class)
.setFunction(this::accountTerminationForCompany)
.forDestination(Consts.ACCOUNT_TERMINATION, callbacks::put);
.setFunction(this::accountTerminationForCompany)
.forDestination(Consts.ACCOUNT_TERMINATION, callbacks::put);
init();
}
@ -125,22 +135,47 @@ public class AccountService extends QueueConsumer implements InitializingBean {
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, accountNewRequestValidator);
IValidator validator = accountNewRequestValidator.apply(userRequest.getRequestPayload());
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, (r) -> validator);
if (requestInfoUpdate != null) return requestInfoUpdate;
CorrespondentAccountNewRequest req = userRequest.getRequestPayload();
Currency currency = validator.getStored(Stored.currency);
String currencyCode = req.getCurrency() == null ? CurrencyCode.RUB.getKey() : req.getCurrency();
Long currencyCodeId = CurrencyCode.RUB.getKey().equals(currencyCode) ? 810 : currency.getId();
Instant now = Instant.now();
Account account = new Account();
account.setCompanyId(req.getCompanyId());
account.setAccount(req.getAccount());
if (AccountType.Info.equalsByKey(req.getAccountType())) {
Long infoSequenceId = informationAccountService.accountNextId();
String accountValue = informationAccountService.generateInfoAccount(infoSequenceId);
Account anltAccount;
{
ImdgPredicateBuilder pb = accountMap.predicateBuilder();
ImdgPredicate andPredicate = pb.and(
pb.equals("accountType", AccountType.Anlt.getKey()),
pb.equals("currency", currency.getCurrencyCode())
);
Collection<Account> accountsAnlt = accountMap.getCollectionObjectsByPredicate(andPredicate);
if (accountsAnlt.isEmpty()) {
log.warn("Account with {} not exist.", andPredicate);
} else if (accountsAnlt.size() > 1) {
log.warn("Account for companyId 1 and accountType=ANLT contains multiply elements, use first");
}
anltAccount = accountsAnlt.iterator().next();
}
String specialAnltAccId = "7000";
if (anltAccount != null && StringUtils.isNotEmpty(anltAccount.getAccount()) && anltAccount.getAccount().length() >= 4) {
specialAnltAccId = anltAccount.getAccount().substring(anltAccount.getAccount().length() - 4);
}
Long infoSequenceId = informationAccountService.accountNextId(currencyCode, currencyCodeId);
String accountValue = informationAccountService.generateInfoAccount(currencyCodeId, infoSequenceId, specialAnltAccId);
log.trace("New info-account SequenceId={} account={}", infoSequenceId, accountValue);
account.setAccount(accountValue);
}
account.setAccountType(req.getAccountType());
account.setCurrency(currencyCode);
if (req.getStatus() == null) {
account.setStatus(WorkflowStatus.Active.getKey());
log.trace("Status not set in request. Use default: {}", account.getStatus());
@ -197,11 +232,12 @@ public class AccountService extends QueueConsumer implements InitializingBean {
InformationAccount infoAcc = new InformationAccount();
infoAcc.setAccountId(account.getId());
Account firstAccountAntl = accountMap.getFirstObjectByFieldValues(Map.of(
"companyId", Sender.One.getId(),
"accountType", AccountType.Anlt.getKey()
"companyId", Sender.One.getId(),
"accountType", AccountType.Anlt.getKey(),
"currency", account.getCurrency()
));
if (firstAccountAntl == null) {
log.warn("Can not find 1 ANTL account for fill information ClearingAccountId.");
log.warn("Can not find 1 ANTL {} account for fill information ClearingAccountId.", account.getCurrency());
} else {
infoAcc.setClearingAccountId(firstAccountAntl.getId());
}
@ -317,7 +353,7 @@ public class AccountService extends QueueConsumer implements InitializingBean {
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);
userRequest.getId(), Consts.ACCOUNT_TERMINATION_STEP2, reqId);
log.debug("successfully processed, account termination");
return null;
@ -326,9 +362,9 @@ public class AccountService extends QueueConsumer implements InitializingBean {
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);
.setId(reqId)
.setStatus(Status.Error)
.setMessage(errMsg);
}
}

View file

@ -109,6 +109,7 @@ public class BankAccountService extends QueueConsumer implements InitializingBea
account.setStatus(req.getStatus());
}
account.setCompanyId(req.getCompanyId());
account.setCurrency(req.getCurrency());
account.setCreated(now);
account.setUpdated(now);
requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId(), false);
@ -136,6 +137,8 @@ public class BankAccountService extends QueueConsumer implements InitializingBea
bankAccount.setAccount(req.getAccount());
bankAccount.setCompanyId(req.getCompanyId());
bankAccount.setAccountId(accountId);
bankAccount.setSwiftCode(req.getSwiftCode());
bankAccount.setIntermediarySwiftCode(req.getIntermediarySwiftCode());
bankAccountId = bankAccountMap.insert(bankAccount);
txOk = true;
@ -173,9 +176,12 @@ public class BankAccountService extends QueueConsumer implements InitializingBea
bankAccount.setTaxpayerIdentificationNumber(req.getTaxpayerIdentificationNumber());
bankAccount.setTaxRegistrationReasonCode(req.getTaxRegistrationReasonCode());
bankAccount.setAccount(req.getAccount());
bankAccount.setSwiftCode(req.getSwiftCode());
bankAccount.setIntermediarySwiftCode(req.getIntermediarySwiftCode());
Account account = accountMap.getSingleObjectByID(bankAccount.getAccountId());
account.setAccount(req.account);
account.setCurrency(req.getCurrency());
account.setUpdated(Instant.now());
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();

View file

@ -1,5 +1,13 @@
package ru.spcex.clearing.account.service;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import org.apache.commons.lang3.tuple.MutableTriple;
import org.apache.commons.lang3.tuple.Triple;
import org.apache.kafka.clients.consumer.Consumer;
@ -10,14 +18,17 @@ import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.company.ClearingMemberCategory;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.classes.statics.data.misc.Currency;
import ru.clearing.classes.statics.data.misc.Notification;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.sdf.SDf52;
import ru.clearing.platform.dictionary.ClearingAccountTypeDictionary;
import ru.clearing.platform.dictionary.ClearingCategoryDictionary;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -38,7 +49,16 @@ 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.enumeration.AccountStatus;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.ClearingAccountType;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.NotificationStatus;
import ru.spcex.platform.enumeration.ObjectType;
import ru.spcex.platform.enumeration.Priority;
import ru.spcex.platform.enumeration.SdfTable;
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;
@ -46,15 +66,12 @@ 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.IEnumKey;
import ru.spcex.platform.utils.enumeration.IErrorEnumId;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.text.TextUtil;
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 {
@ -70,6 +87,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
private final Function<ClearingAccountUpdateRequest, IValidator> clearingAccountUpdateRequestValidator;
private final Imdg<Account> accountImdg;
private final Imdg<Currency> currImdg;
private final Imdg<ClearingAccount> clearingAccountImdg;
private final Imdg<Company> companyImdg;
private final Imdg<Relation> relationImdg;
@ -77,6 +95,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
private final Imdg<ClearingCategoryDictionary> clearingCategoryImdg;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<Notification> notificationImdg;
private final Imdg<ClearingAccountTypeDictionary> clearingAccountTypeDictionaryImdg;
@Autowired
public ClearingAccountService(Consumer<String, Object> kafkaQueue,
@ -104,6 +123,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
this.clearingAccountUpdateRequestValidator = clearingAccountUpdateRequestValidator;
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.currImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.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);
@ -111,6 +131,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
this.clearingCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingCategoryDictionary, ClearingCategoryDictionary.class);
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.notificationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Notification, Notification.class);
this.clearingAccountTypeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccountTypeDictionary, ClearingAccountTypeDictionary.class);
}
@Override
@ -135,7 +156,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
init();
}
public RequestInfoUpdate clearingAccountNew(BaseRequest<ClearingAccountNewRequest> userRequest) {
public synchronized RequestInfoUpdate clearingAccountNew(BaseRequest<ClearingAccountNewRequest> userRequest) {
RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(
userRequest, clearingAccountNewRequestValidator
);
@ -187,10 +208,14 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
imdgTransaction.rollbackTransaction();
}
}
if (txOk && account != null) {
sendNotificationAccountNewRequest(account);
}
return null;
}
public RequestInfoUpdate clearingAccountUpdate(BaseRequest<ClearingAccountUpdateRequest> userRequest) {
public synchronized RequestInfoUpdate clearingAccountUpdate(BaseRequest<ClearingAccountUpdateRequest> userRequest) {
RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(
userRequest, clearingAccountUpdateRequestValidator
);
@ -237,11 +262,12 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
}
public RequestInfoUpdate accountNewSdf01(BaseRequest<AccountSdf01Request> userRequest) {
public synchronized RequestInfoUpdate accountNewSdf01(BaseRequest<AccountSdf01Request> userRequest) {
log.debug("AccountSdf01Request received, id={}", userRequest.getId());
AccountSdf01Request req = userRequest.getRequestPayload();
List<AccountSdfToStatementRequestPart> accountToStatement = new ArrayList<>();
List<Account> accountsToNotification = new ArrayList<>();
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
boolean txOk = false;
@ -254,10 +280,37 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
for (AccountSdfRequestPart accountReq : req.getAccounts()) {
Instant now = Instant.now();
Account account = new Account();
try {
Long currencyId = Long.valueOf(accountReq.getAccount().substring(5, 8));
String currencyCode = CurrencyCode.RUB.getKey();
if (!currencyId.equals(810L)){
Currency currency = currImdg.getSingleObjectByID(currencyId);
currencyCode = currency != null ? currency.getCurrencyCode() : null;
}
if (currencyCode == null){
throw new IllegalArgumentException("Not found currency by id " + currencyId);
}
account.setCurrency(currencyCode);
} catch (Throwable e) {
AccountSdfToStatementRequestPart responsePart = new AccountSdfToStatementRequestPart();
responsePart.setSdfId(accountReq.getSdfId());
responsePart.setErrorCode(AccountError.DictionaryNotFound.getId()); // see accountService.fillAccountFromRelation
responsePart.setErrorText("couldn't extract currency from '%s' account".formatted(accountReq.getAccount()));
accountToStatement.add(responsePart);
log.info("sdf.id={} companyId={} accountType={} couldn't find currency for account {}",
accountReq.getSdfId(),
accountReq.getCompanyId(),
accountReq.getAccountType(),
accountReq.getAccount());
continue accountsLoop;
}
account.setAccount(accountReq.getAccount());
account.setAccountType(AccountType.Clrn.getKey());
account.setStatus(ServiceStatus.Active.getKey());
account.setCompanyId(accountReq.getCompanyId());
if (TextUtil.isEmpty(account.getCurrency())) {
log.warn("Sdf52: Wrong accountValue=\"{}\" - can not parse for get currency", accountReq.getAccount());
}
account.setCreated(now);
account.setUpdated(now);
RequestInfoUpdate requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequest.getId(), true);
@ -289,6 +342,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
Long accountId = -1L;
ClearingAccount clearingAccount = null;
accountId = accountImdg.insert(account);
accountsToNotification.add(account);
clearingAccount = new ClearingAccount();
clearingAccount.setCompanyId(accountReq.getCompanyId());
@ -317,11 +371,115 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
sendStatementRequestBack(req.getGroupingSdf01Id(), req.getGroupingSdf02Id(), accountToStatement);
if (txOk) {
for (Account account : accountsToNotification)
sendNotificationAccountNewRequest(account);
}
log.debug("successfully processed, grouping id={}, processed number={}", req.getGroupingSdf01Id(), accountToStatement.size());
return null;
}
/**
* Логика похожа на SDF01
*
* @param accountValue account
* @param companyId
* @param userRequestId для лога
* @return
*/
private synchronized Account createSdf52Account(String accountValue, String acctType, Long companyId, Long userRequestId) {
{ // Валидация
boolean existClearingAccountTypeDictionary;
if (!StringUtils.hasText(acctType)) {
existClearingAccountTypeDictionary = false;
} else {
ClearingAccountTypeDictionary catd = clearingAccountTypeDictionaryImdg.getFirstObjectByFieldValues(
Map.of("code", acctType));
existClearingAccountTypeDictionary = catd != null;
}
if (!existClearingAccountTypeDictionary) {
String errMsg = messageResolver.resolve(new EnumMessage(AccountError.DictionaryNotFound, acctType, clearingAccountTypeDictionaryImdg.getMapName()));
log.warn(errMsg);
return null;
}
ClearingMemberCategory companyAnyCMC = clearingMemberCategoryImdg.getFirstObjectByFieldValues(Map.of(
"companyId", companyId
));
if (companyAnyCMC == null) {
String errMsg = messageResolver.resolve(new EnumMessage(AccountError.CompanyHasNotClearingMemberCategory, companyId));
log.warn(errMsg);
}
}
Instant now = Instant.now();
Account account = new Account();
account.setAccount(accountValue);
account.setAccountType(AccountType.Clrn.getKey());
account.setStatus(ServiceStatus.Active.getKey());
if (accountValue.length() >= 7) {
try {
Long currencyId = Long.valueOf(accountValue.substring(5, 8));
String currencyCode = CurrencyCode.RUB.getKey();
if (!currencyId.equals(810L)){
Currency currency = currImdg.getSingleObjectByID(currencyId);
currencyCode = currency != null ? currency.getCurrencyCode() : null;
}
if (currencyCode == null){
throw new IllegalArgumentException("Not found currency by id " + currencyId);
}
account.setCurrency(currencyCode);
} catch (Throwable e) {
log.trace("When obtain currency from accountValue: {}", e.toString());
return null;
}
}
if (TextUtil.isEmpty(account.getCurrency())) {
log.warn("Sdf52: Wrong accountValue=\"{}\" - can not parse for get currency", accountValue);
}
account.setCompanyId(companyId);
account.setCreated(now);
account.setUpdated(now);
RequestInfoUpdate requestInfoUpdate = accountService.fillAccountFromRelation(account, userRequestId, true);
if (requestInfoUpdate != null) {
log.warn("Error fill new account from relation. {}", /*account.getId(),*/ requestInfoUpdate.getMessage());
return null;
}
Account existAccount = accountImdg.getFirstObjectBySQL("account = '%s' and accountType='%s'"
.formatted(accountValue, AccountType.Clrn.getKey()));
if (existAccount != null) {
log.debug("Sdf52: Account {} already exists", accountValue);
if (companyId.equals(existAccount.getCompanyId())) {
return existAccount;
} else {
log.debug("Sdf52: Account {} already exists for other companyId={}, do not apply for companyId={}",
accountValue, existAccount.getCompanyId(), companyId);
return null;
}
}
Long clearingAccountId = -1L;
Long accountId = -1L;
ClearingAccount clearingAccount = null;
accountId = accountImdg.insert(account);
clearingAccount = new ClearingAccount();
clearingAccount.setCompanyId(companyId);
clearingAccount.setAccountId(accountId);
ClearingAccountType caType = IEnumKey.getEnumByKey(ClearingAccountType.class, acctType);
if (caType == null) {
log.warn("Wrong ClearingAccountType=\"{}\" for account \"{}\"", acctType, accountValue);
}
clearingAccount.setClearingAccountType(acctType);
clearingAccountId = clearingAccountImdg.insert(clearingAccount);
log.debug("New account {}, clearingAccount {} was created.", accountId, clearingAccountId);
return account;
}
public RequestInfoUpdate accountUpdateSdf52(BaseRequest<StatementRequest> systemRequest) {
log.debug("accountUpdateSdf52 StatementRequest received, id={}", systemRequest.getId());
@ -365,8 +523,16 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
Account account = sDf52.getAccount() == null ? null : accountImdg.getFirstObjectByFieldValues(accountQuery);
if (account == null) {
if (SDFProcessService.SDF52_STATUS_3Open.equals(sDf52.getStatus())) {
log.debug("By generationId={} s_df52[{}].status={}, but account not found (query: {}). COntinuse with result OK for status 3",
log.trace("By generationId={} s_df52[{}].status={}, account not found (query: {}). Try create new account.",
groupId, sDf52.getId(), sDf52.getStatus(), accountQuery);
account = createSdf52Account(sDf52.getAccount(),sDf52.getAcc_type(), company.getId(), systemRequest.getId());
if (account == null) {
log.info("Can not create account: \"{}\", companyId={}. Ignore SDF52.id={}",
sDf52.getAccount(), company.getId(), sDf52.getId());
// continue;
} else {
sendNotificationAccountNewRequest(account);
}
} else {
String msg = messageResolver.resolve(new EnumMessage(AccountError.AccountNotFound, sDf52.getAccount()));
log.warn("By generationId={} s_df52[{}] (query: {}) error: {}", groupId, sDf52.getId(), accountQuery, msg);
@ -376,7 +542,9 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
}
}
toProcessSDF53.add(new MutableTriple<>(sDf52, account, SDFProcessService.SDF_STATUS_OK));
toUpdate.add(new Pair<>(sDf52, account));
if (account != null) {
toUpdate.add(new Pair<>(sDf52, account));
}
}
}
log.debug("Selected to update {} account's", toUpdate.size());
@ -392,6 +560,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
}
if (newStatus.equalsByKey(account.getStatus())) {
// одинаковых обычно не бывает.
log.trace("In sDF_52[{}] for account [{}] status {} not changed.", sdf.getId(), account.getId(), newStatus);
continue;
}
if (AccountStatus.BLOCKED == newStatus || AccountStatus.CLOSE == newStatus) { // статус 0/2
@ -435,9 +604,9 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
}
}
protected RequestInfoUpdate accountUpdateSdf52_part2(BaseRequest<StatementRequest> systemRequest1,
SDf52 sdf, Account account,
BaseRequest<NotificationFeedbackRequest> secondSystemRequest2) {
protected synchronized RequestInfoUpdate accountUpdateSdf52_part2(BaseRequest<StatementRequest> systemRequest1,
SDf52 sdf, Account account,
BaseRequest<NotificationFeedbackRequest> secondSystemRequest2) {
// 5. from notification:
StatementRequest req = systemRequest1.getRequestPayload();
Long groupId = req.getGroupId();
@ -506,6 +675,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
request.setGroupId(groupingSdf01Id);
request.setChildGenerationId(groupSdf02Id);
request.setAccountCreationResults(results);
request.setFromAccount(true);
request.setContinueSdf(true);
request.setTable(SdfTable.SDF_01); // по нему запрос получили
log.debug("Send message to kafka \"{}\": {}", destination, LogFormatter.toStringWrapper(request));
@ -531,6 +701,24 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
}
/**
* Формирование уведомления о добавлении счёта
*/
public Long sendNotificationAccountNewRequest(Account account) {
String message = String.format("Добавлен новый счет %s", account.getAccount());
final String destination = Consts.NOTIFICATION_NEW;
NotificationNewRequest request = new NotificationNewRequest();
//request.setObjectId(account.getId());
request.setObjectType(ObjectType.rgst.getKey());
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;
@ -607,7 +795,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
}
if (returnTrigger) {
log.debug("Remove from waiting list accountId={} (list groupId={})", accountId, inWaitingLst.getGroupId());
waitingList.remove(inWaitingLst);
waitingList.remove(accountId);
}
if (returnTrigger)
return inWaitingLst;

View file

@ -1,5 +1,14 @@
package ru.spcex.clearing.account.service;
import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.function.Function;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
@ -9,8 +18,11 @@ 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.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -19,13 +31,20 @@ import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgResponse;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
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.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;
@ -39,13 +58,6 @@ import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.log.ExceptionUtils;
import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.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());
@ -54,63 +66,79 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
private final ImdgProvider imdgProvider;
private final Imdg<ClientCode> clientCodeMap;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryMap;
private final Imdg<CompanySymbols> companySymbolsImdg;
private final Imdg<Account> accountImdg;
private final Function<ClientCodeNewRequest, IValidator> clientCodeNewRequestValidator;
private final Function<ClientCodeUpdateRequest, IValidator> clientCodeUpdateRequestValidator;
private final Function<CommonDeleteRequest, IValidator> clientCodeDeleteRequestValidator;
private final Function<TkrAccount, IValidator> tkrAccountsGatewayValidator;
private final ValidationHelper validationHelper;
private final UserRoleVerification userRoleVerification;
private final IMessageResolver messageResolver;
private final RequestHelper requestHelper;
protected TradingClearingRegistryService tradingClearingRegistryService;
protected ConfigurableApplicationContext context;
private final KafkaSender kafkaSender;
//protected TradingClearingRegistryListService tradingClearingRegistryListService;
@Autowired
public ClientCodeService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
KafkaSender kafkaSender,
ImdgProvider imdgProvider,
ValidationHelper validationHelper,
IMessageResolver messageResolver,
RequestHelper requestHelper,
TradingClearingRegistryService tradingClearingRegistryService,
ConfigurableApplicationContext context, //TradingClearingRegistryListService tradingClearingRegistryListService,
UserRoleVerification userRoleVerification,
@Qualifier("clientCodeNewRequestValidator") Function<ClientCodeNewRequest, IValidator> clientCodeNewRequestValidator,
@Qualifier("clientCodeUpdateRequestValidator") Function<ClientCodeUpdateRequest, IValidator> clientCodeUpdateRequestValidator,
@Qualifier("clientCodeDeleteRequestValidator") Function<CommonDeleteRequest, IValidator> clientCodeDeleteRequestValidator) {
@Qualifier("clientCodeDeleteRequestValidator") Function<CommonDeleteRequest, IValidator> clientCodeDeleteRequestValidator,
@Qualifier("tkrAccountsGatewayValidator") Function<TkrAccount, IValidator> tkrAccountsGatewayValidator) {
super(kafkaQueue, kafkaProducer);
this.kafkaProducer = kafkaProducer;
this.kafkaSender = kafkaSender;
this.imdgProvider = imdgProvider;
this.idGenerator = imdgProvider.getImdgIdGenerator();
this.clientCodeMap = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
this.tradingClearingRegistryMap = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.clientCodeNewRequestValidator = clientCodeNewRequestValidator;
this.clientCodeUpdateRequestValidator = clientCodeUpdateRequestValidator;
this.clientCodeDeleteRequestValidator = clientCodeDeleteRequestValidator;
this.tkrAccountsGatewayValidator = tkrAccountsGatewayValidator;
this.validationHelper = validationHelper;
this.requestHelper = requestHelper;
this.messageResolver = messageResolver;
this.userRoleVerification = userRoleVerification;
this.tradingClearingRegistryService = tradingClearingRegistryService;
this.context = context; // TradingClearingRegistryListService
}
@Override
public void afterPropertiesSet() {
imdgProvider.waitAvailable();
// callback(ClientCodeNewRequest.class)
// .setFunction(this::clientCodeNew)
// .forDestination(Consts.DESTINATION_CLIENT_CODE_NEW, callbacks::put);
//note переехало в ClientCodeMessageListener[новая версия сервиса]
// callback(TkrAccountsGatewayRequest.class)
// .setFunction(this::clientCodeNewFromGateway)
// .forDestination(Consts.DESTINATION_CLIENT_CODE_NEW_FROM_GATEWAY, callbacks::put);
callback(ClientCodeNewRequest.class)
.setFunction(this::clientCodeNew)
.forDestination(Consts.DESTINATION_CLIENT_CODE_NEW, callbacks::put);
callback(ClientCodeNewRequest.class)
.setFunction(this::clientCodeNewFromApiUmCompany)
.forDestination(Consts.DESTINATION_CLIENT_CODE_NEW_UM_COMPANY, callbacks::put);
.setFunction(this::clientCodeNewFromApiUmCompany)
.forDestination(Consts.DESTINATION_CLIENT_CODE_NEW_UM_COMPANY, callbacks::put);
callback(ClientCodeUpdateRequest.class)
.setFunction(this::clientCodeUpdate)
.forDestination(Consts.DESTINATION_CLIENT_CODE_UPDATE, callbacks::put);
.setFunction(this::clientCodeUpdate)
.forDestination(Consts.DESTINATION_CLIENT_CODE_UPDATE, callbacks::put);
callback(CommonDeleteRequest.class)
.setFunction(this::clientCodeDelete)
.forDestination(Consts.DESTINATION_CLIENT_CODE_DELETE, callbacks::put);
.setFunction(this::clientCodeDelete)
.forDestination(Consts.DESTINATION_CLIENT_CODE_DELETE, callbacks::put);
init();
}
@ -119,10 +147,11 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
* Проверки
* 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()
* @param moneyAccountId req.getMoneyAccountId()
* @param depoAccountId req.getDepoAccountId()
* @param companyId req.getCompanyId()
* @return
*/
RequestInfoUpdate crossValidate(BaseRequest<?> userRequest, Long moneyAccountId, Long depoAccountId, Long companyId) {
@ -132,8 +161,8 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
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 (tcr == null) {
error = new EnumMessage(AccountError.TradingClearingRegistryNotFound, companyId);
}
}
if (error != null) {
@ -143,7 +172,7 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
return null;
}
protected RequestInfoUpdate clientCodeNew(BaseRequest<ClientCodeNewRequest> userRequest) {
protected RequestInfoUpdate clientCodeNew0(BaseRequest<ClientCodeNewRequest> userRequest, boolean fromTCRList) {
log.debug("ClientCodeNewRequest received {}", userRequest.getId());
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
@ -161,25 +190,67 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
if (doCreateTCR) {
try {
requestInfoUpdate = createAndWaitTCR(userRequest.getId(), null,
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (requestInfoUpdate != null) return requestInfoUpdate;
} catch (Exception e) {
log.error("Can not wait creation of TCR. request id={};CompanyId={}, MoneyAccountId={}, DepoAccountId={}; {}",
userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(),
e.toString());
userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(),
e.toString());
return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage());
}
}
ClientCode newClientCode = buildClientCode(req);
clientCodeMap.insert(newClientCode);
log.debug("successfully processed, new clientCode id {}", newClientCode.getId());
if (req.getCurrencyAccountList() == null || req.getCurrencyAccountList().isEmpty()) {
ClientCode newClientCode = buildClientCode(req);
clientCodeMap.insert(newClientCode);
log.debug("successfully processed, new clientCode id {}", newClientCode.getId());
} else {//fixme transaction!
if (!fromTCRList) {
if (req.getMoneyAccountId() != null /*&& currencyAccountId != null*/) {
// Для каждого счета из списка (currencyAccountList) должна быть создана отдельная запись объекте clientCode с данным счетом для данного клиента
TradingClearingRegistry tcr = selectTradingClearingRegistry(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
TradingClearingRegistryListNewRequest tcrListNewR = new TradingClearingRegistryListNewRequest();
tcrListNewR.setTradingClearingRegistryId(tcr == null ? null : tcr.getId());
tcrListNewR.setCurrencyAccountList(req.getCurrencyAccountList());
tcrListNewR.setStatus(req.getStatus());
TradingClearingRegistryListService tradingClearingRegistryListService = context.getBean(TradingClearingRegistryListService.class);
try {
BaseRequest<TradingClearingRegistryListNewRequest> request2 = new BaseRequest<>();
request2.setId(idGenerator.nextId());
request2.setActionType(ActionType.NEW);
request2.setRequestPayload(tcrListNewR);
requestInfoUpdate = tradingClearingRegistryListService.tradingClearingRegistryListNew0(request2, true);
if (requestInfoUpdate != null) return requestInfoUpdate;
} catch (Exception e) {
log.error("Can not wait creation of tradingClearingRegistryList. request id={}; {}",
userRequest.getId(),
ExceptionUtils.getStackTrace(e));
return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage());
}
}
}
List<Long> newClientCodeIds = new ArrayList<>();
for (Long currencyAccountId : req.getCurrencyAccountList()) {
ClientCode newClientCode = buildClientCode(req);
newClientCode.setCurrencyAccountId(currencyAccountId);
clientCodeMap.insert(newClientCode);
newClientCodeIds.add(newClientCode.getId());
log.trace("ClientCode.id={} for currencyAccountId={} created", newClientCode.getId(), currencyAccountId);
}
log.debug("successfully processed, new clientCode id {}", newClientCodeIds);
}
return null;
}
protected RequestInfoUpdate clientCodeNewFromApiUmCompany(BaseRequest<ClientCodeNewRequest> userRequest) {
return clientCodeNewFromApiUmCompany0(userRequest, false);
}
protected RequestInfoUpdate clientCodeNewFromApiUmCompany0(BaseRequest<ClientCodeNewRequest> userRequest, boolean fromTCRList) {
log.debug("ClientCodeNewRequest (UM_COMPANY) received {}", userRequest.getId());
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
@ -198,19 +269,57 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
if (doCreateTCR) {
try {
requestInfoUpdate = createAndWaitTCR(userRequest.getId(), null,
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (requestInfoUpdate != null) return requestInfoUpdate;
} catch (Exception e) {
log.error("Can not wait creation of TCR. request id={};CompanyId={}, MoneyAccountId={}, DepoAccountId={}; {}",
userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(),
e.toString());
userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(),
e.toString());
return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR at this moment" + e.getMessage());
}
}
ClientCode newClientCode = buildClientCode(req);
clientCodeMap.insert(newClientCode);
log.debug("successfully processed, new clientCode id {}", newClientCode.getId());
if (req.getCurrencyAccountList() == null || req.getCurrencyAccountList().isEmpty()) {
ClientCode newClientCode = buildClientCode(req);
clientCodeMap.insert(newClientCode);
log.debug("successfully processed, new clientCode id {}", newClientCode.getId());
} else {//fixme transaction!
if (!fromTCRList) {
if (req.getMoneyAccountId() != null /*&& currencyAccountId != null*/) {
// Для каждого счета из списка (currencyAccountList) должна быть создана отдельная запись объекте clientCode с данным счетом для данного клиента
TradingClearingRegistry tcr = selectTradingClearingRegistry(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
TradingClearingRegistryListUpdateRequest tcrListUpdateR = new TradingClearingRegistryListUpdateRequest();
tcrListUpdateR.setTradingClearingRegistryId(tcr == null ? null : tcr.getId());
tcrListUpdateR.setCurrencyAccountList(req.getCurrencyAccountList());
TradingClearingRegistryListService tradingClearingRegistryListService = context.getBean(TradingClearingRegistryListService.class);
try {
BaseRequest<TradingClearingRegistryListUpdateRequest> request2 = new BaseRequest<>();
request2.setId(idGenerator.nextId());
request2.setActionType(ActionType.NEW);
request2.setRequestPayload(tcrListUpdateR);
requestInfoUpdate = tradingClearingRegistryListService.tradingClearingRegistryListUpdate0(request2, true);
if (requestInfoUpdate != null) return requestInfoUpdate;
} catch (Exception e) {
log.error("Can not wait creation of tradingClearingRegistryList. request id={}; {}",
userRequest.getId(),
ExceptionUtils.getStackTrace(e));
return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage());
}
}
}
List<Long> newClientCodeIds = new ArrayList<>();
for (Long currencyAccountId : req.getCurrencyAccountList()) {
ClientCode newClientCode = buildClientCode(req);
newClientCode.setCurrencyAccountId(currencyAccountId);
clientCodeMap.insert(newClientCode);
newClientCodeIds.add(newClientCode.getId());
log.trace("ClientCode.id={} for currencyAccountId={} created", newClientCode.getId(), currencyAccountId);
}
log.debug("successfully processed, new clientCode id {}", newClientCodeIds);
}
return null;
}
@ -239,17 +348,18 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
if (doCreateTCR) {
try {
requestInfoUpdate = createAndWaitTCR(userRequest.getId(), clientCode.getId(),
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (requestInfoUpdate != null) return requestInfoUpdate;
} catch (Exception e) {
log.error("Can not wait creation of TCR. request id={};CompanyId={}, MoneyAccountId={}, DepoAccountId={}; {}",
userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(),
e.toString());
userRequest.getId(), req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId(),
e.toString());
return makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage());
}
}
updateClientCode(clientCode, req);
//fixme спросить, у нас при апдейте передаётся clientCode.id которого надо изменять. А тут список currencyAccountList приходит - в нём что будет - только 1 счёт для него и его же менять?
clientCodeMap.update(clientCode);
log.debug("successfully processed update, id {}", clientCode.getId());
@ -283,7 +393,7 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
return null;
}
TradingClearingRegistry selectTradingClearingRegistry(Long companyId, Long moneyAccountId, Long depoAccountId) {
protected TradingClearingRegistry selectTradingClearingRegistry(Long companyId, Long moneyAccountId, Long depoAccountId) {
Map<String, Comparable<?>> query = new HashMap<>();
query.put("companyId", companyId);
query.put("moneyAccountId", moneyAccountId);
@ -292,7 +402,7 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
query.put("depoAccountId", depoAccountId);
}
TradingClearingRegistry result = tradingClearingRegistryMap.getFirstObjectByFieldValues(query);
log.trace("TradingClearingRegistry by: {}; {}found", query, result == null ? "not " : "");
log.trace("TradingClearingRegistry by: {}; {} found", query, result == null ? "not" : "");
return result;
}
@ -310,10 +420,10 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
}
protected RequestInfoUpdate createAndWaitTCR(Long reqId, Long clientCode,
Long companyId, Long moneyAccountId, Long depoAccountId) {
Long companyId, Long moneyAccountId, Long depoAccountId) {
log.debug("For request {}, clientCode={} need create TCR: companyId={}, moneyAccountId={}, depoAccountId={}",
reqId, clientCode == null ? "new" : clientCode,
companyId, moneyAccountId, depoAccountId);
reqId, clientCode == null ? "new" : clientCode,
companyId, moneyAccountId, depoAccountId);
BaseRequest<TradingClearingRegistryNewRequest> request = new BaseRequest<>();
request.setId(idGenerator.nextId());
request.setActionType(ActionType.NEW);
@ -400,7 +510,7 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
TradingClearingRegistry tradingClearingRegistry = selectTradingClearingRegistry(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (tradingClearingRegistry == null) {
log.warn("TCR not found: CompanyId {}, MoneyAccountId {}, DepoAccountId {}",
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
} else {
clientCode.setTradingClearingRegistryId(tradingClearingRegistry.getId());
}
@ -423,7 +533,7 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
TradingClearingRegistry tradingClearingRegistry = selectTradingClearingRegistry(req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
if (tradingClearingRegistry == null) {
log.warn("TCR not found: CompanyId {}, MoneyAccountId {}, DepoAccountId {}",
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
req.getCompanyId(), req.getMoneyAccountId(), req.getDepoAccountId());
} else {
clientCode.setTradingClearingRegistryId(tradingClearingRegistry.getId());
}
@ -437,4 +547,21 @@ public class ClientCodeService extends QueueConsumer implements InitializingBean
clientCode.setUpdated(Instant.now());
}
private Tkr crateErrorTkrToGateway(TkrAccount tkrAccount, Optional<String> errorMsg) {
Tkr tkr = new Tkr();
tkr.setTkrCode(tkrAccount.getTkrCode());
tkr.setClientCode(tkrAccount.getClientCode());
tkr.setCompanyId(tkrAccount.getCompanyId());
tkr.setDepoAccount(tkrAccount.getDepoAccount());
errorMsg.ifPresent(tkr::setErrorMessage);
return tkr;
}
private MoneyAccountMsgResponse convertAccountToResponse(MoneyAccountMsgRequest moneyAccountMsgRequest) {
MoneyAccountMsgResponse msgResponse = new MoneyAccountMsgResponse();
msgResponse.setAccount(moneyAccountMsgRequest.getAccount());
msgResponse.setCurrCode(moneyAccountMsgRequest.getCurrCode());
return msgResponse;
}
}

View file

@ -1,5 +1,9 @@
package ru.spcex.clearing.account.service;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
@ -18,22 +22,24 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountSdf0
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.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.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.*;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.DepoAccountType;
import ru.spcex.platform.enumeration.ObjectType;
import ru.spcex.platform.enumeration.Priority;
import ru.spcex.platform.enumeration.SdfTable;
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.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());
@ -129,6 +135,9 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea
imdgTransaction.rollbackTransaction();
}
}
if (txOk && depoAccount != null) {
sendNotificationAccountNewRequest(account);
}
return null;
}
@ -137,6 +146,7 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea
AccountSdf01Request req = userRequest.getRequestPayload();
List<AccountSdfToStatementRequestPart> accountToStatement = new ArrayList<>();
List<Account> accountsToNotification = new ArrayList<>();
ImdgTransaction imdgTransaction = imdgProvider.newTransaction();
boolean txOk = false;
@ -184,7 +194,8 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea
Long depoAccountId = -1L;
Long accountId = -1L;
accountId = accountImdg.insert(account);
accountId = accountImdg.insert(account);
accountsToNotification.add(account);
DepoAccount depoAccount = new DepoAccount();
depoAccount.setCompanyId(accountReq.getCompanyId());
@ -219,6 +230,11 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea
}
sendStatementRequestBack(req.getGroupingSdf01Id(), req.getGroupingSdf02Id(), accountToStatement);
if (txOk) {
for (Account account : accountsToNotification)
sendNotificationAccountNewRequest(account);
}
log.debug("successfully processed, grouping id={}, processed number={}", req.getGroupingSdf01Id(), accountToStatement.size());
return null;
@ -228,10 +244,28 @@ public class DepoAccountService extends QueueConsumer implements InitializingBea
StatementRequest request = new StatementRequest();
request.setGroupId(groupingSdf01Id);
request.setChildGenerationId(groupingSdf02Id);
request.setContinueSdf(true); //fixme????
request.setContinueSdf(true);
request.setAccountCreationResults(results);
request.setFromAccount(true);
request.setTable(SdfTable.SDF_08); // по нему запрос получили
log.debug("Send message to kafka \"{}\": {}", Consts.STATEMENT_PROCESS, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.STATEMENT_PROCESS, request);
}
/**
* Формирование уведомления о добавлении счёта
*/
public Long sendNotificationAccountNewRequest(Account account) {
String message = String.format("Добавлен новый счет %s", account.getAccount());
final String destination = Consts.NOTIFICATION_NEW;
NotificationNewRequest request = new NotificationNewRequest();
//request.setObjectId(account.getId());
request.setObjectType(ObjectType.rgst.getKey());
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;
}
}

View file

@ -16,7 +16,6 @@ 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;
@ -26,6 +25,7 @@ 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.CurrencyCode;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
@ -40,6 +40,7 @@ import ru.spcex.platform.utils.validation.IValidator;
import java.time.Instant;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Function;
@ -63,7 +64,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali
* Кэш-счётчик сквозных номеров счетов.
* См. accountNextId()
*/
protected AtomicLong infoCounter;
protected Map<String, AtomicLong> infoCounterByCurrency = new HashMap<>();
@Autowired
public InformationAccountService(Consumer<String, Object> kafkaQueue,
@ -76,7 +77,7 @@ public class InformationAccountService extends QueueConsumer implements Initiali
AccountHelper accountHelper,
RequestHelper requestHelper,
@Qualifier("informationAccountNewRequestValidator")
Function<InformationAccountNewRequest, IValidator> infoAccountNewRequestValidator) {
Function<InformationAccountNewRequest, IValidator> infoAccountNewRequestValidator) {
super(kafkaQueue, kafkaResponseQueue);
this.kafkaSender = kafkaSender;
this.messageResolver = messageResolver;
@ -87,21 +88,21 @@ public class InformationAccountService extends QueueConsumer implements Initiali
this.requestHelper = requestHelper;
this.infoAccountNewRequestValidator = infoAccountNewRequestValidator;
this.informationAccountImdg = imdgProvider.getImdg(
IMDGDistributedNames.Map_InformationAccount, InformationAccount.class
IMDGDistributedNames.Map_InformationAccount, InformationAccount.class
);
this.accountImdg = imdgProvider.getImdg(
IMDGDistributedNames.Map_Account, Account.class
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);
.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);
.setFunction(this::informationAccountSystemNew)
.forDestination(Consts.INFORMATION_ACCOUNT_SYSTEM_NEW, callbacks::put);
init();
}
@ -115,15 +116,14 @@ public class InformationAccountService extends QueueConsumer implements Initiali
if (requestInfoUpdate != null) return requestInfoUpdate;
InformationAccountNewRequest req = userRequest.getRequestPayload();
String currency = req.getCurrency() == null ? CurrencyCode.RUB.getKey() : req.getCurrency(); //userRequest.getRequestPayload().getCurrency();
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 accountTypePredicate = accountPredicateBuilder.and(accountPredicateBuilder.equals("accountType", AccountType.Anlt.getKey()),
accountPredicateBuilder.equals("currency", currency));
ImdgPredicate andPredicate = accountPredicateBuilder.and(companyIdPredicate, accountTypePredicate);
Collection<Account> accountsAnlt = accountImdg.getCollectionObjectsByPredicate(andPredicate);
if (accountsAnlt.isEmpty()) {
@ -173,12 +173,12 @@ public class InformationAccountService extends QueueConsumer implements Initiali
if (txOk) {
imdgTransaction.commitTransaction();
log.debug("successfully processed, new information account id {}, new account id {}",
informationAccountId,
accountId);
informationAccountId,
accountId);
} else {
log.debug("failed insert, new information account id {}, new account id {} (if id = -1 then insert is failed)",
informationAccountId,
accountId);
informationAccountId,
accountId);
imdgTransaction.rollbackTransaction();
}
}
@ -198,8 +198,8 @@ public class InformationAccountService extends QueueConsumer implements Initiali
ImdgPredicateBuilder pb = accountImdg.predicateBuilder();
{ // Проверка существования счёта
Collection<Account> accountsAnlt = accountImdg.getCollectionObjectsByFieldValues(Map.of(
"companyId", forCompanyId,
"accountType", AccountType.Info.getKey()
"companyId", forCompanyId,
"accountType", AccountType.Info.getKey()
));
if (!accountsAnlt.isEmpty()) {
String trueMessage = messageResolver.resolve(new EnumMessage(AccountError.InfoAccountAlreadyExist, forCompanyId));
@ -209,16 +209,16 @@ public class InformationAccountService extends QueueConsumer implements Initiali
}
Long newId = informationAccountImdg.nextIDSequenceFor();
Long infoSequenceId = accountNextId(); // требуется последовательность n+1
String accountValue = generateInfoAccount(infoSequenceId);
log.trace("New info-account id={}, sequenceId={}, account={}", newId, infoSequenceId, accountValue);
String currency = userRequest.getRequestPayload().getCurrency();
if (currency == null)
currency = CurrencyCode.RUB.getKey();
Long anltAccountId = null;
Account anltAccount;
{
ImdgPredicate andPredicate = pb.and(
pb.equals("companyId", 1L),
pb.equals("accountType", AccountType.Anlt.getKey())
pb.equals("accountType", AccountType.Anlt.getKey()),
pb.equals("currency", currency)
);
Collection<Account> accountsAnlt = accountImdg.getCollectionObjectsByPredicate(andPredicate);
if (accountsAnlt.isEmpty()) {
@ -227,10 +227,20 @@ public class InformationAccountService extends QueueConsumer implements Initiali
} else if (accountsAnlt.size() > 1) {
log.warn("Account for companyId 1 and accountType=ANLT contains multiply elements, use first");
}
Account anltAccount = accountsAnlt.iterator().next();
anltAccount = accountsAnlt.iterator().next();
anltAccountId = anltAccount.getId();
}
String specialAnltAccId = "7000";
if (anltAccount != null && StringUtils.isNotEmpty(anltAccount.getAccount()) && anltAccount.getAccount().length() >= 4) {
specialAnltAccId = anltAccount.getAccount().substring(anltAccount.getAccount().length() - 4);
}
Long newId = informationAccountImdg.nextIDSequenceFor();
Long infoSequenceId = accountNextId(currency, 810L); // требуется последовательность n+1
String accountValue = generateInfoAccount(810L, infoSequenceId, specialAnltAccId);
log.trace("New info-account id={}, sequenceId={}, account={}", newId, infoSequenceId, accountValue);
Instant now = Instant.now();
Account account = new Account();
account.setAccount(accountValue);
@ -267,12 +277,12 @@ public class InformationAccountService extends QueueConsumer implements Initiali
if (txOk) {
imdgTransaction.commitTransaction();
log.debug("successfully processed, new information account id {}, new account id {}",
informationAccountId,
accountId);
informationAccountId,
accountId);
} else {
log.debug("failed insert, new information account id {}, new account id {} (if id = -1 then insert is failed)",
informationAccountId,
accountId);
informationAccountId,
accountId);
imdgTransaction.rollbackTransaction();
}
}
@ -294,26 +304,45 @@ public class InformationAccountService extends QueueConsumer implements Initiali
kafkaSender.sendRequestToQueue(Consts.CREATE_NOTIFICATION_NCMP, request);
}
public String generateInfoAccount(Long id) {
return "%d%d%08d%d".formatted(39911, 810, id, 7000);
public String generateInfoAccount(Long currencyCodeId, Long id, String specialAnltAccId) {
return "%d%03d%08d%s".formatted(39911, currencyCodeId, id, specialAnltAccId);
}
public synchronized Long accountNextId(String currency) {
return accountNextId(currency, 810L);
}
/**
* Сквозной номер инфо-счетов
*
* @param
* @return infoCounter++
*/
public synchronized Long accountNextId() {
public synchronized Long accountNextId(String currency, Long currencyCodeId) {
String idWithTrailingZero = String.format("%03d", currencyCodeId);
if (currency == null)
currency = CurrencyCode.RUB.getKey(); // default
AtomicLong infoCounter = infoCounterByCurrency.get(currency);
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()));
ImdgPredicateBuilder predicateBuilder = accountImdg.predicateBuilder();
ImdgPredicate currencyPredicate = predicateBuilder.equals("currency", currency);
if (CurrencyCode.RUB.equalsByKey(currency)) {
currencyPredicate = predicateBuilder.or(
currencyPredicate,
predicateBuilder.isNull("currency")
);
}
Collection<Account> allInfoAcc = accountImdg.getCollectionObjectsByPredicate(predicateBuilder.and(
predicateBuilder.equals("accountType", AccountType.Info.getKey()),
currencyPredicate
));
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");
Pattern accPattern = Pattern.compile("39911%s([0-9]{8})\\d{4}".formatted(idWithTrailingZero));
int maxN = 1;
int parsedCount = 0;
String lastAccount = null; // for debug
@ -337,10 +366,11 @@ public class InformationAccountService extends QueueConsumer implements Initiali
}
infoCounter = new AtomicLong(maxN);
log.debug("Parsed {} information accounts ({} pattern match) in map. n={}",
allInfoAcc.size(), parsedCount, infoCounter.get());
allInfoAcc.size(), parsedCount, infoCounter.get());
if (parsedCount == 0 && lastAccount != null)
log.debug("Last unparseable account: {}", lastAccount);
}
infoCounterByCurrency.put(currency, infoCounter);
}
}
return infoCounter.incrementAndGet();

View file

@ -1,33 +1,30 @@
package ru.spcex.clearing.account.service;
import java.time.Instant;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
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 {
@ -80,12 +77,13 @@ public class SDFProcessService {
boolean txOk = false;
imdgTransaction.beginTransaction();
HashSet<String> fileNames = new HashSet<>();
String messageId = String.valueOf(UUID.randomUUID()).replaceAll("-", "");
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);
SDf53 sDf53 = createBy(item.getLeft(), item.getRight(), now, generationId, messageId);
sdf53Imdg.insert(sDf53);
fileNames.add(item.getLeft().getFileName());
}
@ -108,7 +106,7 @@ public class SDFProcessService {
messageStatementToExport53(generationId, fileNameSingle);
}
SDf53 createBy(SDf52 sdf52, String result, Instant now, Long newGenerationId) {
SDf53 createBy(SDf52 sdf52, String result, Instant now, Long newGenerationId, String messageId) {
SDf53 newSdf = new SDf53();
newSdf.setId(idGenerator.nextId());
newSdf.setAccName(sdf52.getAcc_name());
@ -116,9 +114,12 @@ public class SDFProcessService {
newSdf.setDeal(sdf52.getDeal());
newSdf.setDate(sdf52.getDate());
newSdf.setStatus(sdf52.getStatus());
newSdf.setAccType(sdf52.getAcc_type());
newSdf.setResult(result);
newSdf.setGenerationTime(now);
newSdf.setGenerationId(sdf52.getGenerationId());
newSdf.setMessageId(messageId);
newSdf.setParentId(sdf52.getMessageId());
if (!Objects.equals(newGenerationId, newSdf.getGenerationId())) { // never
log.warn("Different GenerationId={} for sdf53[{}] and GenerationId={} for group of sdf52",
newSdf.getGenerationId(), newSdf.getId(), newGenerationId

View file

@ -0,0 +1,317 @@
package ru.spcex.clearing.account.service;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
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.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListUpdateRequest;
import ru.spcex.clearing.platform.messaging.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.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.log.ExceptionUtils;
import ru.spcex.platform.utils.validation.IValidator;
@Service
public class TradingClearingRegistryListService extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ValidationHelper validationHelper;
private final UserRoleVerification userRoleVerification;
protected ClientCodeService clientCodeService;
private final ImdgProvider imdgProvider;
private final Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg;
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<TradingClearingRegistryListUpdateRequest, IValidator> tradingClearingRegistryListUpdateRequestValidator;
private final RequestHelper requestHelper;
private final Function<TradingClearingRegistryListNewRequest, IValidator> tradingClearingRegistryListNewRequestValidator;
// private final Function<CommonIdRequest, IValidator> tradingClearingRegistryListBlockRequestValidator;
private final IMessageResolver messageResolver;
private final Producer<String, Object> kafkaProducer;
private final KafkaSender kafkaSender;
public TradingClearingRegistryListService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
KafkaSender kafkaSender,
ImdgProvider imdgProvider,
ClientCodeService clientCodeService,
ValidationHelper validationHelper,
UserRoleVerification userRoleVerification,
IMessageResolver messageResolver,
RequestHelper requestHelper,
@Qualifier("tradingClearingRegistryListNewRequestValidator")
Function<TradingClearingRegistryListNewRequest, IValidator> tradingClearingRegistryListNewRequestValidator,
@Qualifier("tradingClearingRegistryListUpdateRequestValidator")
Function<TradingClearingRegistryListUpdateRequest, IValidator> tradingClearingRegistryListUpdateRequestValidator
) {
super(kafkaQueue, kafkaProducer);
this.kafkaProducer = kafkaProducer;
this.kafkaSender = kafkaSender;
this.validationHelper = validationHelper;
this.userRoleVerification = userRoleVerification;
this.requestHelper = requestHelper;
this.imdgProvider = imdgProvider;
this.tradingClearingRegistryListImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
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.tradingClearingRegistryListNewRequestValidator = tradingClearingRegistryListNewRequestValidator;
this.tradingClearingRegistryListUpdateRequestValidator = tradingClearingRegistryListUpdateRequestValidator;
// this.tradingClearingRegistryListBlockRequestValidator = tradingClearingRegistryListBlockRequestValidator;
this.messageResolver = messageResolver;
this.clientCodeService = clientCodeService;
}
@Override
public void afterPropertiesSet() throws Exception {
imdgProvider.waitAvailable();
callback(TradingClearingRegistryListNewRequest.class)
.setFunction(this::tradingClearingRegistryListNew)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRIES_LIST_NEW, callbacks::put);
callback(TradingClearingRegistryListUpdateRequest.class)
.setFunction(this::tradingClearingRegistryListUpdate)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRIES_LIST_UPDATE, callbacks::put);
init();
}
public RequestInfoUpdate tradingClearingRegistryListNew(BaseRequest<TradingClearingRegistryListNewRequest> userRequest) {
return tradingClearingRegistryListNew1(userRequest, false);
}
@Deprecated
protected RequestInfoUpdate tradingClearingRegistryListNew0(BaseRequest<TradingClearingRegistryListNewRequest> userRequest, boolean innerCall) {
// fixme объединить с путом а то лист может быть пустой. и чистить...
log.debug("TradingClearingRegistryListNewRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) {
return requestInfoUpdate;
}
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, tradingClearingRegistryListNewRequestValidator);
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(userRequest
.getRequestPayload()
.getTradingClearingRegistryId());
if (requestInfoUpdate != null) {
return requestInfoUpdate;
}
TradingClearingRegistryListNewRequest req = userRequest.getRequestPayload();
Instant now = Instant.now();
List<Long> newIds=new ArrayList<>();
for (Long currAccId: req.getCurrencyAccountList()) {
Long id = tradingClearingRegistryListImdg.nextIDSequenceFor();
TradingClearingRegistryList tradingClearingRegistryList = new TradingClearingRegistryList();
tradingClearingRegistryList.setId(id);
tradingClearingRegistryList.setCreated(now);
tradingClearingRegistryList.setUpdated(now);
tradingClearingRegistryList.setTradingClearingRegistryId(req.getTradingClearingRegistryId());
tradingClearingRegistryList.setAccountId(currAccId);
Account account = accountImdg.getSingleObjectByID(currAccId);
tradingClearingRegistryList.setCurrency(account.getCurrency());
if (req.getStatus() == null) {
tradingClearingRegistryList.setStatus(ServiceStatus.Active.getKey());
log.trace("TCRList status in request not set. Use default: {}", tradingClearingRegistryList.getStatus());
} else {
tradingClearingRegistryList.setStatus(req.getStatus());
}
tradingClearingRegistryListImdg.insert(tradingClearingRegistryList);
newIds.add(id);
}
log.info("New TCRList.id={} has created.", newIds);
if (!innerCall) {
// Для каждого счета из списка (currencyAccountList) должна быть создана отдельная запись объекте clientCode с данным счетом для данного клиента, т.е. у одного клиента может быть несколько валютных счетов.
try {
ClientCodeNewRequest cCodeReq = new ClientCodeNewRequest();
cCodeReq.setTradingClearingRegistryId(req.getTradingClearingRegistryId());
cCodeReq.setDepoAccountId(tcr.getDepoAccountId());
cCodeReq.setMoneyAccountId(tcr.getMoneyAccountId());
cCodeReq.setCompanyId(tcr.getCompanyId());
cCodeReq.setCurrencyAccountList(req.getCurrencyAccountList());
cCodeReq.setStatus(req.getStatus());
//todo cCodeReq.setCode();
BaseRequest<ClientCodeNewRequest> request2 = new BaseRequest<>();
request2.setRequestPayload(cCodeReq);
requestInfoUpdate = clientCodeService.clientCodeNew0(request2, true);
if (requestInfoUpdate != null) return requestInfoUpdate;
} catch (Exception e) {
log.error("Can not wait creation of tradingClearingRegistryList. request id={}; {}",
userRequest.getId(),
ExceptionUtils.getStackTrace(e));
return requestHelper.makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage());
}
}
sendNotificationToClearingSvc(newIds, tcr);
log.debug("successfully processed, id {}", newIds);
return null;
}
protected RequestInfoUpdate tradingClearingRegistryListNew1(BaseRequest<TradingClearingRegistryListNewRequest> userRequest, boolean innerCall) {
log.debug("TradingClearingRegistryListNewRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) {
return requestInfoUpdate;
}
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, tradingClearingRegistryListNewRequestValidator);
if (requestInfoUpdate != null) {
return requestInfoUpdate;
}
TradingClearingRegistryListNewRequest req = userRequest.getRequestPayload();
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(req.getTradingClearingRegistryId());
Account account = accountImdg.getSingleObjectByID(req.getAccountId());
Instant now = Instant.now();
Long id = tradingClearingRegistryListImdg.nextIDSequenceFor();
TradingClearingRegistryList tradingClearingRegistryList = new TradingClearingRegistryList();
tradingClearingRegistryList.setId(id);
tradingClearingRegistryList.setCreated(now);
tradingClearingRegistryList.setUpdated(now);
tradingClearingRegistryList.setTradingClearingRegistryId(req.getTradingClearingRegistryId());
tradingClearingRegistryList.setAccountId(req.getAccountId());
tradingClearingRegistryList.setCurrency(account.getCurrency());
if (req.getStatus() == null) {
tradingClearingRegistryList.setStatus(ServiceStatus.Active.getKey());
log.trace("TCRList status in request not set. Use default: {}", tradingClearingRegistryList.getStatus());
} else {
tradingClearingRegistryList.setStatus(req.getStatus());
}
tradingClearingRegistryListImdg.insert(tradingClearingRegistryList);
log.info("New TCRList.id={} has created.", id);
if (!innerCall) {
// Для каждого счета из списка (currencyAccountList) должна быть создана отдельная запись объекте clientCode с данным счетом для данного клиента, т.е. у одного клиента может быть несколько валютных счетов.
// try {
// TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(req.getTradingClearingRegistryId());
// ClientCodeNewRequest cCodeReq = new ClientCodeNewRequest();
// cCodeReq.setTradingClearingRegistryId(req.getTradingClearingRegistryId());
// cCodeReq.setDepoAccountId(tcr.getDepoAccountId());
// cCodeReq.setMoneyAccountId(tcr.getMoneyAccountId());
// cCodeReq.setCompanyId(tcr.getCompanyId());
// cCodeReq.setCurrencyAccountList(Arrays.asList(req.getAccountId())); // todo rewrite API
// cCodeReq.setStatus(tradingClearingRegistryList.getStatus());
// //todo cCodeReq.setCode();
// BaseRequest<ClientCodeNewRequest> request2 = new BaseRequest<>();
// request2.setRequestPayload(cCodeReq);
// requestInfoUpdate = clientCodeService.clientCodeNew0(request2, true);
// if (requestInfoUpdate != null) return requestInfoUpdate;
// } catch (Exception e) {
// log.error("Can not wait creation of tradingClearingRegistryList. request id={}; {}",
// userRequest.getId(),
// ExceptionUtils.getStackTrace(e));
// return requestHelper.makeErrorResponse(userRequest, AccountError.GeneralError, "Can not create TCR: " + e.getMessage());
// }
}
sendNotificationToClearingSvc(id, tcr);
log.debug("successfully processed, id {}", id);
return null;
}
public RequestInfoUpdate tradingClearingRegistryListUpdate(BaseRequest<TradingClearingRegistryListUpdateRequest> userRequest) {
return tradingClearingRegistryListUpdate0(userRequest, false);
}
public RequestInfoUpdate tradingClearingRegistryListUpdate0(BaseRequest<TradingClearingRegistryListUpdateRequest> userRequest, boolean innerCall) {
log.debug("TradingClearingRegistryListUpdateRequest received");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, tradingClearingRegistryListUpdateRequestValidator);
if (requestInfoUpdate != null) return requestInfoUpdate;
TradingClearingRegistryListUpdateRequest req = userRequest.getRequestPayload();
TradingClearingRegistryList tradingClearingRegistryList = tradingClearingRegistryListImdg.getSingleObjectByID(req.getId());
if (req.getStatus() != null && !Objects.equals(req.getStatus(), tradingClearingRegistryList.getStatus())) {
Instant now = Instant.now();
tradingClearingRegistryList.setUpdated(now);
tradingClearingRegistryList.setStatus(req.getStatus());
tradingClearingRegistryListImdg.update(tradingClearingRegistryList);
log.debug("Update TCRList.id={}.", tradingClearingRegistryList.getId());
} else {
log.debug("Nothing to update TCRList.id={}.", tradingClearingRegistryList.getId());
}
//todo нужно ли слать уведомления sendNotificationToClearingSvc?
log.debug("successfully processed, id {}", tradingClearingRegistryList.getId());
return null;
}
@Deprecated
protected void sendNotificationToClearingSvc(List<Long> tradingClearingRegistries, TradingClearingRegistry tcr) {
for (Long tradingClearingRegistryId:tradingClearingRegistries)
sendNotificationToClearingSvc(tradingClearingRegistryId, tcr);
}
/**
* clearing-service сообщение на открытие клиринговых регистров;
*/
protected void sendNotificationToClearingSvc(Long tradingClearingRegistryId, TradingClearingRegistry tcr) {
CreateRegistryRequest request = new CreateRegistryRequest();
request.setTcrListId(tradingClearingRegistryId);
request.setCompanyId(tcr.getCompanyId());
request.setTradingClearingRegistryId(tcr.getId());
log.debug("Send message to kafka \"{}\": {}", Consts.REGISTRY_NEW, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.REGISTRY_NEW, request);
}
}

View file

@ -1,5 +1,13 @@
package ru.spcex.clearing.account.service;
import java.time.Instant;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
@ -7,23 +15,35 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.AccountSymbols;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.account.InformationAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.company.relation.Relation;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.account.config.settings.AccountServiceSettings;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccountsGatewayRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonIdRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgResponse;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SendTkrRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.NotificationRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
@ -31,7 +51,12 @@ import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.clearing.util.services.RequestHelper;
import ru.spcex.clearing.validation.common.ValidationHelper;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.Status;
import static ru.spcex.platform.enumeration.Task.makeFiles_MTCR;
import ru.spcex.platform.enumeration.TradingClearingRegistryPurpose;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.imdg.api.Imdg;
@ -40,10 +65,6 @@ 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());
@ -53,12 +74,16 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
private final ImdgProvider imdgProvider;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg;
private final Imdg<DepoAccount> depoAccountImdg;
private final Imdg<ClearingAccount> clearingAccountImdg;
private final Imdg<InformationAccount> informationAccountImdg;
private final Imdg<Account> accountImdg;
private final Imdg<AccountSymbols> accountSymbolsImdg;
private final Imdg<Company> companyImdg;
private final Imdg<CompanySymbols> companySymbolsImdg;
private final Imdg<Relation> relationImdg;
private final Imdg<ClientCode> clientCodeImdg;
private final Function<TradingClearingRegistryUpdateRequest, IValidator> tradingClearingRegistryUpdateRequestValidator;
private final RequestHelper requestHelper;
@ -69,6 +94,7 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
private final IMessageResolver messageResolver;
private final Producer<String, Object> kafkaProducer;
private final KafkaSender kafkaSender;
private final AccountServiceSettings accountServiceSettings;
public TradingClearingRegistryService(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
@ -79,11 +105,11 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
IMessageResolver messageResolver,
RequestHelper requestHelper,
@Qualifier("tradingClearingRegistryNewRequest")
Function<TradingClearingRegistryNewRequest, IValidator> tradingClearingRegistryNewRequestValidator,
Function<TradingClearingRegistryNewRequest, IValidator> tradingClearingRegistryNewRequestValidator,
@Qualifier("tradingClearingRegistryUpdateRequest")
Function<TradingClearingRegistryUpdateRequest, IValidator> tradingClearingRegistryUpdateRequestValidator,
Function<TradingClearingRegistryUpdateRequest, IValidator> tradingClearingRegistryUpdateRequestValidator,
@Qualifier("tradingClearingRegistryBlockRequest")
Function<CommonIdRequest, IValidator> tradingClearingRegistryBlockRequestValidator) {
Function<CommonIdRequest, IValidator> tradingClearingRegistryBlockRequestValidator, AccountServiceSettings accountServiceSettings) {
super(kafkaQueue, kafkaProducer);
this.kafkaProducer = kafkaProducer;
this.kafkaSender = kafkaSender;
@ -92,34 +118,45 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
this.requestHelper = requestHelper;
this.imdgProvider = imdgProvider;
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
this.tradingClearingRegistryListImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
this.depoAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
this.informationAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_InformationAccount, InformationAccount.class);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.accountSymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class);
this.relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class);
this.clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
this.companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
this.tradingClearingRegistryNewRequestValidator = tradingClearingRegistryNewRequestValidator;
this.tradingClearingRegistryAutoNewRequestValidator = tradingClearingRegistryNewRequestValidator; // без relation.
this.tradingClearingRegistryUpdateRequestValidator = tradingClearingRegistryUpdateRequestValidator;
this.tradingClearingRegistryBlockRequestValidator = tradingClearingRegistryBlockRequestValidator;
this.messageResolver = messageResolver;
this.accountServiceSettings = accountServiceSettings;
}
@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);
.setFunction(this::tradingClearingRegistryAutoNew)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_AUTO_NEW, callbacks::put);
callback(TradingClearingRegistryNewRequest.class)
.setFunction(this::tradingClearingRegistryNew)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_NEW, callbacks::put);
.setFunction(this::tradingClearingRegistryNew)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_NEW, callbacks::put);
callback(TradingClearingRegistryUpdateRequest.class)
.setFunction(this::tradingClearingRegistryUpdate)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE, callbacks::put);
.setFunction(this::tradingClearingRegistryUpdate)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_UPDATE, callbacks::put);
callback(CommonIdRequest.class)
.setFunction(this::tradingClearingRegistryBlock)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_BLOCK, callbacks::put);
.setFunction(this::tradingClearingRegistryBlock)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_BLOCK, callbacks::put);
callback(TkrAccountsGatewayRequest.class)
.setFunction(this::tradingClearingRegistryCheck)
.forDestination(Consts.DESTINATION_TRADING_CLEARING_REGISTRY_CHECK, callbacks::put);
callback(LauncherCommandRequest.class)
.setConsumer(this::sendAllTkrToGateway)
.forDestination(makeFiles_MTCR.topic(), callbacks::put);
init();
}
@ -159,10 +196,10 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
TradingClearingRegistry registryByCompany = tradingClearingRegistryImdg.getFirstObjectByFieldValues(Map.of("companyId", req.getCompanyId()));
if (registryByCompany == null) {
log.trace("Not found registry with companyId={}",
req.getCompanyId());
req.getCompanyId());
return requestHelper.makeErrorResponse(userRequest,
AccountError.TradingClearingRegistryNotFound,
req.getCompanyId());
AccountError.TradingClearingRegistryNotFound,
req.getCompanyId());
}
}
@ -207,6 +244,12 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
targetExistTradingClearingRegistry.setUpdated(Instant.now());
tradingClearingRegistryImdg.update(targetExistTradingClearingRegistry);
log.debug("successfully processed, id {}. Updated exist TradingClearingRegistry.id={}", id, targetExistTradingClearingRegistry.getId());
Optional<Tkr> tkr = createRequestToGateway(tradingClearingRegistry);
if (tkr.isPresent()) {
SendTkrRequest sendTkrRequest = new SendTkrRequest();
sendTkrRequest.getTkrs().add(tkr.get());
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
}
return null;
}
}
@ -237,17 +280,20 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
tradingClearingRegistry.setStatus(status);
String tradingRegistryType;
if (depoAccount != null) {
tradingRegistryType = depoAccount.getDepoAccountType();
if (req.getTradingClearingRegistryType() != null) {
tradingRegistryType = req.getTradingClearingRegistryType();
} else {
if (clearingAccount != null) tradingRegistryType = clearingAccount.getClearingAccountType();
else tradingRegistryType = TradingClearingRegistryType.Owner_A.getKey();
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;
TradingClearingRegistryPurpose registryPurpose = TradingClearingRegistryPurpose.C;
//http://jira.mfd.msk:8088/browse/CLS-631#comment-60200
tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey());
Company company = companyImdg.getSingleObjectByID(req.getCompanyId());
@ -290,8 +336,8 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
TradingClearingRegistry registryByCompany = tradingClearingRegistryImdg.getFirstObjectByFieldValues(Map.of("companyId", req.getCompanyId()));
if (registryByCompany == null) {
return requestHelper.makeErrorResponse(userRequest,
AccountError.TradingClearingRegistryNotFound,
"companyId=" + req.getCompanyId());
AccountError.TradingClearingRegistryNotFound,
"companyId=" + req.getCompanyId());
}
}
@ -324,9 +370,8 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
}
tradingClearingRegistry.setTradingClearingRegistryType(tradingRegistryType);
TradingClearingRegistryPurpose registryPurpose;
if (req.getDepoAccountId() != null) registryPurpose = TradingClearingRegistryPurpose.C;
else registryPurpose = TradingClearingRegistryPurpose.M;
//http://jira.mfd.msk:8088/browse/CLS-631#comment-60200
TradingClearingRegistryPurpose registryPurpose = TradingClearingRegistryPurpose.C;
tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey());
Company company = companyImdg.getSingleObjectByID(req.getCompanyId());
@ -341,6 +386,12 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
log.info("New TCR.id={} was created.", tradingClearingRegistry.getId());
Optional<Tkr> tkr = createRequestToGateway(tradingClearingRegistry);
if (tkr.isPresent()) {
SendTkrRequest sendTkrRequest = new SendTkrRequest();
sendTkrRequest.getTkrs().add(tkr.get());
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
}
sendNotificationToReportSvc(tradingClearingRegistry);
sendNotificationToClearingSvc(tradingClearingRegistry);
@ -352,11 +403,11 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
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)
)
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);
@ -394,14 +445,16 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
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 += registryPurpose.getKey(); // C / M / ...
code += "C";//пока ставим всегда С, возможно придется откатить
String registryUnit = accountServiceSettings.getApp() != null ? accountServiceSettings.getApp().getRegistryUnit() : "T";
String trType = tradingRegistryType + registryUnit; // 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 имволов
return code; // 12 символов
}
public RequestInfoUpdate tradingClearingRegistryUpdate(BaseRequest<TradingClearingRegistryUpdateRequest> userRequest) {
@ -419,18 +472,30 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
if (req.getMoneyAccountId() != null && !req.getMoneyAccountId().equals(tradingClearingRegistry.getMoneyAccountId())) {
return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, "MoneyAccountId", req.getMoneyAccountId());
}
if (req.getDepoAccountId() != null && !req.getDepoAccountId().equals(tradingClearingRegistry.getDepoAccountId())) {
return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, "DepoAccountId", req.getDepoAccountId());
if (tradingClearingRegistry.getDepoAccountId() != null) {
if (req.getDepoAccountId() == null) {
return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, "DepoAccountId", req.getDepoAccountId());
} else 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())) {
if (req.getStatus() != null && !Objects.equals(req.getStatus(), tradingClearingRegistry.getStatus())
|| req.getDepoAccountId() != null && !req.getDepoAccountId().equals(tradingClearingRegistry.getDepoAccountId())
) {
Instant now = Instant.now();
tradingClearingRegistry.setUpdated(now);
tradingClearingRegistry.setStatus(req.getStatus());
tradingClearingRegistry.setDepoAccountId(req.getDepoAccountId());
tradingClearingRegistryImdg.update(tradingClearingRegistry);
Optional<Tkr> tkr = createRequestToGateway(tradingClearingRegistry);
if (tkr.isPresent()) {
SendTkrRequest sendTkrRequest = new SendTkrRequest();
sendTkrRequest.getTkrs().add(tkr.get());
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
}
sendNotificationToClearingSvc(tradingClearingRegistry);
log.debug("Update TCR.id={}.", tradingClearingRegistry.getId());
} else {
log.debug("Nothing to update TCR.id={}.", tradingClearingRegistry.getId());
@ -460,6 +525,127 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
return null;
}
public RequestInfoUpdate tradingClearingRegistryCheck(BaseRequest<TkrAccountsGatewayRequest> gatewayRequest) {
TkrAccountsGatewayRequest req = gatewayRequest.getRequestPayload();
log.debug("TradingClearingRegistryCheckRequest received with requestId : {}", req.getRequestId());
for (TkrAccount accountForCheck : req.getAccounts()) {
log.debug("Checking TKR with code: {}", accountForCheck.getTkrCode());
TradingClearingRegistry tradingClearingRegistry = tradingClearingRegistryImdg.getSingleObjectByFieldValues(
Map.of("code", accountForCheck.getTkrCode())
);
Optional<Tkr> tkr = createRequestToGateway(tradingClearingRegistry);
if (tkr.isPresent()) {
SendTkrRequest sendTkrRequest = new SendTkrRequest();
sendTkrRequest.getTkrs().add(tkr.get());
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
}
}
return null;
}
public RequestInfoUpdate sendAllTkrToGateway(BaseRequest<?> gatewayRequest) {
Collection<TradingClearingRegistry> tkrs = tradingClearingRegistryImdg.getAllValues();
SendTkrRequest sendTkrRequest = new SendTkrRequest();
for (TradingClearingRegistry tkr : tkrs) {
log.debug("Create TKR request with id: {}", tkr.getId());
Optional<Tkr> tkrRequest = createRequestToGateway(tkr);
tkrRequest.ifPresent(value -> sendTkrRequest.getTkrs().add(value));
}
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
return null;
}
private Optional<Tkr> createRequestToGateway(TradingClearingRegistry tradingClearingRegistry) {
if (tradingClearingRegistry != null) {
Tkr tkr = new Tkr();
log.debug("Found TKR with id: {} and code: {}", tradingClearingRegistry.getId(), tradingClearingRegistry.getCode());
Company company = companyImdg.getSingleObjectByID(tradingClearingRegistry.getCompanyId());
CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(
Map.of(
"companySymbol", CompanySymbol.UUID.getKey(),
"companyId", company.getId()
)
);
if (companySymbols == null) {
log.warn("CompanySymbols is null, searched by company.id: {}, skip this tkr", company.getId());
return Optional.empty();
}
ClientCode clientCode = clientCodeImdg.getFirstObjectByFieldValues(
Map.of("tradingClearingRegistryId", tradingClearingRegistry.getId())
);
tkr.setCompanyId(companySymbols.getCompanySymbolValue());
tkr.setTradingCode(Long.valueOf(company.getTradingCode()));
tkr.setTkrCode(tradingClearingRegistry.getCode());
tkr.setTkrType(tradingClearingRegistry.getTradingClearingRegistryPurpose());
tkr.setActive(Status.Active.equalsByKey(tradingClearingRegistry.getStatus()));
String accountType;
if (clientCode == null) {
if (TradingClearingRegistryType.Client_B.equalsByKey(
tradingClearingRegistry.getTradingClearingRegistryType())) {
accountType = "Клиентский общий";
} else {
accountType = "Общий";
}
} else {
tkr.setClientCode(clientCode.getCode());
accountType = "Клиентский обособленный";
}
tkr.setAccountTypeName(accountType);
if (tradingClearingRegistry.getDepoAccountId() != null) {
AccountSymbols depoAccountSymbol = accountSymbolsImdg.getFirstObjectByFieldValues(
Map.of("accountId", tradingClearingRegistry.getDepoAccountId())
);
if (depoAccountSymbol != null) {
tkr.setDepoAccount(depoAccountSymbol.getAccountSymbolValue());
}
}
{
if (tradingClearingRegistry.getMoneyAccountId() != null) {
Account moneyAccount = accountImdg.getSingleObjectByID(tradingClearingRegistry.getMoneyAccountId());
MoneyAccountMsgResponse moneyAccountMsg = new MoneyAccountMsgResponse();
moneyAccountMsg.setAccount(moneyAccount.getAccount());
moneyAccountMsg.setCurrCode(StringUtils.hasText(moneyAccount.getCurrency()) ? moneyAccount.getCurrency() : "RUB");
getEksAccount(moneyAccount).ifPresent(moneyAccountMsg::setEksAccount);
moneyAccountMsg.setActive(Status.Active.equalsByKey(moneyAccount.getStatus()));
tkr.getMoneyAccounts().add(moneyAccountMsg);
}
}
{
Collection<TradingClearingRegistryList> tradingClearingRegistries = tradingClearingRegistryListImdg.getCollectionObjectsByFieldValues(
Map.of(
"tradingClearingRegistryId", tradingClearingRegistry.getId()
)
);
for (TradingClearingRegistryList tkrList : tradingClearingRegistries) {
Account additionalAcc = accountImdg.getSingleObjectByID(tkrList.getAccountId());
MoneyAccountMsgResponse moneyAccountMsg = new MoneyAccountMsgResponse();
moneyAccountMsg.setAccount(additionalAcc.getAccount());
getEksAccount(additionalAcc).ifPresent(moneyAccountMsg::setEksAccount);
moneyAccountMsg.setCurrCode(StringUtils.hasText(additionalAcc.getCurrency()) ? additionalAcc.getCurrency() : "RUB");
moneyAccountMsg.setActive(Status.Active.equalsByKey(additionalAcc.getStatus()));
tkr.getMoneyAccounts().add(moneyAccountMsg);
}
}
return Optional.of(tkr);
}
return Optional.empty();
}
private Optional<String> getEksAccount(Account account) {
if (AccountType.Info.equalsByKey(account.getAccountType())) {
String currency = StringUtils.hasText(account.getCurrency()) ? account.getCurrency() : CurrencyCode.RUB.getKey();
Account anltAcc = accountImdg.getFirstObjectByFieldValues(
Map.of(
"currency", currency,
"accountType", AccountType.Anlt.getKey()
)
);
if (anltAcc != null) {
return Optional.of(anltAcc.getAccount());
}
}
return Optional.empty();
}
/**
* company-service сообщение об успешном добавлении ТКР клиента с параметром tradingClearingRegistry.code

View file

@ -0,0 +1,130 @@
package ru.spcex.clearing.account.service.v2;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgResponse;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Service
public class GatewayRequestCreator {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImdgProvider imdgProvider;
public GatewayRequestCreator(ImdgProvider imdgProvider) {
this.imdgProvider = imdgProvider;
}
public Tkr crateErrorTkrToGateway(TkrAccount tkrAccount, Optional<String> errorMsg) {
Tkr tkr = new Tkr();
tkr.setTkrCode(tkrAccount.getTkrCode());
tkr.setClientCode(tkrAccount.getClientCode());
tkr.setCompanyId(tkrAccount.getCompanyId());
tkr.setDepoAccount(tkrAccount.getDepoAccount());
tkr.setMoneyAccounts(tkrAccount.getMoneyAccounts()
.stream()
.map(this::convertAccountToResponse)
.collect(Collectors.toList()));
errorMsg.ifPresent(tkr::setErrorMessage);
return tkr;
}
public Tkr createTkrGatewayReq(TradingClearingRegistry tradingClearingRegistry) {
Tkr tkr = new Tkr();
log.debug("Found TKR with id: {} and code: {}", tradingClearingRegistry.getId(), tradingClearingRegistry.getCode());
Imdg<Company> companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
Imdg<CompanySymbols> companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
Imdg<ClientCode> clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
Imdg<Account> accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg = imdgProvider.
getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
Company company = companyImdg.getSingleObjectByID(tradingClearingRegistry.getCompanyId());
CompanySymbols companySymbols = companySymbolsImdg.getSingleObjectByFieldValues(
Map.of(
"companySymbol", CompanySymbol.UUID.getKey(),
"companyId", company.getId()
)
);
ClientCode clientCode = clientCodeImdg.getFirstObjectByFieldValues(
Map.of("tradingClearingRegistryId", tradingClearingRegistry.getId())
);
tkr.setCompanyId(companySymbols.getCompanySymbolValue());
tkr.setTradingCode(Long.valueOf(company.getTradingCode()));
tkr.setTkrCode(tradingClearingRegistry.getCode());
tkr.setTkrType(tradingClearingRegistry.getTradingClearingRegistryPurpose());
tkr.setActive(Status.Active.equalsByKey(tradingClearingRegistry.getStatus()));
String accountType;
if (clientCode == null) {
if (TradingClearingRegistryType.Client_B.equalsByKey(
tradingClearingRegistry.getTradingClearingRegistryType())) {
accountType = "Клиентский общий";
} else {
accountType = "Общий";
}
} else {
tkr.setClientCode(clientCode.getCode());
accountType = "Клиентский обособленный";
}
tkr.setAccountTypeName(accountType);
if (tradingClearingRegistry.getDepoAccountId() != null) {
Account depoAccount = accountImdg.getSingleObjectByID(tradingClearingRegistry.getDepoAccountId());
if (depoAccount != null) {
tkr.setDepoAccount(depoAccount.getAccount());
}
}
{
if (tradingClearingRegistry.getMoneyAccountId() != null) {
Account moneyAccount = accountImdg.getSingleObjectByID(tradingClearingRegistry.getMoneyAccountId());
MoneyAccountMsgResponse moneyAccountMsg = new MoneyAccountMsgResponse();
moneyAccountMsg.setAccount(moneyAccount.getAccount());
moneyAccountMsg.setCurrCode(StringUtils.hasText(moneyAccount.getCurrency()) ? moneyAccount.getCurrency() : "RUB");
moneyAccountMsg.setActive(Status.Active.equalsByKey(moneyAccount.getStatus()));
tkr.getMoneyAccounts().add(moneyAccountMsg);
}
}
{
Collection<TradingClearingRegistryList> tradingClearingRegistries = tradingClearingRegistryListImdg.getCollectionObjectsByFieldValues(
Map.of(
"tradingClearingRegistryId", tradingClearingRegistry.getId()
)
);
for (TradingClearingRegistryList tkrList : tradingClearingRegistries) {
Account additionalAcc = accountImdg.getSingleObjectByID(tkrList.getAccountId());
MoneyAccountMsgResponse moneyAccountMsg = new MoneyAccountMsgResponse();
moneyAccountMsg.setAccount(additionalAcc.getAccount());
moneyAccountMsg.setCurrCode(StringUtils.hasText(additionalAcc.getCurrency()) ? additionalAcc.getCurrency() : "RUB");
moneyAccountMsg.setActive(Status.Active.equalsByKey(additionalAcc.getStatus()));
tkr.getMoneyAccounts().add(moneyAccountMsg);
}
}
return tkr;
}
private MoneyAccountMsgResponse convertAccountToResponse(MoneyAccountMsgRequest moneyAccountMsgRequest) {
MoneyAccountMsgResponse msgResponse = new MoneyAccountMsgResponse();
msgResponse.setAccount(moneyAccountMsgRequest.getAccount());
msgResponse.setCurrCode(moneyAccountMsgRequest.getCurrCode());
return msgResponse;
}
}

View file

@ -0,0 +1,122 @@
package ru.spcex.clearing.account.service.v2.facade;
import java.time.Instant;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.ClientCode;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
import ru.spcex.platform.classes.base.interfaces.IClearingFacade;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgId;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.validation.IValidator;
@Service
public class ClientCodeFacade implements IClearingFacade {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImdgId idGenerator;
private final ImdgProvider imdgProvider;
private final Imdg<ClientCode> clientCodeImdg;
private final TradingClearingRegistryFacade tradingClearingRegistryFacade;
private final TradingClearingRegistryListFacade tradingClearingRegistryListFacade;
public ClientCodeFacade(ImdgProvider imdgProvider,
TradingClearingRegistryFacade tradingClearingRegistryFacade, TradingClearingRegistryListFacade tradingClearingRegistryListFacade) {
this.idGenerator = imdgProvider.getImdgIdGenerator();
this.imdgProvider = imdgProvider;
this.clientCodeImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
this.tradingClearingRegistryFacade = tradingClearingRegistryFacade;
this.tradingClearingRegistryListFacade = tradingClearingRegistryListFacade;
}
/**
* Создает clientCode, TCR и опционально TCRList, если указаны валюты.
*/
public void createClientCode(ClientCodeNewRequest request, IValidator validator) {
log.trace("Start process creating new client code");
TradingClearingRegistry tradingClearingRegistry;
{
log.debug("Trading Clearing Registry is not exist, creating...");
TradingClearingRegistryNewRequest creationTcrRequest = new TradingClearingRegistryNewRequest();
creationTcrRequest.setCompanyId(request.getCompanyId());
creationTcrRequest.setMoneyAccountId(request.getMoneyAccountId());
creationTcrRequest.setDepoAccountId(request.getDepoAccountId());
creationTcrRequest.setTradingClearingRegistryType(TradingClearingRegistryType.Client_B.getKey());
tradingClearingRegistry = tradingClearingRegistryFacade.createTradingClearingRegistry(creationTcrRequest, null);
}
{
if (request.getCurrencyAccountList() != null && !request.getCurrencyAccountList().isEmpty()) {
TradingClearingRegistryListNewRequest tcrListNew = new TradingClearingRegistryListNewRequest();
tcrListNew.setTradingClearingRegistryId(tradingClearingRegistry.getId());
tcrListNew.setCurrencyAccountList(request.getCurrencyAccountList());
List<Long> tkrListIds = tradingClearingRegistryListFacade.createTradingClearingRegistryList(tcrListNew, null);
}
}
{
ClientCode clientCode = new ClientCode();
clientCode.setCreated(Instant.now());
clientCode.setUpdated(clientCode.getCreated());
clientCode.setCompanyId(request.getCompanyId());
clientCode.setCode(request.getCode());
clientCode.setMoneyAccountId(request.getMoneyAccountId());
clientCode.setDepoAccountId(request.getDepoAccountId());
clientCode.setStatus(request.getStatus());
clientCodeImdg.insert(clientCode);
log.debug("successfully processed, new clientCode id {}", clientCode.getId());
}
}
// public void createClientCode(ClientCodeBusiness businessRequest) {
// log.trace("Start process creating new client code");
// TradingClearingRegistry tradingClearingRegistry;
// {
// log.debug("Trading Clearing Registry is not exist, creating...");
// TradingClearingRegistryBusiness creationTcrRequest = new TradingClearingRegistryBusiness();
// creationTcrRequest.setCompanyId(request.getCompanyId());
// creationTcrRequest.setMoneyAccountId(request.getMoneyAccountId());
// creationTcrRequest.setDepoAccountId(request.getDepoAccountId());
// creationTcrRequest.setTradingClearingRegistryType(TradingClearingRegistryType.Client_B.getKey());
// tradingClearingRegistry = tradingClearingRegistryFacade.createTradingClearingRegistry(creationTcrRequest, null);
// }
// {
// if (request.getCurrencyAccountList() != null && !request.getCurrencyAccountList().isEmpty()) {
// TradingClearingRegistryListNewRequest tcrListNew = new TradingClearingRegistryListNewRequest();
// tcrListNew.setTradingClearingRegistryId(tradingClearingRegistry.getId());
// tcrListNew.setCurrencyAccountList(request.getCurrencyAccountList());
// List<Long> tkrListIds = tradingClearingRegistryListFacade.createTradingClearingRegistryList(tcrListNew, null);
// }
// }
//
// {
// ClientCode clientCode = new ClientCode();
// clientCode.setCreated(Instant.now());
// clientCode.setUpdated(clientCode.getCreated());
//
// clientCode.setCompanyId(request.getCompanyId());
// clientCode.setCode(request.getCode());
// clientCode.setMoneyAccountId(request.getMoneyAccountId());
// clientCode.setDepoAccountId(request.getDepoAccountId());
// clientCode.setStatus(request.getStatus());
// clientCodeImdg.insert(clientCode);
// log.debug("successfully processed, new clientCode id {}", clientCode.getId());
// }
// }
public void lock() {
// tradingClearingRegistryFacade.lock()
// tradingClearingRegistryListFacade.lock()
}
public void unlock() {
// tradingClearingRegistryFacade.lock()
// tradingClearingRegistryListFacade.lock()
}
}

View file

@ -0,0 +1,248 @@
package ru.spcex.clearing.account.service.v2.facade;
import java.time.Instant;
import java.util.Collection;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.ClearingAccount;
import ru.clearing.classes.statics.data.account.DepoAccount;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.account.model.TradingClearingRegistryBusiness;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.reports.NotificationRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.TradingClearingRegistryPurpose;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.validation.IValidator;
@Service
public class TradingClearingRegistryFacade {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImdgProvider imdgProvider;
private final KafkaSender kafkaSender;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<DepoAccount> depoAccountImdg;
private final Imdg<ClearingAccount> clearingAccountImdg;
private final Imdg<Company> companyImdg;
public TradingClearingRegistryFacade(ImdgProvider imdgProvider,
KafkaSender kafkaSender) {
this.imdgProvider = imdgProvider;
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry,
TradingClearingRegistry.class);
this.depoAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class);
this.clearingAccountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingAccount, ClearingAccount.class);
this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.kafkaSender = kafkaSender;
}
public TradingClearingRegistry createTradingClearingRegistry(TradingClearingRegistryNewRequest request,
IValidator validator) {
Long id = tradingClearingRegistryImdg.nextIDSequenceFor();
TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry();
tradingClearingRegistry.setId(id);
tradingClearingRegistry.setCompanyId(request.getCompanyId());
tradingClearingRegistry.setMoneyAccountId(request.getMoneyAccountId());
tradingClearingRegistry.setDepoAccountId(request.getDepoAccountId());
DepoAccount depoAccount = request.getDepoAccountId() != null ?
depoAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", request.getDepoAccountId())) : null;
ClearingAccount clearingAccount = request.getMoneyAccountId() != null ?
clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", request.getMoneyAccountId())) : null;
if (request.getStatus() == null) {
tradingClearingRegistry.setStatus(ServiceStatus.Active.getKey());
log.trace("TCR status in request not set. Use default: {}", tradingClearingRegistry.getStatus());
} else {
tradingClearingRegistry.setStatus(request.getStatus());
log.trace("TCR status in request set: {}", tradingClearingRegistry.getStatus());
}
String tradingRegistryType;
if (request.getTradingClearingRegistryType() != null) {
tradingRegistryType = request.getTradingClearingRegistryType();
} else if (depoAccount != null) {
tradingRegistryType = depoAccount.getDepoAccountType();
} else {
if (clearingAccount != null) tradingRegistryType = clearingAccount.getClearingAccountType();
else tradingRegistryType = TradingClearingRegistryType.Owner_A.getKey();
}
tradingClearingRegistry.setTradingClearingRegistryType(tradingRegistryType);
//http://jira.mfd.msk:8088/browse/CLS-631#comment-60200
TradingClearingRegistryPurpose registryPurpose = TradingClearingRegistryPurpose.C;
tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey());
Company company = companyImdg.getSingleObjectByID(request.getCompanyId());
Long seqId = companySequenceNextId(request.getCompanyId(), registryPurpose, tradingRegistryType);
String code = makeCode(company.getClearingCode(), registryPurpose, tradingRegistryType, seqId);
log.debug("For new TCR.id={} of companyId={} next sequence={}; code={}", id, request.getCompanyId(), seqId, code);
tradingClearingRegistry.setCode(code);
Instant now = Instant.now();
tradingClearingRegistry.setCreated(now);
tradingClearingRegistry.setUpdated(now);
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
log.info("New TCR.id={} was created.", tradingClearingRegistry.getId());
sendNotificationToReportSvc(tradingClearingRegistry);
sendNotificationToClearingSvc(tradingClearingRegistry);
log.debug("successfully processed, id {}", id);
return tradingClearingRegistry;
}
public TradingClearingRegistry createTradingClearingRegistry(TradingClearingRegistryBusiness businessRequest) {
Long id = tradingClearingRegistryImdg.nextIDSequenceFor();
TradingClearingRegistry tradingClearingRegistry = new TradingClearingRegistry();
tradingClearingRegistry.setId(id);
tradingClearingRegistry.setCompanyId(businessRequest.getCompany().getId());
tradingClearingRegistry.setMoneyAccountId(businessRequest.getMoneyAccount().getId());
businessRequest.getDepoAccount().ifPresent(depoAccount ->
tradingClearingRegistry.setDepoAccountId(depoAccount.getId()));
;
if (businessRequest.getTradingClearingRegistryType().isEmpty()){
if (businessRequest.getDepoAccount().isPresent()){
}
}
// ClearingAccount clearingAccount = request.getMoneyAccountId() != null ?
// clearingAccountImdg.getFirstObjectByFieldValues(Map.of("accountId", request.getMoneyAccountId())) : null;
//
// if (request.getStatus() == null) {
// tradingClearingRegistry.setStatus(ServiceStatus.Active.getKey());
// log.trace("TCR status in request not set. Use default: {}", tradingClearingRegistry.getStatus());
// } else {
// tradingClearingRegistry.setStatus(request.getStatus());
// log.trace("TCR status in request set: {}", tradingClearingRegistry.getStatus());
// }
//
// String tradingRegistryType;
// if (request.getTradingClearingRegistryType() != null) {
// tradingRegistryType = request.getTradingClearingRegistryType();
// } else if (depoAccount != null) {
// tradingRegistryType = depoAccount.getDepoAccountType();
// } else {
// if (clearingAccount != null) tradingRegistryType = clearingAccount.getClearingAccountType();
// else tradingRegistryType = TradingClearingRegistryType.Owner_A.getKey();
// }
// tradingClearingRegistry.setTradingClearingRegistryType(tradingRegistryType);
//http://jira.mfd.msk:8088/browse/CLS-631#comment-60200
TradingClearingRegistryPurpose registryPurpose = TradingClearingRegistryPurpose.C;
tradingClearingRegistry.setTradingClearingRegistryPurpose(registryPurpose.getKey());
Company company = businessRequest.getCompany();
// Long seqId = companySequenceNextId(company.getId(), registryPurpose, tradingRegistryType);
// String code = makeCode(company.getClearingCode(), registryPurpose, tradingRegistryType, seqId);
// log.debug("For new TCR.id={} of companyId={} next sequence={}; code={}", id, company.getId(), seqId, code);
// tradingClearingRegistry.setCode(code);
Instant now = Instant.now();
tradingClearingRegistry.setCreated(now);
tradingClearingRegistry.setUpdated(now);
tradingClearingRegistryImdg.insert(tradingClearingRegistry);
log.info("New TCR.id={} was created.", tradingClearingRegistry.getId());
sendNotificationToReportSvc(tradingClearingRegistry);
sendNotificationToClearingSvc(tradingClearingRegistry);
log.debug("successfully processed, id {}", id);
return tradingClearingRegistry;
}
private Long companySequenceNextId(Long companyId,
TradingClearingRegistryPurpose registryPurpose,
String tradingRegistryType) {
Imdg<TradingClearingRegistry> tradingClearingRegistryImdg = imdgProvider.getImdg(
IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class
);
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;
}
private Long parseCodeSeqId(String code) {
if (code == null || code.isBlank())
return null;
try {
String toParse = code.trim();
if (toParse.length() > 5)
toParse = toParse.substring(toParse.length() - 5);
return Long.parseLong(toParse);
} catch (NumberFormatException nan) {
log.warn("Can not parse number from TCR code \"{}\": {}", code, nan.getMessage());
}
return null;
}
private String makeCode(String companyClearingCode,
TradingClearingRegistryPurpose registryPurpose,
String tradingRegistryType,
Long id) {
String code;
code = companyClearingCode;
if (code.length() > 4)
code = code.substring(code.length() - 4);
code = "%4s".formatted(code).replace(' ', '0');
// code += registryPurpose.getKey(); // C / M / ...
code += "C";//пока ставим всегда С, возможно придется откатить
String trType = tradingRegistryType + "T"; // 2 символа
code += trType;
String sId = "%5s".formatted(id).replace(' ', '0');
if (sId.length() > 5)
sId = sId.substring(sId.length() - 5);
code += sId;
return code; // 12 символов
}
private void sendNotificationToClearingSvc(TradingClearingRegistry tradingClearingRegistry) {
CreateRegistryRequest request = new CreateRegistryRequest();
request.setCompanyId(tradingClearingRegistry.getCompanyId());
request.setTradingClearingRegistryId(tradingClearingRegistry.getId());
log.debug("Send message to kafka \"{}\": {}", Consts.REGISTRY_NEW, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.REGISTRY_NEW, request);
}
/**
* report-service сообщение на формирование уведомления о создании нового ТКР
*/
private void sendNotificationToReportSvc(TradingClearingRegistry tradingClearingRegistry) {
NotificationRequest request = new NotificationRequest();
request.setConsumerId(tradingClearingRegistry.getCompanyId());
log.debug("Send message to kafka \"{}\": {}", Consts.CREATE_NOTIFICATION_NTCR, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.CREATE_NOTIFICATION_NTCR, request);
}
}

View file

@ -0,0 +1,87 @@
package ru.spcex.clearing.account.service.v2.facade;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest;
import ru.spcex.clearing.platform.messaging.serialization.LogFormatter;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
@Service
public class TradingClearingRegistryListFacade {
private final Logger log = LoggerFactory.getLogger(getClass());
private final ImdgProvider imdgProvider;
private final KafkaSender kafkaSender;
private final Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
private final Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg;
private final Imdg<Account> accountImdg;
public TradingClearingRegistryListFacade(ImdgProvider imdgProvider,
KafkaSender kafkaSender) {
this.imdgProvider = imdgProvider;
this.tradingClearingRegistryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry,
TradingClearingRegistry.class);
this.tradingClearingRegistryListImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList,
TradingClearingRegistryList.class);
this.accountImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Account, Account.class);
this.kafkaSender = kafkaSender;
}
public static class Stored {
TradingClearingRegistry tcr;
Account account;
}
public List<Long> createTradingClearingRegistryList(TradingClearingRegistryListNewRequest request,
Stored stored) {
TradingClearingRegistry tcr = tradingClearingRegistryImdg.getSingleObjectByID(request.getTradingClearingRegistryId());
Instant now = Instant.now();
List<Long> newIds = new ArrayList<>();
for (Long currAccId : request.getCurrencyAccountList()) {
Long id = tradingClearingRegistryListImdg.nextIDSequenceFor();
TradingClearingRegistryList tradingClearingRegistryList = new TradingClearingRegistryList();
tradingClearingRegistryList.setId(id);
tradingClearingRegistryList.setCreated(now);
tradingClearingRegistryList.setUpdated(now);
tradingClearingRegistryList.setTradingClearingRegistryId(tcr.getId());
tradingClearingRegistryList.setAccountId(currAccId);
Account account = accountImdg.getSingleObjectByID(currAccId);
tradingClearingRegistryList.setCurrency(account.getCurrency());
if (request.getStatus() == null) {
tradingClearingRegistryList.setStatus(ServiceStatus.Active.getKey());
log.trace("TCRList status in request not set. Use default: {}", tradingClearingRegistryList.getStatus());
} else {
tradingClearingRegistryList.setStatus(request.getStatus());
}
tradingClearingRegistryListImdg.insert(tradingClearingRegistryList);
newIds.add(id);
}
log.info("New TCRList.id={} has created.", newIds);
newIds.forEach(listId -> sendNotificationToClearingSvc(listId, tcr));
return newIds;
}
private void sendNotificationToClearingSvc(Long tradingClearingRegistryId, TradingClearingRegistry tcr) {
CreateRegistryRequest request = new CreateRegistryRequest();
request.setTcrListId(tradingClearingRegistryId);
request.setCompanyId(tcr.getCompanyId());
request.setTradingClearingRegistryId(tcr.getId());
log.debug("Send message to kafka \"{}\": {}", Consts.REGISTRY_NEW, LogFormatter.toStringWrapper(request));
kafkaSender.sendRequestToQueue(Consts.REGISTRY_NEW, request);
}
}

View file

@ -0,0 +1,191 @@
package ru.spcex.clearing.account.service.v2.listeners;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.producer.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.spcex.clearing.account.model.ValidationResult;
import ru.spcex.clearing.account.service.v2.GatewayRequestCreator;
import ru.spcex.clearing.account.service.v2.facade.ClientCodeFacade;
import ru.spcex.clearing.account.service.v2.validators.ClientCodeValidator;
import ru.spcex.clearing.account.validation.ClientCodeStoreObjects;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccountsGatewayRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.SendTkrRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.Tkr;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
import ru.spcex.clearing.platform.messaging.service.Status;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.utils.validation.IValidator;
@Service
public class ClientCodeMessageListener extends QueueConsumer implements InitializingBean {
private final Logger log = LoggerFactory.getLogger(getClass());
private final KafkaSender kafkaSender;
private final ImdgProvider imdgProvider;
private final ClientCodeFacade clientCodeFacade;
private final ClientCodeValidator clientCodeValidator;
private final GatewayRequestCreator gatewayRequestCreator;
private final UserRoleVerification userRoleVerification;
public ClientCodeMessageListener(Consumer<String, Object> kafkaQueue,
Producer<String, Object> kafkaProducer,
KafkaSender kafkaSender,
ImdgProvider imdgProvider,
ClientCodeFacade clientCodeFacade,
ClientCodeValidator clientCodeValidator,
GatewayRequestCreator gatewayRequestCreator,
UserRoleVerification userRoleVerification) {
super(kafkaQueue, kafkaProducer);
this.kafkaSender = kafkaSender;
this.imdgProvider = imdgProvider;
this.clientCodeFacade = clientCodeFacade;
this.clientCodeValidator = clientCodeValidator;
this.gatewayRequestCreator = gatewayRequestCreator;
this.userRoleVerification = userRoleVerification;
}
@Override
public void afterPropertiesSet() {
imdgProvider.waitAvailable();
//from backend-api requests
callback(ClientCodeNewRequest.class)
.setFunction(this::clientCodeNewFromBackend)
.forDestination(Consts.DESTINATION_CLIENT_CODE_NEW, callbacks::put);
//from gateway requests
callback(TkrAccountsGatewayRequest.class)
.setFunction(this::clientCodeNewFromGateway)
.forDestination(Consts.DESTINATION_CLIENT_CODE_NEW_FROM_GATEWAY, callbacks::put);
callback(TkrAccountsGatewayRequest.class)
.setFunction(this::clientCodeNewFromGateway)
.forDestination(Consts.DESTINATION_CLIENT_CODE_UPDATE_FROM_GATEWAY, callbacks::put);
init();
}
private RequestInfoUpdate clientCodeNewFromGateway(BaseRequest<TkrAccountsGatewayRequest> tkrRequest) {
clientCodeFacade.lock();
//валидация запроса
TkrAccountsGatewayRequest gatewayRequest = tkrRequest.getRequestPayload();
SendTkrRequest sendTkrRequest = new SendTkrRequest();
sendTkrRequest.setRequestId(gatewayRequest.getRequestId());
boolean isAnyoneInvalid = false;
Map<TkrAccount, ValidationResult> accountsAfterValidation = new HashMap<>();
for (TkrAccount tkrAccount : gatewayRequest.getAccounts()) {
ValidationResult validationResult = clientCodeValidator.checkGatewayRequest(tkrAccount);
if (!validationResult.isValid()) {
log.debug("Validation failed for tkr.client_code {}", tkrAccount.getClientCode());
isAnyoneInvalid = true;
}
accountsAfterValidation.put(tkrAccount, validationResult);
}
if (isAnyoneInvalid) {
log.debug("Create error request to gateway service");
List<Tkr> tkrs = accountsAfterValidation.entrySet()
.stream()
.map(tkrAccountValidationResultEntry ->
gatewayRequestCreator.crateErrorTkrToGateway(
tkrAccountValidationResultEntry.getKey(),
tkrAccountValidationResultEntry.getValue().errorMsg()
))
.toList();
sendTkrRequest.setTkrs(tkrs);
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
return null;
}
//unwrap запроса
for (Map.Entry<TkrAccount, ValidationResult> entry : accountsAfterValidation.entrySet()) {
ClientCodeNewRequest clientCodeNewRequest = new ClientCodeNewRequest();
TkrAccount tkrAccount = entry.getKey();
ValidationResult validationResult = entry.getValue();
log.debug("Creating new clientCode by tkr account: {}", tkrAccount.getClientCode());
IValidator validator = validationResult.validator();
Company company = validator.getStored(ClientCodeStoreObjects.COMPANY);
Optional<Account> depoAccount = validator.getStored(ClientCodeStoreObjects.DEPO_ACCOUNT);
Long depoAccountId = depoAccount.map(Account::getId).orElse(null);
Map<String, Account> accountByCurrency = validator.getStored(ClientCodeStoreObjects.MAPPED_TO_CURRENCY_ACCOUNTS);
clientCodeNewRequest.setCompanyId(company.getId());
clientCodeNewRequest.setCode(tkrAccount.getClientCode());
clientCodeNewRequest.setDepoAccountId(depoAccountId);
Account moneyAccount = accountByCurrency.get(CurrencyCode.RUB.getKey());
clientCodeNewRequest.setMoneyAccountId(moneyAccount.getId());
List<Long> foreignCurrencyList = accountByCurrency.entrySet()
.stream()
.filter(currencyCodeAccountEntry -> !CurrencyCode.RUB.equalsByKey(currencyCodeAccountEntry.getKey()))
.map(currencyCodeAccountEntry -> currencyCodeAccountEntry.getValue().getId())
.toList();
clientCodeNewRequest.setCurrencyAccountList(foreignCurrencyList);
clientCodeFacade.createClientCode(clientCodeNewRequest, validator);
TradingClearingRegistry tradingClearingRegistry = selectTradingClearingRegistry(company.getId(),
moneyAccount.getId(), depoAccountId);
sendTkrRequest.getTkrs().add(gatewayRequestCreator.createTkrGatewayReq(tradingClearingRegistry));
log.debug("Success created new clientCode by tkr account: {}", tkrAccount.getClientCode());
}
kafkaSender.sendRequestToQueue(Consts.ACCOUNTS_TO_GATEWAY, sendTkrRequest);
return null;
}
private RequestInfoUpdate clientCodeNewFromBackend(BaseRequest<ClientCodeNewRequest> clientCodeNewRequest) {
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(clientCodeNewRequest);
if (requestInfoUpdate != null) return requestInfoUpdate;
ClientCodeNewRequest request = clientCodeNewRequest.getRequestPayload();
ValidationResult validationResult = clientCodeValidator.checkBackendNewRequest(request);
if (!validationResult.isValid()) {
return makeErrorResponse(clientCodeNewRequest, validationResult);
}
clientCodeFacade.createClientCode(request, validationResult.validator());
return null;
}
private RequestInfoUpdate makeErrorResponse(BaseRequest<ClientCodeNewRequest> clientCodeNewRequest,
ValidationResult validationResult) {
RequestInfoUpdate requestInfoUpdate = new RequestInfoUpdate();
requestInfoUpdate.setId(clientCodeNewRequest.getId());
requestInfoUpdate.setStatus(Status.Error);
validationResult.errorMsg().ifPresent(requestInfoUpdate::setMessage);
return requestInfoUpdate;
}
private TradingClearingRegistry selectTradingClearingRegistry(Long companyId, Long moneyAccountId, Long depoAccountId) {
Map<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);
}
Imdg<TradingClearingRegistry> tradingClearingRegistryImdg = imdgProvider
.getImdg(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
TradingClearingRegistry result = tradingClearingRegistryImdg.getFirstObjectByFieldValues(query);
log.trace("TradingClearingRegistry by: {}; {} found", query, result == null ? "not" : "");
return result;
}
}

View file

@ -0,0 +1,58 @@
package ru.spcex.clearing.account.service.v2.validators;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.spcex.clearing.account.model.ValidationResult;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
import ru.spcex.clearing.util.security.UserRoleVerification;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IMessageResolver;
import ru.spcex.platform.utils.validation.IValidator;
@Service
public class ClientCodeValidator {
private final Logger log = LoggerFactory.getLogger(getClass());
private final UserRoleVerification userRoleVerification;
private final Function<ClientCodeNewRequest, IValidator> clientCodeNewRequestValidator;
private final Function<ClientCodeUpdateRequest, IValidator> clientCodeUpdateRequestValidator;
private final Function<CommonDeleteRequest, IValidator> clientCodeDeleteRequestValidator;
private final Function<TkrAccount, IValidator> tkrAccountsGatewayValidator;
private final IMessageResolver messageResolver;
public ClientCodeValidator(UserRoleVerification userRoleVerification,
Function<ClientCodeNewRequest, IValidator> clientCodeNewRequestValidator,
Function<ClientCodeUpdateRequest, IValidator> clientCodeUpdateRequestValidator,
Function<CommonDeleteRequest, IValidator> clientCodeDeleteRequestValidator,
Function<TkrAccount, IValidator> tkrAccountsGatewayValidator,
IMessageResolver messageResolver) {
this.userRoleVerification = userRoleVerification;
this.clientCodeNewRequestValidator = clientCodeNewRequestValidator;
this.clientCodeUpdateRequestValidator = clientCodeUpdateRequestValidator;
this.clientCodeDeleteRequestValidator = clientCodeDeleteRequestValidator;
this.tkrAccountsGatewayValidator = tkrAccountsGatewayValidator;
this.messageResolver = messageResolver;
}
public ValidationResult checkGatewayRequest(TkrAccount gatewayAccountRequest) {
return standardValidation(tkrAccountsGatewayValidator, gatewayAccountRequest);
}
public ValidationResult checkBackendNewRequest(ClientCodeNewRequest clientCodeNewRequest) {
return standardValidation(clientCodeNewRequestValidator, clientCodeNewRequest);
}
private <T> ValidationResult standardValidation(Function<T, IValidator> requestValidator, T request) {
IValidator validator = requestValidator.apply(request);
Optional<EnumMessage> error = validator.tillFirstError();
AtomicReference<Optional<String>> errorMsg = new AtomicReference<>();
error.ifPresent(err -> errorMsg.set(Optional.of(messageResolver.resolve(err))));
return new ValidationResult(validator, error, errorMsg.get());
}
}

View file

@ -1,5 +1,7 @@
package ru.spcex.clearing.account.validation;
import java.util.Map;
import java.util.Optional;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
@ -12,9 +14,6 @@ import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
import java.util.Map;
import java.util.Optional;
public enum AccountValidationRule implements IValidationRule<ImdgValidationContext<BankAccountNewRequest>> {
CompanyPresent() {

View file

@ -0,0 +1,75 @@
package ru.spcex.clearing.account.validation;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
public enum BackendClientCodeValidationRule implements IValidationRule<ImdgValidationContext<ClientCodeNewRequest>> {
AllAccountsPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<ClientCodeNewRequest> context) {
ClientCodeNewRequest validatedObject = context.getValidatedObject();
List<Long> ids = validatedObject.getCurrencyAccountList();
if (ids == null || ids.isEmpty()) {
return empty(); // необязательное поле
}
Imdg<Account> imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
for (Long id : ids) {
if (id == null) { // null значения в массиве не ожидаются
return of(AccountError.RequiredFieldEmpty, "accountId");
}
Account byIdObject = imdg.getSingleObjectByID(id);
if (byIdObject == null)
return of(AccountError.AccountNotFound, id, "accountId");
}
return empty();
}
},
TcrIsNotPresentByAccount() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<ClientCodeNewRequest> context) {
ClientCodeNewRequest validatedObject = context.getValidatedObject();
List<Long> currencyIds = validatedObject.getCurrencyAccountList();
Long moneyAccountId = validatedObject.getMoneyAccountId();
Imdg<TradingClearingRegistry> tradingClearingRegistryImdg =
context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class);
Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg =
context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
TradingClearingRegistry tcrByMoneyAccount = tradingClearingRegistryImdg.getFirstObjectByFieldValues(
Map.of(
"moneyAccountId", moneyAccountId,
"status", Status.Active.getKey()
));
if (tcrByMoneyAccount != null) {
return of(AccountError.TradingClearingRegistryAlreadyExist);
}
for (Long id : currencyIds) {
TradingClearingRegistryList tcrList = tradingClearingRegistryListImdg.getFirstObjectByFieldValues(
Map.of(
"accountId", id,
"status", Status.Active.getKey()
));
if (tcrList != null) {
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed);
}
}
return empty();
}
}
}

View file

@ -0,0 +1,9 @@
package ru.spcex.clearing.account.validation;
public enum ClientCodeStoreObjects {
COMPANY,
MONEY_ACCOUNT,
DEPO_ACCOUNT,
MAPPED_TO_CURRENCY_ACCOUNTS,
TRADING_CLEARING_REGISTRY
}

View file

@ -0,0 +1,160 @@
package ru.spcex.clearing.account.validation;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.springframework.util.StringUtils;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
import ru.spcex.clearing.account.errors.AccountError;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount;
import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
public enum GatewayClientCodeValidationRule implements IValidationRule<ImdgValidationContext<TkrAccount>> {
CompanyPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
Long tradingCode = validatedObject.getTradingCode();
if (tradingCode == null) {
return of(AccountError.RequiredFieldEmpty, "trading_code");
}
Imdg<Company> companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class);
Company company = companyImdg.getFirstObjectByFieldValues(
Map.of("tradingCode", String.valueOf(tradingCode))
);
if (company == null) {
return of(AccountError.COMPANY_NOT_FOUND_GTW, "trading_code");
}
context.storeObject(ClientCodeStoreObjects.COMPANY, company);
return Optional.empty();
}
},
AllAccountsPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
List<MoneyAccountMsgRequest> accountList = validatedObject.getMoneyAccounts();
if (accountList == null || accountList.isEmpty()) {
return of(AccountError.RequiredFieldEmpty, "money_account");
}
List<String> currencies = accountList.stream().map(MoneyAccountMsgRequest::getCurrCode).toList();
if (!currencies.contains(CurrencyCode.RUB.getKey())) {
return of(AccountError.RequiredFieldEmpty, "money_account");
}
Imdg<Account> imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
Map<String, Account> accountByCurrency = new HashMap<>();
for (MoneyAccountMsgRequest moneyAccountMsg : accountList) {
ImdgPredicateBuilder predicateBuilder = imdg.predicateBuilder();
ImdgPredicate currencyPredicate;
if (!StringUtils.hasText(moneyAccountMsg.getAccount())){
return of(AccountError.RequiredFieldEmpty, "account");
}
ImdgPredicate accountPredicate = predicateBuilder.equals("account", moneyAccountMsg.getAccount());
if (moneyAccountMsg.getCurrCode().equals(CurrencyCode.RUB.getKey())) {
currencyPredicate = predicateBuilder.or(
predicateBuilder.equals("currency", CurrencyCode.RUB.getKey()),
predicateBuilder.isNull("currency")
);
} else {
currencyPredicate = predicateBuilder.equals("currency", moneyAccountMsg.getCurrCode());
}
Account account = imdg.getFirstObjectByPredicate(
predicateBuilder.and(accountPredicate, currencyPredicate)
);
if (account == null) {
return of(AccountError.ACCOUNT_NOT_FOUND_GTW, moneyAccountMsg.getAccount(), "money_account");
}
accountByCurrency.put(account.getCurrency(), account);
}
context.storeObject(ClientCodeStoreObjects.MAPPED_TO_CURRENCY_ACCOUNTS, accountByCurrency);
return Optional.empty();
}
},
DepoAccountsPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
TkrAccount validatedObject = context.getValidatedObject();
String depoAccountVal = validatedObject.getDepoAccount();
if (!StringUtils.hasText(depoAccountVal)) {
context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, Optional.empty());
return empty();
}
Imdg<Account> imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class);
Account depoAccount = imdg.getFirstObjectByFieldValues(
Map.of("account", depoAccountVal)
);
if (depoAccount == null) {
context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, Optional.empty());
return of(AccountError.DepoAccountNotFound, "depo_account");
}
context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, depoAccount);
return Optional.empty();
}
},
TcrIsNotPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
Map<String, Account> accountByCurrency = context.getStoredObject(ClientCodeStoreObjects.MAPPED_TO_CURRENCY_ACCOUNTS);
Account moneyAccount = accountByCurrency.get(CurrencyCode.RUB.getKey());
if (moneyAccount == null) {
return of(AccountError.AccountNotFound);
}
Imdg<TradingClearingRegistry> imdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry,
TradingClearingRegistry.class);
TradingClearingRegistry tcr = imdg.getFirstObjectByFieldValues(
Map.of(
"moneyAccountId", moneyAccount.getId(),
"status", Status.Active.getKey()
)
);
if (tcr != null) {
return of(AccountError.TradingClearingRegistryAlreadyExist, tcr.getCode(), "code");
}
return Optional.empty();
}
},
TcrListIsNotPresent() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<TkrAccount> context) {
Map<String, Account> accountByCurrency = context.getStoredObject(ClientCodeStoreObjects.MAPPED_TO_CURRENCY_ACCOUNTS);
List<Account> currencyAccounts = accountByCurrency.entrySet().stream()
.filter(stringAccountEntry -> !stringAccountEntry.getKey().equals(CurrencyCode.RUB.getKey()))
.map(Map.Entry::getValue).toList();
if (currencyAccounts.isEmpty()) {
return empty();
}
List<String> currencies = currencyAccounts.stream().map(Account::getCurrency).toList();
Imdg<TradingClearingRegistryList> imdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistryList,
TradingClearingRegistryList.class);
ImdgPredicateBuilder predicateBuilder = imdg.predicateBuilder();
Collection<TradingClearingRegistryList> tcrList = imdg.getCollectionObjectsByPredicate(
predicateBuilder.and(
predicateBuilder.in("currency", currencies.toArray(new String[0])),
predicateBuilder.equals("status", Status.Active.getKey())
));
if (!tcrList.isEmpty()) {
return of(AccountError.TradingClearingRegistryAlreadyExist, tcrList.iterator().next().getCurrency(), "currency");
}
return Optional.empty();
}
}
}

View file

@ -16,4 +16,6 @@ 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
account-service.kafka-producer.buffer-memory=33554432
account-service.app.registry-unit=L

View file

@ -1,38 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_PATH" value="./log" />
<property name="FILE_NAME" value="account-service" />
<property name="CONSOLE_LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %class{0}:%line - %message%n" />
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{0}:%msg%n" />
<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>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/account-service.log</file>
<!-- first FILE TEXT appender -->
<appender name="TEXT_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${FILE_NAME}-text.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>
<Pattern>${FILE_LOG_PATTERN}</Pattern>
<charset>utf8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>
./logs/account-service.%i.log
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${FILE_NAME}-text.%d{yyyy-MM-dd}.%i.gz
</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>10</maxIndex>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</rollingPolicy>
</appender>
<!-- second FILE JSON appender -->
<appender name="JSON_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${FILE_NAME}-json.log</file>
<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/${FILE_NAME}-json.%d{yyyy-MM-dd}.%i.gz
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</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 level="info">
<!-- <appender-ref ref="CONSOLE"/> -->
<appender-ref ref="TEXT_FILE"/>
<appender-ref ref="JSON_FILE" />
</root>
<logger name="ru.spcex" level="debug" additivity="false">
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
<appender-ref ref="TEXT_FILE"/>
<appender-ref ref="JSON_FILE" />
<!-- <appender-ref ref="CONSOLE"/> -->
</logger>
</configuration>

View file

@ -1,11 +1,16 @@
package ru.spcex.clearing.account.service;
import java.util.concurrent.atomic.AtomicInteger;
import javax.annotation.PostConstruct;
import org.apache.kafka.clients.consumer.MockConsumer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
@ -15,6 +20,7 @@ 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.classes.statics.data.misc.ValidationSymbols;
import ru.clearing.platform.dictionary.CurrencyCodeDictionary;
import ru.spcex.clearing.account.config.BeanConfiguration;
import ru.spcex.clearing.account.config.validation.AccountValidationConfig;
@ -29,27 +35,25 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.BankAccountNewReq
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 static ru.spcex.clearing.platform.messaging.service.Status.Error;
import ru.spcex.clearing.test.MatcherFactory.Matcher;
import static ru.spcex.clearing.test.MatcherFactory.usingIgnoringFieldsComparator;
import ru.spcex.clearing.test.TestObjectCreator;
import static ru.spcex.clearing.test.TestUtils.*;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import ru.spcex.platform.enumeration.*;
import static ru.spcex.clearing.test.config.KafkaTestConfig.getCaptor;
import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.Allowed;
import ru.spcex.platform.enumeration.ClearingCategory;
import ru.spcex.platform.enumeration.Service;
import ru.spcex.platform.enumeration.Status;
import ru.spcex.platform.enumeration.WorkflowStatus;
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,
@ -79,6 +83,7 @@ public class BankAccountServiceTest {
private static final String correspondentAccountName = "BIK OF TINKOFF";
private static final String taxpayerIdentificationNumber = "848484848484";
private static final String taxRegistrationReasonCode = "886886";
private static final String swiftCode = "SWIFT_code";
protected final Long addresseeIdNew = 2L;
protected final String deal = "111111111";
private final String acc = "0123456789";
@ -88,6 +93,7 @@ public class BankAccountServiceTest {
private Imdg<CurrencyCodeDictionary> currencyCodeDictionaryImdg;
private Imdg<ClearingMemberCategory> clearingMemberCategoryImdg;
private Imdg<Relation> relationImdg;
private Imdg<ValidationSymbols> validationSymbolsImdg;
@Autowired
private IMessageResolver messageResolver;
@ -118,10 +124,26 @@ public class BankAccountServiceTest {
relationImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_Relation, Relation.class
);
validationSymbolsImdg = hazelcastServiceTest.getImdg(
IMDGDistributedNames.Map_ValidationSymbols, ValidationSymbols.class
);
CurrencyCodeDictionary currencyCodeDictionary = new CurrencyCodeDictionary();
currencyCodeDictionary.setCode("RUB");
currencyCodeDictionary.setName("RUB");
currencyCodeDictionaryImdg.insert(currencyCodeDictionary);
ValidationSymbols validationSymbols = new ValidationSymbols();
validationSymbols.setId(1L);
validationSymbols.setSymbols("а-яА-ЯёЁ");
validationSymbolsImdg.insert(validationSymbols);
validationSymbols.setId(2L);
validationSymbols.setSymbols("a-zA-Z");
validationSymbolsImdg.insert(validationSymbols);
validationSymbols.setId(3L);
validationSymbols.setSymbols("0-9");
validationSymbolsImdg.insert(validationSymbols);
validationSymbols.setId(4L);
validationSymbols.setSymbols("-_., ;\"%");
validationSymbolsImdg.insert(validationSymbols);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
}
@ -314,6 +336,7 @@ public class BankAccountServiceTest {
predictableUpdateBankAccount.setTaxpayerIdentificationNumber("65468461321");
predictableUpdateBankAccount.setTaxRegistrationReasonCode("532137");
predictableUpdateBankAccount.setAccount(acc);
predictableUpdateBankAccount.setSwiftCode("SWIFT_2");
predictableUpdateBankAccount.setId(ID);
BankAccountUpdateRequest bankAccountUpdateRequest = new BankAccountUpdateRequest();
@ -327,6 +350,7 @@ public class BankAccountServiceTest {
bankAccountUpdateRequest.setTaxpayerIdentificationNumber(predictableUpdateBankAccount.getTaxpayerIdentificationNumber());
bankAccountUpdateRequest.setTaxRegistrationReasonCode(predictableUpdateBankAccount.getTaxRegistrationReasonCode());
bankAccountUpdateRequest.setAccount(predictableUpdateBankAccount.getAccount());
bankAccountUpdateRequest.setSwiftCode(predictableUpdateBankAccount.getSwiftCode());
String jsonString = getJsonStringForUpdate(bankAccountUpdateRequest, ID);
@ -392,6 +416,7 @@ public class BankAccountServiceTest {
account.setAccountType(AccountType.Bank.getKey());
account.setStatus(Status.Active.getKey());
account.setProcessingSign(Allowed.ALLOWED.getKey());
account.setCurrency(currency);
return account;
}
@ -415,6 +440,8 @@ public class BankAccountServiceTest {
bankAccount.setDestination(destination);
bankAccount.setTaxpayerIdentificationNumber(taxpayerIdentificationNumber);
bankAccount.setTaxRegistrationReasonCode(taxRegistrationReasonCode);
bankAccount.setCurrency(currency);
bankAccount.setSwiftCode(swiftCode);
return bankAccount;
}
@ -430,6 +457,8 @@ public class BankAccountServiceTest {
bankAccountNewRequest.setTaxRegistrationReasonCode(bankAccount.getTaxRegistrationReasonCode());
bankAccountNewRequest.setAccount(bankAccount.getAccount());
bankAccountNewRequest.setCompanyId(bankAccount.getCompanyId());
bankAccountNewRequest.setCurrency(bankAccount.getCurrency());
bankAccountNewRequest.setSwiftCode(bankAccount.getSwiftCode());
return bankAccountNewRequest;
}

View file

@ -19,9 +19,11 @@ 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.classes.statics.data.registry.TradingClearingRegistryList;
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.TradingClearingRegistryListValidationConfig;
import ru.spcex.clearing.account.config.validation.TradingClearingRegistryValidationConfig;
import ru.spcex.clearing.account.config.validation.ValidationConfig;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
@ -35,6 +37,8 @@ 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.AccountType;
import ru.spcex.platform.enumeration.ServiceStatus;
import ru.spcex.platform.enumeration.TradingClearingRegistryType;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
@ -42,6 +46,8 @@ import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
import javax.annotation.PostConstruct;
import java.util.Arrays;
import static org.junit.jupiter.api.Assertions.*;
import static ru.spcex.clearing.test.TestUtils.waitingSendAndCheckRecord;
@ -53,6 +59,9 @@ import static ru.spcex.clearing.test.TestUtils.waitingSendAndCheckRecord;
TradingClearingRegistryService.class,
TradingClearingRegistryValidationConfig.class,
TradingClearingRegistryListService.class,
TradingClearingRegistryListValidationConfig.class,
ValidationConfig.class,
BeanConfiguration.class,
@ -79,6 +88,7 @@ class ClientCodeServiceTest {
protected Producer<String, Object> mockProducer;
private Imdg<ClientCode> clientCodeImdg;
private Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg;
// ****************************-*******************
@ -87,9 +97,11 @@ class ClientCodeServiceTest {
private void init() {
hazelcastServiceTest.waitAvailable();
clientCodeImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
tradingClearingRegistryListImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
// Словари для теста, применяются в ValidationConfig
putToDictionary(IMDGDistributedNames.Map_WorkflowStatusDictionary, new WorkflowStatusDictionary(), "ACTV");
putToDictionary(IMDGDistributedNames.Map_ServiceStatusDictionary, new ServiceStatusDictionary(), ServiceStatus.Active.getKey());
putToDictionary(IMDGDistributedNames.Map_CompanySymbolDictionary, new CompanySymbolDictionary(), "CLRC");
putToDictionary(IMDGDistributedNames.Map_CorporationSoleTypeDictionary, new CorporationSoleTypeDictionary(), "GDIR");
putToDictionary(IMDGDistributedNames.Map_CountryCodeDictionary, new CountryCodeDictionary(), "RUS");
@ -149,6 +161,14 @@ class ClientCodeServiceTest {
depoAcc.setAccountId(depoAccount.getId());
depoAccounts.insert(depoAcc);
Account c2Account = new Account();
c2Account.setId(133L);
c2Account.setAccount("AAAX-44654-CURR");
c2Account.setStatus("ACTV");
c2Account.setCompanyId(COMPANY_ID); // для валидации принадлежности счёта
c2Account.setAccountType(AccountType.Curr.getKey());
accounts.insert(c2Account);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
}
@ -207,7 +227,7 @@ class ClientCodeServiceTest {
TestUtils.addRecordToKafka((MockConsumer) clientCodeService.getConsumer(), Consts.DESTINATION_CLIENT_CODE_NEW, PARTITION, 0, jsonString);
//ASSERT
waitingSendAndCheckRecord(ID, mockProducer);
waitingSendAndCheckRecord(ID, mockProducer);
ClientCode resultNew = clientCodeImdg.getFirstObjectBySQL(String.format("code = '%s'", ccCode));
predictableClientCode.setId(resultNew.getId());
CLIENT_CODE_MATCHER.assertMatch(resultNew, predictableClientCode);
@ -292,6 +312,52 @@ class ClientCodeServiceTest {
assertNotNull(resultNew.getCreated());
}
/**
* {@link ClientCodeService#clientCodeUpdate(BaseRequest)}<br>
* Тест проверяет создание {@link ClientCode} в IMDG при передаче из Apache Kafka (очередь 4).<br>
* Входной запрос {@link ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest}:<br>
* С дополнительным заполнением TradingClearingRegistryList id's. С одним.
**/
@Test
void clientCodeNew4() {
//ARRANGE
final String ccCode = "Lucky";
ClientCodeNewRequest clientCodeNewRequest = new ClientCodeNewRequest();
clientCodeNewRequest.setCompanyId(COMPANY_ID);
clientCodeNewRequest.setCode(ccCode);
clientCodeNewRequest.setTradingClearingRegistryId(TCR_ID);
clientCodeNewRequest.setMoneyAccountId(131L);
clientCodeNewRequest.setDepoAccountId(132L);
clientCodeNewRequest.setCurrencyAccountList(Arrays.asList(133L));
clientCodeNewRequest.setStatus("ACTV");
ClientCode predictableClientCode = new ClientCode();
predictableClientCode.setCode(ccCode);
predictableClientCode.setStatus("ACTV");
predictableClientCode.setCompanyId(COMPANY_ID);
predictableClientCode.setMoneyAccountId(131L);
predictableClientCode.setDepoAccountId(132L);
predictableClientCode.setCurrencyAccountId(133L);
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());
TradingClearingRegistryList newTCRList = tradingClearingRegistryListImdg.getFirstObjectBySQL("accountId=" + predictableClientCode.getCurrencyAccountId());
assertNotNull(newTCRList);
assertEquals(TCR_ID, newTCRList.getTradingClearingRegistryId());
}
/**
* {@link ClientCodeService#clientCodeUpdate(BaseRequest)}<br>
* Тест проверяет обновление сущности {@link ClientCode} в IMDG при передаче из Apache Kafka.<br>

View file

@ -124,6 +124,7 @@ class InformationAccountServiceTest {
Account accountAnlt = new Account();
accountAnlt.setAccountType(AccountType.Anlt.getKey());
accountAnlt.setCompanyId(1L);
accountAnlt.setCurrency("RUB");
anltAccountId = accountImdg.insert(accountAnlt);
new TestObjectCreator(hazelcastServiceTest).createUserAdmin(1000L);
@ -134,6 +135,7 @@ class InformationAccountServiceTest {
InformationAccountNewRequest InformationAccountNewRequest = new InformationAccountNewRequest();
InformationAccountNewRequest.setCompanyId(companyId);
InformationAccountNewRequest.setAccount(account);
InformationAccountNewRequest.setCurrency(null);
String jsonString = getJsonStringForNew(InformationAccountNewRequest, 0L);
@ -178,11 +180,13 @@ class InformationAccountServiceTest {
Account account = new Account();
account.setId(120L);
account.setAccountType(AccountType.Info.getKey());
account.setCurrency(CurrencyCode.RUB.getKey());
account.setCompanyId(10L);
account.setAccount("39911810000000127000");
accountImdg.insert(account);
InformationAccount accountInfo = new InformationAccount();
accountInfo.setId(121L);
account.setCurrency(CurrencyCode.RUB.getKey());
accountInfo.setAccountId(account.getId());
accountInfo.setCompanyId(account.getCompanyId());
accountInfoImdg.insert(accountInfo);
@ -190,9 +194,17 @@ class InformationAccountServiceTest {
UserRoleVerification userRoleVerification = Mockito.mock(UserRoleVerification.class);
InformationAccountService infoAccSvc=new InformationAccountService(null,null,null,
null, userRoleVerification, hazelcastServiceTest, null, null, null, null);
Long n = infoAccSvc.accountNextId();
Long n = infoAccSvc.accountNextId(null);
Assertions.assertEquals(13L, n);
n = infoAccSvc.accountNextId();
n = infoAccSvc.accountNextId(null);
Assertions.assertEquals(14L, n);
// Другие валюты
n = infoAccSvc.accountNextId(CurrencyCode.RUB.getKey());
Assertions.assertEquals(15L, n);
n = infoAccSvc.accountNextId("CNY");
Assertions.assertEquals(2L, n);
n = infoAccSvc.accountNextId("CNY");
Assertions.assertEquals(3L, n);
}
}

View file

@ -0,0 +1,284 @@
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.classes.statics.data.registry.TradingClearingRegistryList;
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.TradingClearingRegistryListValidationConfig;
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.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListUpdateRequest;
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.AccountType;
import ru.spcex.platform.enumeration.ServiceStatus;
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 java.util.Arrays;
import static org.junit.jupiter.api.Assertions.*;
import static ru.spcex.clearing.test.TestUtils.waitingSendAndCheckRecord;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
TradingClearingRegistryListService.class,
TradingClearingRegistryListValidationConfig.class,
ClientCodeService.class,
ClientCodeValidationConfig.class,
TradingClearingRegistryService.class,
TradingClearingRegistryValidationConfig.class,
ValidationConfig.class,
BeanConfiguration.class,
KafkaTestConfig.class,
ImdgTestConfig.class})
class TradingClearingRegistryListServiceTest {
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");
public static final MatcherFactory.Matcher<TradingClearingRegistryList> TRADING_CLEARING_REGISTRY_LIST_MATCHER = MatcherFactory.usingIgnoringFieldsComparator("created", "updated");
private static final Long TCR_ID = 41L;
private static final Long COMPANY_ID = 42L;
@Autowired
TradingClearingRegistryListService tradingClearingRegistryListService;
@Autowired
@Qualifier("hazelcastServiceTest")
private HazelcastService hazelcastServiceTest;
@Captor
private ArgumentCaptor<ProducerRecord> producerRecord;
@Autowired
@Qualifier("mockProducer")
protected Producer<String, Object> mockProducer;
private Imdg<ClientCode> clientCodeImdg;
private Imdg<TradingClearingRegistryList> tradingClearingRegistryListImdg;
// ****************************-*******************
@PostConstruct
private void init() {
hazelcastServiceTest.waitAvailable();
clientCodeImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_ClientCode, ClientCode.class);
tradingClearingRegistryListImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_TradingClearingRegistryList, TradingClearingRegistryList.class);
// Словари для теста, применяются в ValidationConfig
putToDictionary(IMDGDistributedNames.Map_WorkflowStatusDictionary, new WorkflowStatusDictionary(), "ACTV");
putToDictionary(IMDGDistributedNames.Map_ServiceStatusDictionary, new ServiceStatusDictionary(), ServiceStatus.Active.getKey());
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);
Account c2Account = new Account();
c2Account.setId(133L);
c2Account.setAccount("AAAX-44654-CURR");
c2Account.setStatus("ACTV");
c2Account.setCompanyId(COMPANY_ID); // для валидации принадлежности счёта
c2Account.setAccountType(AccountType.Info.getKey());
c2Account.setCurrency("USD");
accounts.insert(c2Account);
Account c3Account = new Account();
c3Account.setId(134L);
c3Account.setAccount("AAAX-12654-CURR");
c3Account.setStatus("ACTV");
c3Account.setCompanyId(COMPANY_ID); // для валидации принадлежности счёта
c3Account.setAccountType(AccountType.Info.getKey());
c3Account.setCurrency("USD");
accounts.insert(c3Account);
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);
}
/**
* {@link TradingClearingRegistryListService#tradingClearingRegistryListNew(BaseRequest)}<br>
* Тест проверяет создание {@link TradingClearingRegistryList} в IMDG при передаче из Apache Kafka (очередь 1).<br>
* Входной запрос {@link TradingClearingRegistryListNewRequest}:<br>
**/
@Test
void tradingClearingRegistryListNew() {
//ARRANGE
final String ccCode = null;
TradingClearingRegistryListNewRequest tcrlNewRequest = new TradingClearingRegistryListNewRequest();
tcrlNewRequest.setTradingClearingRegistryId(TCR_ID);
tcrlNewRequest.setAccountId(134L);
tcrlNewRequest.setStatus("ACTV");
ClientCode predictableClientCode = new ClientCode();
predictableClientCode.setCode(ccCode);
predictableClientCode.setStatus("ACTV");
predictableClientCode.setCompanyId(COMPANY_ID);
TradingClearingRegistryList predictableTradingClearingRegistryList = new TradingClearingRegistryList();
predictableTradingClearingRegistryList.setAccountId(134L);
predictableTradingClearingRegistryList.setStatus("ACTV");
predictableTradingClearingRegistryList.setCurrency("USD");
//ACT
String jsonString = TestUtils.getJsonStringForNew(tcrlNewRequest, ID);
TestUtils.addRecordToKafka((MockConsumer) tradingClearingRegistryListService.getConsumer(), Consts.DESTINATION_TRADING_CLEARING_REGISTRIES_LIST_NEW, PARTITION, 0, jsonString);
//ASSERT
waitingSendAndCheckRecord(ID, mockProducer);
ClientCode resultCCNew = clientCodeImdg.getFirstObjectBySQL(String.format("code = '%s'", ccCode));
predictableClientCode.setId(resultCCNew.getId());
CLIENT_CODE_MATCHER.assertMatch(resultCCNew, predictableClientCode);
assertNotNull(resultCCNew.getCreated());
TradingClearingRegistryList resultTCRLNew = tradingClearingRegistryListImdg.getFirstObjectBySQL(String.format("code = '%s'", ccCode));
predictableClientCode.setId(resultTCRLNew.getId());
TRADING_CLEARING_REGISTRY_LIST_MATCHER.assertMatch(resultTCRLNew, predictableTradingClearingRegistryList);
assertNotNull(resultTCRLNew.getCreated());
// CLEAN UP
tradingClearingRegistryListImdg.delete(resultTCRLNew);
}
/**
* {@link TradingClearingRegistryListService#tradingClearingRegistryListUpdate(BaseRequest)}<br>
* Тест проверяет обновление сущности {@link TradingClearingRegistryList} в IMDG при передаче из Apache Kafka.<br>
* Входной запрос {@link TradingClearingRegistryListUpdateRequest}:<br>
**/
@Test
void tradingClearingRegistryListUpdate() {
//ARRANGE
TradingClearingRegistryList existsTradingClearingRegistryList = new TradingClearingRegistryList();
existsTradingClearingRegistryList.setId(ID);
existsTradingClearingRegistryList.setTradingClearingRegistryId(TCR_ID);
existsTradingClearingRegistryList.setCurrency("BTC");
existsTradingClearingRegistryList.setAccountId(133L);
tradingClearingRegistryListImdg.insert(existsTradingClearingRegistryList);
TradingClearingRegistryListUpdateRequest tradingClearingRegistryListUpdateRequest = new TradingClearingRegistryListUpdateRequest();
tradingClearingRegistryListUpdateRequest.setId(ID);
tradingClearingRegistryListUpdateRequest.setTradingClearingRegistryId(TCR_ID);
tradingClearingRegistryListUpdateRequest.setStatus("ACTV");
tradingClearingRegistryListUpdateRequest.setCurrencyAccountList(Arrays.asList(134L));
TradingClearingRegistryList predictableTradingClearingRegistryList = new TradingClearingRegistryList();
predictableTradingClearingRegistryList.setId(ID);
predictableTradingClearingRegistryList.setTradingClearingRegistryId(TCR_ID);
predictableTradingClearingRegistryList.setCurrency("BTC");
predictableTradingClearingRegistryList.setAccountId(133L);
predictableTradingClearingRegistryList.setStatus("ACTV");
//ACT
String jsonString = TestUtils.getJsonStringForUpdate(tradingClearingRegistryListUpdateRequest, ID);
TestUtils.addRecordToKafka((MockConsumer) tradingClearingRegistryListService.getConsumer(), Consts.DESTINATION_TRADING_CLEARING_REGISTRIES_LIST_UPDATE, PARTITION, 0, jsonString);
//ASSERT
waitingSendAndCheckRecord(ID, mockProducer);
TradingClearingRegistryList resultUpdating = tradingClearingRegistryListImdg.getSingleObjectByID(ID);
TRADING_CLEARING_REGISTRY_LIST_MATCHER.assertMatch(resultUpdating, predictableTradingClearingRegistryList);
assertNotNull(resultUpdating.getUpdated());
// CLEAN UP
tradingClearingRegistryListImdg.delete(resultUpdating);
}
}

View file

@ -11,7 +11,7 @@
<parent>
<artifactId>clearing-parent</artifactId>
<groupId>ru.spcex.clearing</groupId>
<version>SPCEX-1.0.0.0</version>
<version>SPCEX-3.22.295</version>
</parent>
@ -61,6 +61,17 @@
<groupId>ru.spcex.platform</groupId>
<artifactId>platform-enum</artifactId>
</dependency>
<!-- special logging -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.0.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- TEST -->
<dependency>
<groupId>org.springframework</groupId>
@ -100,6 +111,7 @@
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
@ -174,7 +186,7 @@
</configuration>
</execution>
<execution>
<!-- Generate Data.sql from META and DATA file
<!-- Generate dictionaries.sql from META and DATA file
command: mvn xml:transform@data -->
<id>data</id>
<goals>
@ -185,13 +197,13 @@
<transformationSet>
<dir>src/main/resources/meta</dir>
<includes>
<include>data.xml</include>
<include>dictionaries.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>
<targetExtension>dictionaries.sql</targetExtension>
</fileMapper>
</fileMappers>
</transformationSet>
@ -208,6 +220,32 @@
</fileMapper>
</fileMappers>
</transformationSet>
<transformationSet>
<dir>src/main/resources/meta</dir>
<includes>
<include>market.xml</include>
</includes>
<stylesheet>src/main/resources/meta/xsl/data.xsl</stylesheet>
<fileMappers>
<fileMapper
implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
<targetExtension>market.sql</targetExtension>
</fileMapper>
</fileMappers>
</transformationSet>
<!-- <transformationSet>
<dir>src/main/resources/meta</dir>
<includes>
<include>data_register_code.xml</include>
</includes>
<stylesheet>src/main/resources/meta/xsl/data.xsl</stylesheet>
<fileMappers>
<fileMapper
implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
<targetExtension>data_register_code.sql</targetExtension>
</fileMapper>
</fileMappers>
</transformationSet> -->
</transformationSets>
</configuration>
</execution>

View file

@ -1,18 +1,22 @@
package ru.spcex.clearing.backendapi.config;
import java.util.LinkedList;
import java.util.List;
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.backendapi.controller.queue.history.condition.specific.ClearingDateFromCondition;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.specific.ClearingDateToCondition;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.specific.CreatedFromCondition;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.specific.CreatedToCondition;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.specific.TradingDateFromCondition;
import ru.spcex.clearing.backendapi.controller.queue.history.condition.specific.TradingDateToCondition;
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 {
@ -40,6 +44,7 @@ public class HistoryConfig {
hst.add(excludeLiabilitiesRegister());
hst.add(liabilitiesRegister());
hst.add(executionRegister());
hst.add(session());
return hst;
}
@ -174,4 +179,17 @@ public class HistoryConfig {
));
return sbscr;
}
private HistorySubscription session() {
HistorySubscription sbscr = new HistorySubscription();
sbscr.setDestination("sessions");
sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchSession);
sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_Session);
sbscr.setConditions(List.of(
new ClearingDateFromCondition(pb),
new ClearingDateToCondition(pb)
));
return sbscr;
}
}

View file

@ -4,6 +4,8 @@ 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 java.io.IOException;
import java.nio.file.Files;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
@ -12,9 +14,6 @@ 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")

View file

@ -0,0 +1,60 @@
package ru.spcex.clearing.backendapi.config;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@Configuration
public class RegistriesFilterConfig {
@Bean
public Map<String, ImdgPredicate> registriesFilterByName(ImdgProvider imdgProvider) {
ImdgPredicateBuilder predicateBuilder = imdgProvider
.getImdg(IMDGDistributedNames.Map_Registry, ExecutionDeposit.class)
.predicateBuilder();
return new HashMap<>() {{
put("fulfilledLiabilities", predicateBuilder.and(
predicateBuilder.regex("registryCode", "^[OT].*"),
predicateBuilder.in("registryStatus", Arrays.asList(RegistryStatus.OK.getKey(), RegistryStatus.CLRD.getKey()).toArray(new String[0])),
predicateBuilder.equals("settlementDate", LocalDate.now()))
);
put("unfulfilledLiabilities", predicateBuilder.and(
predicateBuilder.regex("registryCode", "^[OT].*"),
predicateBuilder.in("registryStatus", Arrays.asList(
RegistryStatus.FAIL.getKey(),
RegistryStatus.UNCV.getKey(),
RegistryStatus.NACK.getKey(),
RegistryStatus.NACC.getKey()).toArray(new String[0])),
predicateBuilder.equals("settlementDate", LocalDate.now()))
);
put("clearingLiabilities", predicateBuilder.and(
predicateBuilder.regex("registryCode", "^[OT].*"),
predicateBuilder.in("registryStatus", Arrays.asList(
RegistryStatus.PROC.getKey(),
RegistryStatus.POOL.getKey(),
RegistryStatus.MNG.getKey(),
RegistryStatus.SPLT.getKey()).toArray(new String[0])),
predicateBuilder.greatEqual("settlementDate", LocalDate.now()))
);
put("balanceOfFinancialAssets", predicateBuilder.regex("registryCode", "^[AD]S[A-Z]{2}$"));
put("balanceOfCashAssets", predicateBuilder.and(
predicateBuilder.regex("registryCode", "^[AD]M.*"),
predicateBuilder.equals("securitySymbol", "RUB"))
);
put("balanceOfCurrencyAssets", predicateBuilder.and(
predicateBuilder.regex("registryCode", "^[AD]M.*"),
predicateBuilder.not(predicateBuilder.equals("securitySymbol", "RUB")))
);
put("outvBalance", predicateBuilder.regex("registryCode", "^AM.*"));
}};
}
}

View file

@ -3,6 +3,7 @@ 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.JsConfigSettings;
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;
@ -17,6 +18,7 @@ public class BackendApiSettings {
private KafkaProducerSettings kafkaProducer;
private KafkaConsumerSettings kafkaConsumer;
private SecuritySettings security;
private JsConfigSettings jsConfig;
private String exampleSetting;
public HazelcastClientParams getHazelcast() {
@ -59,6 +61,14 @@ public class BackendApiSettings {
this.security = security;
}
public JsConfigSettings getJsConfig() {
return jsConfig;
}
public void setJsConfig(JsConfigSettings jsConfig) {
this.jsConfig = jsConfig;
}
public HazelcastClientParams getHazelcastSearch() {
return hazelcastSearch;
}

View file

@ -12,6 +12,7 @@ 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.request.cud.company.CompanyRoleSetUpdateAction;
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;
@ -30,35 +31,35 @@ public class CompanyRoleSetController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public CompanyRoleSetController(IOperator operator,
IStateLoader stateLoader) {
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.")
@ApiOperation(value = "new company-role-set.")
@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)
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse create(
@ApiParam(value = "Значения полей нового объекта.", required = true)
public CudResponse add(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody CompanyRoleSetNewAction companyRoleSetNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_COMPANY_ROLE_SET_NEW, companyRoleSetNewAction);
return processRequest(Consts.DESTINATION_COMPANY_ROLE_SETS_NEW, companyRoleSetNewAction);
}
@ApiOperation(value = "delete CompanyRoleSet.")
@ApiOperation(value = "update company-role-set.")
@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 CompanyRoleSetUpdateAction companyRoleSetUpdateAction) throws ExecutionException, InterruptedException {
companyRoleSetUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_COMPANY_ROLE_SETS_UPDATE, companyRoleSetUpdateAction);
}
@ApiOperation(value = "delete company-role-set.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class)})
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseBody
@ -66,7 +67,17 @@ public class CompanyRoleSetController extends AbstractQueueController {
@PathVariable("id") Long id) throws ExecutionException, InterruptedException {
CommonDeleteAction deleteAction = new CommonDeleteAction();
deleteAction.setId(id);
return processRequest(Consts.DESTINATION_COMPANY_ROLE_SET_DELETE, deleteAction);
return processRequest(Consts.DESTINATION_COMPANY_ROLE_SETS_DELETE, deleteAction);
}
@ApiOperation(value = "get all company-role-sets.")
@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;
}
}

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.SettlementHouseProperties;
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.SettlementHousePropertiesNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.company.SettlementHousePropertiesUpdateAction;
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("/settlement-house-properties")
public class SettlementHousePropertiesController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public SettlementHousePropertiesController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "new settlement-house-property.")
@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 SettlementHousePropertiesNewAction settlementHousePropertiesNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_SETTLEMENT_HOUSE_PROPERTY_NEW, settlementHousePropertiesNewAction);
}
@ApiOperation(value = "update settlement-house-property.")
@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 SettlementHousePropertiesUpdateAction settlementHousePropertyUpdateAction) throws ExecutionException, InterruptedException {
settlementHousePropertyUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_SETTLEMENT_HOUSE_PROPERTY_UPDATE, settlementHousePropertyUpdateAction);
}
@ApiOperation(value = "delete settlement-house-property.")
@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_SETTLEMENT_HOUSE_PROPERTY_DELETE, deleteAction);
}
@ApiOperation(value = "get all SettlementHouseProperties.")
@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_SettlementHouseProperties, SettlementHouseProperties.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,85 @@
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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.execution.ExecutionCurrency;
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.enumeration.Side;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
@Controller
@RequestMapping("/execution-currency")
public class ExecutionCurrencyController extends AbstractQueueController {
private final IStateLoader stateLoader;
private final ImdgPredicateBuilder imdgPredicateBuilder;
@Autowired
public ExecutionCurrencyController(IOperator operator,
IStateLoader stateLoader,
ImdgProvider imdgProvider) {
super(operator);
this.stateLoader = stateLoader;
this.imdgPredicateBuilder = imdgProvider
.getImdg(IMDGDistributedNames.Map_ExecutionCurrency, ExecutionCurrency.class)
.predicateBuilder();
}
@ApiOperation(value = "get all ExecutionCurrency.")
@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_ExecutionCurrency,
ExecutionCurrency.class,
imdgPredicate);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "get ExecutionCurrency by filter.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(value = "/filter", method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getByFilter(@RequestParam(name = "pageSize", required = false) Optional<Integer> pageSize,
@RequestParam(name = "pageIndex", required = false) Optional<Integer> pageIndex,
@RequestParam(name = "cck", required = false) Optional<Boolean> cck) {
ImdgPredicate settlementDateFilter = imdgPredicateBuilder.greatEqual("settlementDate", LocalDate.now());
ImdgPredicate sideFilter;
if (cck.isPresent() && cck.get()) {
sideFilter = imdgPredicateBuilder.alwaysTrue();
} else {
sideFilter = imdgPredicateBuilder.equals("side", Side.SELL.getKey());
}
ImdgPredicate filter = imdgPredicateBuilder.and(settlementDateFilter, sideFilter);
AtomicReference<Collection<Map<String, Object>>> all = new AtomicReference<>();
pageIndex.ifPresentOrElse(index ->
all.set(stateLoader.getAllMetaTransformWithPagination(IMDGDistributedNames.Map_ExecutionCurrency, ExecutionCurrency.class, filter,
pageSize.orElse(10_000), index)),
() -> all.set(stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_ExecutionCurrency, ExecutionCurrency.class, filter)));
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all.get());
return response;
}
}

View file

@ -7,6 +7,7 @@ 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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
@ -14,6 +15,8 @@ import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllRespo
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.MoneyFlowSide;
import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@ -21,6 +24,8 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
@Controller
@RequestMapping("/execution-deposits")
@ -52,4 +57,23 @@ public class ExecutionDepositController extends AbstractQueueController {
response.fromEntity(all);
return response;
}
@ApiOperation(value = "get ExecutionDeposits by filter.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(value = "/filter", method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getByFilter(@RequestParam(name = "pageSize", required = false) Optional<Integer> pageSize,
@RequestParam(name = "pageIndex", required = false) Optional<Integer> pageIndex) {
ImdgPredicate filter = imdgPredicateBuilder.and(
imdgPredicateBuilder.greatEqual("firstLegSettlementDate", LocalDate.now()),
imdgPredicateBuilder.equals("side", MoneyFlowSide.SELL.getKey()));
AtomicReference<Collection<Map<String, Object>>> all = new AtomicReference<>();
pageIndex.ifPresentOrElse(index ->
all.set(stateLoader.getAllMetaTransformWithPagination(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class, filter,
pageSize.orElse(10_000), index)),
() -> all.set(stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class, filter)));
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all.get());
return response;
}
}

View file

@ -7,6 +7,7 @@ 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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.execution.ExecutionFond;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
@ -14,6 +15,7 @@ import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllRespo
import ru.spcex.clearing.backendapi.service.IOperator;
import ru.spcex.clearing.backendapi.service.IStateLoader;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.Side;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@ -21,6 +23,8 @@ import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
@Controller
@RequestMapping("/execution-fonds")
@ -53,4 +57,23 @@ public class ExecutionFondController extends AbstractQueueController {
response.fromEntity(all);
return response;
}
@ApiOperation(value = "get ExecutionCurrency by filter.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(value = "/filter", method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getByFilter(@RequestParam(name = "pageSize", required = false) Optional<Integer> pageSize,
@RequestParam(name = "pageIndex", required = false) Optional<Integer> pageIndex) {
ImdgPredicate filter = imdgPredicateBuilder.and(
imdgPredicateBuilder.greatEqual("settlementDate", LocalDate.now()),
imdgPredicateBuilder.equals("side", Side.SELL.getKey()));
AtomicReference<Collection<Map<String, Object>>> all = new AtomicReference<>();
pageIndex.ifPresentOrElse(index ->
all.set(stateLoader.getAllMetaTransformWithPagination(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class, filter,
pageSize.orElse(10_000), index)),
() -> all.set(stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class, filter)));
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all.get());
return response;
}
}

View file

@ -4,6 +4,10 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
@ -23,11 +27,6 @@ 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 {
@ -44,6 +43,16 @@ public class HistController {
this.conditionProvider = conditionProvider;
}
/**
* Поиск исторических данных по параметру destination
* Если в IMDG загружены данные за сегодня, то с помощью данного метода можно запросить данные за прошлое
* Не касается таблиц *_history
*
* @param destination
* @param from
* @param to
* @return
*/
@ApiOperation(value = "Get history")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)

View file

@ -0,0 +1,39 @@
package ru.spcex.clearing.backendapi.controller.queue.misc;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
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.element.BackendApiSettings;
import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse;
import ru.spcex.clearing.backendapi.security.element.JsConfigSettings;
@Controller
@RequestMapping("/")
public class JsConfigController {
private final BackendApiSettings backendApiSettings;
public JsConfigController(BackendApiSettings backendApiSettings) {
this.backendApiSettings = backendApiSettings;
}
@ApiOperation(value = "get js config.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(path = "/spcexConfig.js", method = RequestMethod.GET)
@ResponseBody
public Map<String, Object> getJsConfig() {
Map<String, Object> result = new HashMap<>();
String title = new String(backendApiSettings.getJsConfig().getServerTitle().getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
result.put(JsConfigSettings.SERVER_TITLE_PARAM_NAME, title);
result.put(JsConfigSettings.IS_CENTRAL_COUNTER_PARTY_PARAM_NAME, backendApiSettings.getJsConfig().getCentralCounterPartyEnable());
return result;
}
}

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.SCrossRate;
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("/cross-rate")
public class SCrossRateController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public SCrossRateController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all cross-rate'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_SCrossRate, SCrossRate.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -1,22 +1,30 @@
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 java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
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.Session;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.session.ContinueSessionAction;
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 java.util.Collection;
import java.util.Map;
import ru.spcex.clearing.platform.messaging.domain.Consts;
@Controller
@RequestMapping("/sessions")
@ -39,4 +47,22 @@ public class SessionController extends AbstractQueueController {
response.fromEntity(all);
return response;
}
@ApiOperation(value = "Continue session")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)})
@RequestMapping(value = "/{event_type}", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse repeatSession(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@PathVariable("event_type") String eventType,
@RequestBody ContinueSessionAction continueSessionAction) throws ExecutionException, InterruptedException {
if ("REPT".equals(eventType)) {
return processRequest(Consts.REPEAT_SESSION, continueSessionAction);
} else if ("NEXT".equals(eventType)){
return processRequest(Consts.CONTINUE_SESSION, continueSessionAction);
} else {
throw new UnsupportedOperationException("Unsupported event type: " + eventType);
}
}
}

View file

@ -0,0 +1,50 @@
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 java.util.Collection;
import java.util.Map;
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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
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.platform.imdg.api.ImdgProvider;
@Controller
@RequestMapping("/sessionHistory")
public class SessionHistoryController extends AbstractQueueController {
private final IStateLoader stateLoader;
private final ImdgProvider imdgProvider;
@Autowired
public SessionHistoryController(IOperator operator,
ImdgProvider imdgProvider,
IStateLoader stateLoader) {
super(operator);
this.imdgProvider = imdgProvider;
this.stateLoader = stateLoader;
}
@ApiOperation(value = "Get history of change by id and destination")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getHistory(
@ApiParam(value = "Id объекта", example = "123")
@RequestParam(name = "id")
Long id
) {
Collection<Map<String, Object>> sessionHistories = stateLoader.getSessionHistoryById(id);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(sessionHistories);
return response;
}
}

View file

@ -0,0 +1,84 @@
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 java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
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.ValidationSymbols;
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.settings.ValidationSymbolsNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.settings.ValidationSymbolsUpdateAction;
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;
@Controller
@RequestMapping("/settings/validation-symbols")
public class ValidationSymbolsController extends AbstractQueueController {
private final IStateLoader stateLoader;
public ValidationSymbolsController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "create validation 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, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse add(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ValidationSymbolsNewAction validationSymbolsNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_VALIDATE_SYMBOLS_NEW, validationSymbolsNewAction);
}
@ApiOperation(value = "update validation 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 ValidationSymbolsUpdateAction validationSymbolsUpdateAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_VALIDATE_SYMBOLS_UPDATE, validationSymbolsUpdateAction);
}
@ApiOperation(value = "delete validation symbol.")
@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_VALIDATE_SYMBOLS_DELETE, deleteAction);
}
@ApiOperation(value = "get all validation 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_ValidationSymbols,
ValidationSymbols.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,41 @@
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.*;
import ru.clearing.classes.statics.data.register.GatewayResult;
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("/gateway-result")
public class GatewayResultController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public GatewayResultController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all pair-sdf.")
@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_GatewayResult, GatewayResult.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,41 @@
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.*;
import ru.clearing.classes.statics.data.register.PairSdf;
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("/pair-sdf")
public class PairSdfController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public PairSdfController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all pair-sdf.")
@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_PairSdf, PairSdf.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -4,13 +4,37 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.util.StopWatch;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.server.ResponseStatusException;
import ru.clearing.classes.statics.data.execution.ExecutionDeposit;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.*;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.ChangeRefundDateActionNew;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.ChangeStatusExtractActionNew;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.IdentificationFundsActionNew;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.RSplitDepositActionNew;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.ReturnDepositActionNew;
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;
@ -18,20 +42,31 @@ 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;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
import ru.spcex.platform.utils.enumeration.IEnumKey;
@Controller
@RequestMapping("/registries")
public class RegistryController extends AbstractQueueController {
protected final Logger log = LoggerFactory.getLogger(getClass());
private final IStateLoader stateLoader;
private final ImdgPredicateBuilder predicateBuilder;
private final Map<String, ImdgPredicate> filterByName;
@Autowired
public RegistryController(IOperator operator, IStateLoader stateLoader) {
public RegistryController(IOperator operator, IStateLoader stateLoader,
ImdgProvider imdgProvider,
Map<String, ImdgPredicate> filterByName) {
super(operator);
this.stateLoader = stateLoader;
this.predicateBuilder = imdgProvider
.getImdg(IMDGDistributedNames.Map_ExecutionDeposit, ExecutionDeposit.class)
.predicateBuilder();
this.filterByName = filterByName;
}
@ApiOperation(value = "get all registries.")
@ -39,9 +74,60 @@ public class RegistryController extends AbstractQueueController {
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAll() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Registry, Registry.class);
// long t1 = System.currentTimeMillis();
ImdgPredicate filter = predicateBuilder.or(
predicateBuilder.equals("registryDesignation", RegistryDesignation.A.getKey()),
predicateBuilder.equals("registryDesignation", RegistryDesignation.D.getKey()),
predicateBuilder.and(
predicateBuilder.or(
predicateBuilder.equals("registryDesignation", RegistryDesignation.O.getKey()),
predicateBuilder.equals("registryDesignation", RegistryDesignation.T.getKey())
),
predicateBuilder.greatEqual("settlementDate", LocalDate.now())
)
);
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Registry, Registry.class,
filter);
// long t2 = System.currentTimeMillis();
// log.info("Info select and format {} data {}", all.size(), t2 - t1);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
// log.info("Info select and format {} data {}", all.size(), System.currentTimeMillis() - t2);
return response;
}
@ApiOperation(value = "get registries by filter.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(value = "/filter", method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getByFilter(@RequestParam(name = "kind", required = false) String kind,
@RequestParam(name = "pageSize", required = false) Optional<Integer> pageSize,
@RequestParam(name = "pageIndex", required = false) Optional<Integer> pageIndex) {
if (!StringUtils.hasText(kind)) {
throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Request should have at least one of the parameters: designation, status");
}
if (!filterByName.containsKey(kind)) {
throw new ResponseStatusException(HttpStatus.NOT_ACCEPTABLE, "Kind is not supported: " + kind);
}
StopWatch sw = new StopWatch("registry-controller-stopwatch");
sw.start();
ImdgPredicate filter = predicateBuilder.and(filterByName.get(kind));
AtomicReference<Collection<Map<String, Object>>> all = new AtomicReference<>();
pageIndex.ifPresentOrElse(index ->
all.set(stateLoader.getAllMetaTransformWithPagination(IMDGDistributedNames.Map_Registry, Registry.class, filter,
pageSize.orElse(10_000), index)),
() -> all.set(stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_Registry, Registry.class, filter)));
sw.stop();
log.info("Info select and format {} data took {} ms", all.get().size(), sw.getLastTaskTimeMillis());
sw.start();
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all.get());
sw.stop();
log.info("Info select and format {} data {}", all.get().size(), sw.getLastTaskTimeMillis());
return response;
}
@ -50,8 +136,8 @@ public class RegistryController extends AbstractQueueController {
@RequestMapping(value = "/splitDeposit", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse splitDepositAction(
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody RSplitDepositActionNew rSplitDepositActionNew) throws ExecutionException, InterruptedException {
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody RSplitDepositActionNew rSplitDepositActionNew) throws ExecutionException, InterruptedException {
return processRequest(Consts.REGISTRY_SPLIT_DEPOSIT_ACTION, rSplitDepositActionNew);
}
@ -60,10 +146,10 @@ public class RegistryController extends AbstractQueueController {
@RequestMapping(value = "/returnDeposit/{id}", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse returnDepositAction(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ReturnDepositActionNew returnDepositAction) throws ExecutionException, InterruptedException {
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ReturnDepositActionNew returnDepositAction) throws ExecutionException, InterruptedException {
returnDepositAction.setId(id);
return processRequest(Consts.REGISTRY_RETURN_DEPOSIT_ACTION, returnDepositAction);
}
@ -73,10 +159,10 @@ public class RegistryController extends AbstractQueueController {
@RequestMapping(value = "/identificationFunds/{id}", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse identificationFundsAction(
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody IdentificationFundsActionNew identificationFundsActionNew) throws ExecutionException, InterruptedException {
@ApiParam(value = "Идентификатор изменяемого объекта.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody IdentificationFundsActionNew identificationFundsActionNew) throws ExecutionException, InterruptedException {
identificationFundsActionNew.setId(id);
return processRequest(Consts.REGISTRY_IDENTIFICATION_FUNDS, identificationFundsActionNew);
}
@ -86,10 +172,10 @@ public class RegistryController extends AbstractQueueController {
@RequestMapping(value = "/changeRefundDate/{groupId}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse changeRefundDate(
@ApiParam(value = "Идентификатор группы связанных регистров.", required = true, example = "1234")
@PathVariable("groupId") Long groupId,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ChangeRefundDateActionNew returnDepositAction) throws ExecutionException, InterruptedException {
@ApiParam(value = "Идентификатор группы связанных регистров.", required = true, example = "1234")
@PathVariable("groupId") Long groupId,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ChangeRefundDateActionNew returnDepositAction) throws ExecutionException, InterruptedException {
returnDepositAction.setGroupId(groupId);
return processRequest(Consts.REGISTRY_CHANGE_REFUND_DATE_ACTION, returnDepositAction);
}
@ -99,10 +185,10 @@ public class RegistryController extends AbstractQueueController {
@RequestMapping(value = "/changeStatusExtract/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse changeStatusExtract(
@ApiParam(value = "Идентификатор регистра.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ChangeStatusExtractActionNew changeStatusExtractAction) throws ExecutionException, InterruptedException {
@ApiParam(value = "Идентификатор регистра.", required = true, example = "1234")
@PathVariable("id") Long id,
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody ChangeStatusExtractActionNew changeStatusExtractAction) throws ExecutionException, InterruptedException {
changeStatusExtractAction.setId(id);
return processRequest(Consts.REGISTRY_CHANGE_STATUS_EXTRACT_ACTION, changeStatusExtractAction);
}

View file

@ -0,0 +1,74 @@
package ru.spcex.clearing.backendapi.controller.queue.registry;
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.registry.TradingClearingRegistryList;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.TradingClearingRegistryListNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.registry.TradingClearingRegistryListUpdateAction;
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;
// todo unittest for TradingClearingRegistryListController
@Controller
@RequestMapping("/trading-clearing-registries-list")
public class TradingClearingRegistryListController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public TradingClearingRegistryListController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all TradingClearingRegistryList'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_TradingClearingRegistryList,
TradingClearingRegistryList.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 TradingClearingRegistryListNewAction tradingClearingRegistryListNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_TRADING_CLEARING_REGISTRIES_LIST_NEW, tradingClearingRegistryListNewAction);
}
@ApiOperation(value = "Изменение списка счетов ТКР")
@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 TradingClearingRegistryListUpdateAction tradingClearingRegistryListUpdateAction) throws ExecutionException, InterruptedException {
tradingClearingRegistryListUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_TRADING_CLEARING_REGISTRIES_LIST_UPDATE, tradingClearingRegistryListUpdateAction);
}
}

View file

@ -104,7 +104,7 @@ public class LauncherController extends AbstractQueueController {
if (taskEnum == null) {
throw new NotFound404Exception("task dictionary element with code '" + launcherNew.getTask() + "'");
}
if (!IEnumKey.contains(taskEnum.getCode(), Task.startOfClearing, Task.dbfExport_OUTV)) {
if (!IEnumKey.contains(taskEnum.getCode(), Task.startOfClearing, Task.dbfExport_OUTV, Task.getAllBalance, Task.createRegistry_GBRR)) {
log.warn(String.format("Task %s not support request with body", taskEnum.getCode()));
} // else В мете эти модели с дополнительными параметрами (OUTV).
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

View file

@ -237,6 +237,19 @@ public class SdfsController extends AbstractQueueController {
return response;
}
@ApiOperation(value = "get all S_DF51")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(value = "s-df51", method = RequestMethod.GET)
@ResponseBody
public CommonGetAllResponse getAllSdf51() {
Collection<Map<String, Object>> all = stateLoader.getAllMetaTransform(
IMDGDistributedNames.Map_SDf51,
SDf51.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "get all S_DF52")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)})
@RequestMapping(value = "s-df52", method = RequestMethod.GET)

View file

@ -0,0 +1,84 @@
package ru.spcex.clearing.backendapi.controller.queue.securities;
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.security.CurrencyPairSecurity;
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.securities.CurrencyPairSecurityNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.CurrencyPairSecurityUpdateAction;
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("/securities/currency-pair-securities")
public class CurrencyPairSecurityController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public CurrencyPairSecurityController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "create currencyPairSecurity.")
@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 CurrencyPairSecurityNewAction currencyPairSecurityNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_CURRENCY_PAIR_SECURITIES_NEW, currencyPairSecurityNewAction);
}
@ApiOperation(value = "update currencyPairSecurity.")
@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 CurrencyPairSecurityUpdateAction currencyPairSecurityUpdateAction) throws ExecutionException, InterruptedException {
currencyPairSecurityUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_CURRENCY_PAIR_SECURITIES_UPDATE, currencyPairSecurityUpdateAction);
}
@ApiOperation(value = "delete currency pair securities.")
@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_CURRENCY_PAIR_SECURITIES_DELETE, deleteAction);
}
@ApiOperation(value = "get all equity securities.")
@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_CurrencyPairSecurity,
CurrencyPairSecurity.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,87 @@
package ru.spcex.clearing.backendapi.controller.queue.securities;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
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.security.DigitalCertificateSecurity;
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.securities.DigitalCertificateSecurityNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.DigitalCertificateSecurityUpdateAction;
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;
@Controller
@RequestMapping("/securities/digital-certificate-securities")
public class DigitalCertificateSecuritiesController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public DigitalCertificateSecuritiesController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "create digital certificate security.")
@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 DigitalCertificateSecurityNewAction digitalCertificateSecurityNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_DIGITAL_CERTIFICATE_SECURITY_NEW, digitalCertificateSecurityNewAction);
}
@ApiOperation(value = "update digital certificate security.")
@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 DigitalCertificateSecurityUpdateAction digitalCertificateSecurityUpdateAction) throws ExecutionException, InterruptedException {
digitalCertificateSecurityUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_DIGITAL_CERTIFICATE_SECURITY_UPDATE, digitalCertificateSecurityUpdateAction);
}
@ApiOperation(value = "delete currency pair securities.")
@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_DIGITAL_CERTIFICATE_SECURITY_DELETE, deleteAction);
}
@ApiOperation(value = "get all equity securities.")
@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_DigitalCertificateSecurity,
DigitalCertificateSecurity.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -0,0 +1,74 @@
package ru.spcex.clearing.backendapi.controller.queue.securities;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
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.security.Rates;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.RatesNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.RatesUpdateAction;
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;
@Controller
@RequestMapping("/rates")
public class RatesController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public RatesController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all rates.")
@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_Rates, Rates.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "create rates.")
@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 RatesNewAction ratesNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_RATES_NEW, ratesNewAction);
}
@ApiOperation(value = "update risk_parameter.")
@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 RatesUpdateAction ratesUpdateAction) throws ExecutionException, InterruptedException {
ratesUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_RATES_UPDATE, ratesUpdateAction);
}
}

View file

@ -0,0 +1,74 @@
package ru.spcex.clearing.backendapi.controller.queue.securities;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
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.security.RiskParameter;
import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterNewAction;
import ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterUpdateAction;
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;
@Controller
@RequestMapping("/risk-parameter")
public class RiskParameterController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public RiskParameterController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all risk_parameter.")
@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_RiskParameter, RiskParameter.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
@ApiOperation(value = "create risk_parameter.")
@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 RiskParameterNewAction riskParameterNewAction) throws ExecutionException, InterruptedException {
return processRequest(Consts.DESTINATION_RISK_PARAMETER_NEW, riskParameterNewAction);
}
@ApiOperation(value = "update risk_parameter.")
@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 RiskParameterUpdateAction riskParameterUpdateAction) throws ExecutionException, InterruptedException {
riskParameterUpdateAction.setId(id);
return processRequest(Consts.DESTINATION_RISK_PARAMETER_UPDATE, riskParameterUpdateAction);
}
}

View file

@ -3,6 +3,9 @@ package ru.spcex.clearing.backendapi.controller.queue.securities;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@ -10,16 +13,12 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity;
import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity;
import ru.clearing.classes.statics.data.security.DigitalCertificateSecurity;
import ru.clearing.classes.statics.data.security.MoneyMarketSecurity;
import ru.clearing.classes.statics.data.security.Security;
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.ArrayList;
import java.util.Collection;
import java.util.Map;
/**
* SecurityController и MoneyMarketSecurityController разные контроллеры, не путать.
*/
@ -48,6 +47,12 @@ public class SecurityController {
all.addAll(stateLoader.getAllMetaTransformSpecificClass(
IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class
));
all.addAll(stateLoader.getAllMetaTransformSpecificClass(
IMDGDistributedNames.Map_CurrencyPairSecurity, EquitySecurity.class
));
all.addAll(stateLoader.getAllMetaTransformSpecificClass(
IMDGDistributedNames.Map_DigitalCertificateSecurity, DigitalCertificateSecurity.class
));
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;

View file

@ -0,0 +1,41 @@
package ru.spcex.clearing.backendapi.controller.queue.securities;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import java.util.Collection;
import java.util.Map;
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.security.UtilitarianDigitalRight;
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;
@Controller
@RequestMapping("/securities/utilitarian-digital-rights")
public class UtilitarianDigitalRightController extends AbstractQueueController {
private final IStateLoader stateLoader;
@Autowired
public UtilitarianDigitalRightController(IOperator operator, IStateLoader stateLoader) {
super(operator);
this.stateLoader = stateLoader;
}
@ApiOperation(value = "get all Utilitarian Digital Rights.")
@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_UtilitarianDigitalRight, UtilitarianDigitalRight.class);
CommonGetAllResponse response = new CommonGetAllResponse();
response.fromEntity(all);
return response;
}
}

View file

@ -17,6 +17,9 @@ public class AccountInformationNewAction implements IAction<InformationAccountNe
@ApiModelProperty(value = "Наименование статуса", example = "ACTV")
@JsonProperty
private String status;
@ApiModelProperty(value = "Код валюты", example = "RUB")
@JsonProperty
public String currency;
@ApiModelProperty(value = "Наименование типа счета", example = "INFO")
@JsonProperty
private String accountType;
@ -26,6 +29,7 @@ public class AccountInformationNewAction implements IAction<InformationAccountNe
var req = new InformationAccountNewRequest();
req.setCompanyId(this.companyId);
req.setAccount(this.account);
req.setCurrency(this.currency);
req.setStatus(this.status);
req.setAccountType(this.accountType);
return req;

View file

@ -29,6 +29,9 @@ public class AccountNewAction implements IAction<AccountNewRequest> {
@ApiModelProperty(value = "Наименование типа счета", example = "CLRN")
@JsonProperty
private String accountType;
@ApiModelProperty(value = "Код валюты", example = "RUB")
@JsonProperty
private String currency;
@Override
public AccountNewRequest toRequest() {
@ -37,6 +40,7 @@ public class AccountNewAction implements IAction<AccountNewRequest> {
req.setAccount(this.account);
req.setStatus(this.status);
req.setAccountType(this.accountType);
req.setCurrency(this.currency);
return req;
}
@ -77,4 +81,12 @@ public class AccountNewAction implements IAction<AccountNewRequest> {
public void setAccountType(String accountType) {
this.accountType = accountType;
}
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
}

View file

@ -47,6 +47,57 @@ public class BankAccountNewAction implements IAction<BankAccountNewRequest> {
@ApiModelProperty(value = "Компания", example = "1234")
@JsonProperty
private Long companyId;
@ApiModelProperty(value = "SWIFT", example = "ABCDE")
@JsonProperty
private String swiftCode;
@ApiModelProperty(value = "Код SWIFT посредника", example = "ABCDE")
@JsonProperty
private String intermediarySwiftCode;
@ApiModelProperty(value = "Наименование владельца счета", example = "ABCDE")
@JsonProperty
private String name;
@ApiModelProperty(value = "Адрес владельца счета", example = "ABCDE")
@JsonProperty
private String address;
@ApiModelProperty(value = "Место нахождения банка получателя средств", example = "ABCDE")
@JsonProperty
private String bankAddress;
@ApiModelProperty(value = "SWIFT банка получателя средств", example = "ABCDE")
@JsonProperty
private String bankSwiftCode;
@ApiModelProperty(value = "Номер счета банка получателя средств", example = "ABCDE")
@JsonProperty
private String bankAccount;
@ApiModelProperty(value = "Наименование банка-посредника 1", example = "ABCDE")
@JsonProperty
private String bankName1;
@ApiModelProperty(value = "Место нахождения банка-посредника 1", example = "ABCDE")
@JsonProperty
private String bankAddress1;
@ApiModelProperty(value = "Номер счета банка-посредника 1", example = "ABCDE")
@JsonProperty
private String bankAccount1;
@ApiModelProperty(value = "Наименование банка-посредника 2", example = "ABCDE")
@JsonProperty
private String bankName2;
@ApiModelProperty(value = "Место нахождения банка-посредника 2", example = "ABCDE")
@JsonProperty
private String bankAddress2;
@ApiModelProperty(value = "SWIFT банка-посредника 2", example = "ABCDE")
@JsonProperty
private String intermediarySwiftCode2;
@ApiModelProperty(value = "Номер счета банка-посредника 2", example = "ABCDE")
@JsonProperty
private String bankAccount2;
@ApiModelProperty(value = "Лицевой счет получателя", example = "ABCDE")
@JsonProperty
private String personalAccount;
@ApiModelProperty(value = "КБК", example = "ABCDE")
@JsonProperty
private String budgetClassificationCode;
@ApiModelProperty(value = "ОКТМО получателя средств", example = "ABCDE")
@JsonProperty
private String oktmo;
@Override
public BankAccountNewRequest toRequest() {
@ -61,6 +112,23 @@ public class BankAccountNewAction implements IAction<BankAccountNewRequest> {
req.setTaxRegistrationReasonCode(this.taxRegistrationReasonCode);
req.setAccount(this.account);
req.setCompanyId(this.companyId);
req.setSwiftCode(swiftCode);
req.setIntermediarySwiftCode(intermediarySwiftCode);
req.setName(name);
req.setAddress(address);
req.setBankAddress(bankAddress);
req.setBankSwiftCode(bankSwiftCode);
req.setBankAccount(bankAccount);
req.setBankName1(bankName1);
req.setBankAddress1(bankAddress1);
req.setBankAccount1(bankAccount1);
req.setBankName2(bankName2);
req.setBankAddress2(bankAddress2);
req.setIntermediarySwiftCode2(intermediarySwiftCode2);
req.setBankAccount2(bankAccount2);
req.setPersonalAccount(personalAccount);
req.setBudgetClassificationCode(budgetClassificationCode);
req.setOktmo(oktmo);
return req;
}
@ -149,4 +217,140 @@ public class BankAccountNewAction implements IAction<BankAccountNewRequest> {
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public String getSwiftCode() {
return swiftCode;
}
public void setSwiftCode(String swiftCode) {
this.swiftCode = swiftCode;
}
public String getIntermediarySwiftCode() {
return intermediarySwiftCode;
}
public void setIntermediarySwiftCode(String intermediarySwiftCode) {
this.intermediarySwiftCode = intermediarySwiftCode;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBankAddress() {
return bankAddress;
}
public void setBankAddress(String bankAddress) {
this.bankAddress = bankAddress;
}
public String getBankSwiftCode() {
return bankSwiftCode;
}
public void setBankSwiftCode(String bankSwiftCode) {
this.bankSwiftCode = bankSwiftCode;
}
public String getBankAccount() {
return bankAccount;
}
public void setBankAccount(String bankAccount) {
this.bankAccount = bankAccount;
}
public String getBankName1() {
return bankName1;
}
public void setBankName1(String bankName1) {
this.bankName1 = bankName1;
}
public String getBankAddress1() {
return bankAddress1;
}
public void setBankAddress1(String bankAddress1) {
this.bankAddress1 = bankAddress1;
}
public String getBankAccount1() {
return bankAccount1;
}
public void setBankAccount1(String bankAccount1) {
this.bankAccount1 = bankAccount1;
}
public String getBankName2() {
return bankName2;
}
public void setBankName2(String bankName2) {
this.bankName2 = bankName2;
}
public String getBankAddress2() {
return bankAddress2;
}
public void setBankAddress2(String bankAddress2) {
this.bankAddress2 = bankAddress2;
}
public String getIntermediarySwiftCode2() {
return intermediarySwiftCode2;
}
public void setIntermediarySwiftCode2(String intermediarySwiftCode2) {
this.intermediarySwiftCode2 = intermediarySwiftCode2;
}
public String getBankAccount2() {
return bankAccount2;
}
public void setBankAccount2(String bankAccount2) {
this.bankAccount2 = bankAccount2;
}
public String getPersonalAccount() {
return personalAccount;
}
public void setPersonalAccount(String personalAccount) {
this.personalAccount = personalAccount;
}
public String getBudgetClassificationCode() {
return budgetClassificationCode;
}
public void setBudgetClassificationCode(String budgetClassificationCode) {
this.budgetClassificationCode = budgetClassificationCode;
}
public String getOktmo() {
return oktmo;
}
public void setOktmo(String oktmo) {
this.oktmo = oktmo;
}
}

View file

@ -38,10 +38,62 @@ public class BankAccountUpdateAction implements IAction<BankAccountUpdateRequest
@ApiModelProperty(value = "Код причины постановки (КПП)", example = "01")
@JsonProperty
private String taxRegistrationReasonCode;
@ApiModelProperty(value = "SWIFT", example = "ABCDE")
@JsonProperty
private String swiftCode;
@ApiModelProperty(value = "Код SWIFT посредника", example = "ABCDE")
@JsonProperty
private String intermediarySwiftCode;
@ApiModelProperty(value = "Номер счета", example = "11111222223333344444")
private String account;
@ApiModelProperty(value = "Наименование владельца счета", example = "ABCDE")
@JsonProperty
private String name;
@ApiModelProperty(value = "Адрес владельца счета", example = "ABCDE")
@JsonProperty
private String address;
@ApiModelProperty(value = "Место нахождения банка получателя средств", example = "ABCDE")
@JsonProperty
private String bankAddress;
@ApiModelProperty(value = "SWIFT банка получателя средств", example = "ABCDE")
@JsonProperty
private String bankSwiftCode;
@ApiModelProperty(value = "Номер счета банка получателя средств", example = "ABCDE")
@JsonProperty
private String bankAccount;
@ApiModelProperty(value = "Наименование банка-посредника 1", example = "ABCDE")
@JsonProperty
private String bankName1;
@ApiModelProperty(value = "Место нахождения банка-посредника 1", example = "ABCDE")
@JsonProperty
private String bankAddress1;
@ApiModelProperty(value = "Номер счета банка-посредника 1", example = "ABCDE")
@JsonProperty
private String bankAccount1;
@ApiModelProperty(value = "Наименование банка-посредника 2", example = "ABCDE")
@JsonProperty
private String bankName2;
@ApiModelProperty(value = "Место нахождения банка-посредника 2", example = "ABCDE")
@JsonProperty
private String bankAddress2;
@ApiModelProperty(value = "SWIFT банка-посредника 2", example = "ABCDE")
@JsonProperty
private String intermediarySwiftCode2;
@ApiModelProperty(value = "Номер счета банка-посредника 2", example = "ABCDE")
@JsonProperty
private String bankAccount2;
@ApiModelProperty(value = "Лицевой счет получателя", example = "ABCDE")
@JsonProperty
private String personalAccount;
@ApiModelProperty(value = "КБК", example = "ABCDE")
@JsonProperty
private String budgetClassificationCode;
@ApiModelProperty(value = "ОКТМО получателя средств", example = "ABCDE")
@JsonProperty
private String oktmo;
@Override
public BankAccountUpdateRequest toRequest() {
var req = new BankAccountUpdateRequest();
@ -55,6 +107,23 @@ public class BankAccountUpdateAction implements IAction<BankAccountUpdateRequest
req.setTaxpayerIdentificationNumber(this.taxpayerIdentificationNumber);
req.setTaxRegistrationReasonCode(this.taxRegistrationReasonCode);
req.setAccount(this.account);
req.setSwiftCode(swiftCode);
req.setIntermediarySwiftCode(intermediarySwiftCode);
req.setName(name);
req.setAddress(address);
req.setBankAddress(bankAddress);
req.setBankSwiftCode(bankSwiftCode);
req.setBankAccount(bankAccount);
req.setBankName1(bankName1);
req.setBankAddress1(bankAddress1);
req.setBankAccount1(bankAccount1);
req.setBankName2(bankName2);
req.setBankAddress2(bankAddress2);
req.setIntermediarySwiftCode2(intermediarySwiftCode2);
req.setBankAccount2(bankAccount2);
req.setPersonalAccount(personalAccount);
req.setBudgetClassificationCode(budgetClassificationCode);
req.setOktmo(oktmo);
return req;
}
@ -143,4 +212,140 @@ public class BankAccountUpdateAction implements IAction<BankAccountUpdateRequest
public void setAccount(String account) {
this.account = account;
}
public String getSwiftCode() {
return swiftCode;
}
public void setSwiftCode(String swiftCode) {
this.swiftCode = swiftCode;
}
public String getIntermediarySwiftCode() {
return intermediarySwiftCode;
}
public void setIntermediarySwiftCode(String intermediarySwiftCode) {
this.intermediarySwiftCode = intermediarySwiftCode;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBankAddress() {
return bankAddress;
}
public void setBankAddress(String bankAddress) {
this.bankAddress = bankAddress;
}
public String getBankSwiftCode() {
return bankSwiftCode;
}
public void setBankSwiftCode(String bankSwiftCode) {
this.bankSwiftCode = bankSwiftCode;
}
public String getBankAccount() {
return bankAccount;
}
public void setBankAccount(String bankAccount) {
this.bankAccount = bankAccount;
}
public String getBankName1() {
return bankName1;
}
public void setBankName1(String bankName1) {
this.bankName1 = bankName1;
}
public String getBankAddress1() {
return bankAddress1;
}
public void setBankAddress1(String bankAddress1) {
this.bankAddress1 = bankAddress1;
}
public String getBankAccount1() {
return bankAccount1;
}
public void setBankAccount1(String bankAccount1) {
this.bankAccount1 = bankAccount1;
}
public String getBankName2() {
return bankName2;
}
public void setBankName2(String bankName2) {
this.bankName2 = bankName2;
}
public String getBankAddress2() {
return bankAddress2;
}
public void setBankAddress2(String bankAddress2) {
this.bankAddress2 = bankAddress2;
}
public String getIntermediarySwiftCode2() {
return intermediarySwiftCode2;
}
public void setIntermediarySwiftCode2(String intermediarySwiftCode2) {
this.intermediarySwiftCode2 = intermediarySwiftCode2;
}
public String getBankAccount2() {
return bankAccount2;
}
public void setBankAccount2(String bankAccount2) {
this.bankAccount2 = bankAccount2;
}
public String getPersonalAccount() {
return personalAccount;
}
public void setPersonalAccount(String personalAccount) {
this.personalAccount = personalAccount;
}
public String getBudgetClassificationCode() {
return budgetClassificationCode;
}
public void setBudgetClassificationCode(String budgetClassificationCode) {
this.budgetClassificationCode = budgetClassificationCode;
}
public String getOktmo() {
return oktmo;
}
public void setOktmo(String oktmo) {
this.oktmo = oktmo;
}
}

View file

@ -31,6 +31,9 @@ public class ClientCodeNewAction implements IAction<ClientCodeNewRequest> {
@ApiModelProperty(value = "Номер депозитарного счета", example = "1234")
@JsonProperty
private Long depoAccountId;
@ApiModelProperty(value = "Список валютных счетов", example = "[1234,5678]")
@JsonProperty
private List<Long> currencyAccountList;
@ApiModelProperty(value = "Наименование статуса", example = "ACTV")
@JsonProperty
private String status;
@ -43,6 +46,7 @@ public class ClientCodeNewAction implements IAction<ClientCodeNewRequest> {
req.setTradingClearingRegistryId(this.tradingClearingRegistryId);
req.setMoneyAccountId(this.moneyAccountId);
req.setDepoAccountId(this.depoAccountId);
req.setCurrencyAccountList(this.currencyAccountList);
req.setStatus(this.status);
return req;
}
@ -93,6 +97,14 @@ public class ClientCodeNewAction implements IAction<ClientCodeNewRequest> {
this.depoAccountId = depoAccountId;
}
public List<Long> getCurrencyAccountList() {
return currencyAccountList;
}
public void setCurrencyAccountList(List<Long> currencyAccountList) {
this.currencyAccountList = currencyAccountList;
}
public String getStatus() {
return status;
}

View file

@ -32,6 +32,9 @@ public class ClientCodeUpdateAction implements IAction<ClientCodeUpdateRequest>
@ApiModelProperty(value = "Номер депозитарного счета", example = "1234")
@JsonProperty
private Long depoAccountId;
@ApiModelProperty(value = "Список валютных счетов", example = "[1234,5678]")
@JsonProperty
private List<Long> currencyAccountList;
@ApiModelProperty(value = "Наименование статуса", example = "ACTV")
@JsonProperty
private String status;
@ -46,6 +49,7 @@ public class ClientCodeUpdateAction implements IAction<ClientCodeUpdateRequest>
req.setTradingClearingRegistryId(this.tradingClearingRegistryId);
req.setMoneyAccountId(this.moneyAccountId);
req.setDepoAccountId(this.depoAccountId);
req.setCurrencyAccountList(this.currencyAccountList);
req.setStatus(this.status);
return req;
}
@ -104,6 +108,14 @@ public class ClientCodeUpdateAction implements IAction<ClientCodeUpdateRequest>
this.depoAccountId = depoAccountId;
}
public List<Long> getCurrencyAccountList() {
return currencyAccountList;
}
public void setCurrencyAccountList(List<Long> currencyAccountList) {
this.currencyAccountList = currencyAccountList;
}
public String getStatus() {
return status;
}

View file

@ -1,10 +1,15 @@
package ru.spcex.clearing.backendapi.controller.request.cud.company;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModelProperty;
import java.time.LocalDate;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanyInfoUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
public class CompanyInfoUpdateAction implements IAction<CompanyInfoUpdateRequest> {
@ApiModelProperty(hidden = true)
@ -47,6 +52,17 @@ public class CompanyInfoUpdateAction implements IAction<CompanyInfoUpdateRequest
@ApiModelProperty(value = "Наименование статуса", example = "ACTV")
@JsonProperty
private String workflowStatus;
@ApiModelProperty(value = "Налоговый номер", example = "ACTV")
@JsonProperty
private String taxNumber;
@ApiModelProperty(value = "Дата гос. регистрации", example = "2022-12-25")
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
private LocalDate registrationDate;
@ApiModelProperty(value = "Страна резидентства", example = "RUS")
@JsonProperty
private String residenceCode;
@Override
public CompanyInfoUpdateRequest toRequest() {
@ -63,7 +79,10 @@ public class CompanyInfoUpdateAction implements IAction<CompanyInfoUpdateRequest
request.setFullNameEng(this.fullNameEng);
request.setShortName(this.shortName);
request.setFullName(this.fullName);
request.setWorkflowStatus(workflowStatus);
request.setWorkflowStatus(this.workflowStatus);
request.setTaxNumber(this.taxNumber);
request.setRegistrationDate(this.registrationDate);
request.setResidenceCode(this.residenceCode);
return request;
}
@ -176,4 +195,28 @@ public class CompanyInfoUpdateAction implements IAction<CompanyInfoUpdateRequest
public void setWorkflowStatus(String workflowStatus) {
this.workflowStatus = workflowStatus;
}
public String getTaxNumber() {
return taxNumber;
}
public void setTaxNumber(String taxNumber) {
this.taxNumber = taxNumber;
}
public LocalDate getRegistrationDate() {
return registrationDate;
}
public void setRegistrationDate(LocalDate registrationDate) {
this.registrationDate = registrationDate;
}
public String getResidenceCode() {
return residenceCode;
}
public void setResidenceCode(String residenceCode) {
this.residenceCode = residenceCode;
}
}

View file

@ -0,0 +1,71 @@
package ru.spcex.clearing.backendapi.controller.request.cud.company;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanyRoleSetUpdateRequest;
public class CompanyRoleSetUpdateAction implements IAction<CompanyRoleSetUpdateRequest> {
@ApiModelProperty(hidden = true)
@JsonProperty
public Long id;
@ApiModelProperty(value = "Наименование компании", example = "1234")
@JsonProperty
Long companyId;
@ApiModelProperty(value = "Код роли компании", example = "ABCD")
@JsonProperty
String companyRole;
@ApiModelProperty(value = "Код статуса", example = "ACTV")
@JsonProperty
String workflowStatus;
@Override
public CompanyRoleSetUpdateRequest toRequest() {
var request = new CompanyRoleSetUpdateRequest();
request.setId(this.id);
request.setCompanyId(this.companyId);
request.setCompanyRole(this.companyRole);
request.setWorkflowStatus(this.workflowStatus);
return request;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.UPDATE;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public String getCompanyRole() {
return companyRole;
}
public void setCompanyRole(String companyRole) {
this.companyRole = companyRole;
}
public String getWorkflowStatus() {
return workflowStatus;
}
public void setWorkflowStatus(String workflowStatus) {
this.workflowStatus = workflowStatus;
}
}

View file

@ -0,0 +1,46 @@
package ru.spcex.clearing.backendapi.controller.request.cud.company;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.company.SettlementHousePropertyNewRequest;
public class SettlementHousePropertiesNewAction implements IAction<SettlementHousePropertyNewRequest> {
@ApiModelProperty(value = "Наименование компании", example = "1234")
@JsonProperty
Long companyId;
@ApiModelProperty(value = "Код валюты", example = "RUB")
@JsonProperty
String currencyCode;
@Override
public SettlementHousePropertyNewRequest toRequest() {
SettlementHousePropertyNewRequest request = new SettlementHousePropertyNewRequest();
request.setCompanyId(this.companyId);
request.setCurrencyCode(this.currencyCode);
return request;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.NEW;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public String getCurrencyCode() {
return currencyCode;
}
public void setCurrencyCode(String currencyCode) {
this.currencyCode = currencyCode;
}
}

View file

@ -0,0 +1,60 @@
package ru.spcex.clearing.backendapi.controller.request.cud.company;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.company.SettlementHousePropertyUpdateRequest;
public class SettlementHousePropertiesUpdateAction implements IAction<SettlementHousePropertyUpdateRequest> {
@ApiModelProperty(hidden = true)
@JsonProperty
private Long id;
@ApiModelProperty(value = "Наименование компании", example = "1234")
@JsonProperty
Long companyId;
@ApiModelProperty(value = "Код валюты", example = "RUB")
@JsonProperty
String currencyCode;
@Override
public SettlementHousePropertyUpdateRequest toRequest() {
SettlementHousePropertyUpdateRequest request = new SettlementHousePropertyUpdateRequest();
request.setId(this.id);
request.setCompanyId(this.companyId);
request.setCurrencyCode(this.currencyCode);
return request;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.UPDATE;
}
@ApiModelProperty(hidden = true)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public String getCurrencyCode() {
return currencyCode;
}
public void setCurrencyCode(String currencyCode) {
this.currencyCode = currencyCode;
}
}

View file

@ -26,12 +26,15 @@ public class ChangeRefundDateActionNew implements IAction<RegistryChangeRefundDa
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
public LocalDate refundDate;
@JsonProperty
public String market;
@Override
public RegistryChangeRefundDateRequest toRequest() {
var req = new RegistryChangeRefundDateRequest();
req.setGroupId(groupId);
req.setRefundDate(refundDate);
req.setMarket(market);
return req;
}
@ -68,4 +71,12 @@ public class ChangeRefundDateActionNew implements IAction<RegistryChangeRefundDa
public void setRefundDate(LocalDate refundDate) {
this.refundDate = refundDate;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
}

View file

@ -4,21 +4,13 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.time.LocalDate;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.backendapi.errors.BackEndError;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistrySplitDepositActionRequest;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class RSplitDepositActionNew implements IAction<RegistrySplitDepositActionRequest> {
@ -39,6 +31,8 @@ public class RSplitDepositActionNew implements IAction<RegistrySplitDepositActio
@ApiModelProperty(value = "Направление", example = "OUT")
@JsonProperty
public String direction;
@JsonProperty
public String market;
@Override
@ -49,6 +43,7 @@ public class RSplitDepositActionNew implements IAction<RegistrySplitDepositActio
req.setRefundDate(this.refundDate);
req.setContract(this.contract);
req.setDirection(this.direction);
req.setMarket(this.market);
return req;
}
@ -97,4 +92,12 @@ public class RSplitDepositActionNew implements IAction<RegistrySplitDepositActio
public void setDirection(String direction) {
this.direction = direction;
}
public String getMarket() {
return market;
}
public void setMarket(String market) {
this.market = market;
}
}

View file

@ -0,0 +1,52 @@
package ru.spcex.clearing.backendapi.controller.request.cud.registry;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListNewRequest;
import java.util.List;
public class TradingClearingRegistryListNewAction implements IAction<TradingClearingRegistryListNewRequest> {
@ApiModelProperty(value = "Торгово-клиринговый регистр", example = "1200")
@JsonProperty
private Long tradingClearingRegistryId;
@ApiModelProperty(value = "Идентификатор валютного счёта", example = "123")
@JsonProperty
private Long accountId;
// @ApiModelProperty(value = "Наименование статуса", example = "ACTV", required = false)
// @JsonProperty
// private String status;
@Override
public TradingClearingRegistryListNewRequest toRequest() {
var req = new TradingClearingRegistryListNewRequest();
req.setTradingClearingRegistryId(this.tradingClearingRegistryId);
req.setAccountId(this.accountId);
// req.setStatus(this.status);
return req;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.NEW;
}
public Long getTradingClearingRegistryId() {
return tradingClearingRegistryId;
}
public void setTradingClearingRegistryId(Long tradingClearingRegistryId) {
this.tradingClearingRegistryId = tradingClearingRegistryId;
}
public Long getAccountId() {
return accountId;
}
public void setAccountId(Long accountId) {
this.accountId = accountId;
}
}

View file

@ -0,0 +1,50 @@
package ru.spcex.clearing.backendapi.controller.request.cud.registry;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryListUpdateRequest;
import java.util.List;
public class TradingClearingRegistryListUpdateAction implements IAction<TradingClearingRegistryListUpdateRequest> {
@ApiModelProperty(hidden = true)
@JsonProperty
public Long id;
@ApiModelProperty(value = "Наименование статуса", example = "ACTV")
@JsonProperty
private String status;
@Override
public TradingClearingRegistryListUpdateRequest toRequest() {
var req = new TradingClearingRegistryListUpdateRequest();
req.setId(this.id);
req.setStatus(this.status);
return req;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.UPDATE;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}

View file

@ -26,6 +26,9 @@ public class TradingClearingRegistryNewAction implements IAction<TradingClearing
@ApiModelProperty(value = "Наименование статуса", example = "ACTV")
@JsonProperty
private String status;
@ApiModelProperty(value = "Тип ТКР", example = "A")
@JsonProperty
private String tradingClearingRegistryType;
@Override
@ -35,6 +38,7 @@ public class TradingClearingRegistryNewAction implements IAction<TradingClearing
req.setMoneyAccountId(this.moneyAccountId);
req.setDepoAccountId(this.depoAccountId);
req.setStatus(this.status);
req.setTradingClearingRegistryType(tradingClearingRegistryType);
return req;
}
@ -75,4 +79,12 @@ public class TradingClearingRegistryNewAction implements IAction<TradingClearing
public void setStatus(String status) {
this.status = status;
}
public String getTradingClearingRegistryType() {
return tradingClearingRegistryType;
}
public void setTradingClearingRegistryType(String tradingClearingRegistryType) {
this.tradingClearingRegistryType = tradingClearingRegistryType;
}
}

View file

@ -1,15 +1,23 @@
package ru.spcex.clearing.backendapi.controller.request.cud.schedule;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.backendapi.errors.BackEndError;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalTimeDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalTimeSerializer;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@ -60,9 +68,30 @@ public class LauncherNew implements IAction<Object> {
@ApiModelProperty(value = "Участник получатель", example = "1000")
@JsonProperty
private Long addresseeId;
@ApiModelProperty(value = "Корреспондентский счет", example = "1000")
@JsonProperty
private Long correspondentAccountId;
@ApiModelProperty(value = "Наименование счета получателя", example = "1000")
@JsonProperty
private Long debitLeg_accountId;
@ApiModelProperty(value = "SWIFT", example = "ABCDE")
@JsonProperty
private String swiftCode;
@ApiModelProperty(value = "Время", dataType = "java.lang.String", example = "16:30:00")
@JsonSerialize(using = LocalTimeSerializer.class)
@JsonDeserialize(using = LocalTimeDeserializer.class)
@JsonProperty
public LocalTime fromTime;
@ApiModelProperty(value = "Дата с", example = "2024-01-02")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
public LocalDate fromDate;
@ApiModelProperty(value = "Дата по", example = "2024-03-02")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
public LocalDate toDate;
@Override
public Object toRequest() {
@ -83,6 +112,10 @@ public class LauncherNew implements IAction<Object> {
taskRunnerCommandRequest.setCreditLeg_accountId(creditLeg_accountId);
taskRunnerCommandRequest.setAddresseeId(addresseeId);
taskRunnerCommandRequest.setDebitLeg_accountId(debitLeg_accountId);
taskRunnerCommandRequest.setFromTime(fromTime);
taskRunnerCommandRequest.setSwiftCode(swiftCode);
taskRunnerCommandRequest.setFromDate(fromDate);
taskRunnerCommandRequest.setToDate(toDate);
return taskRunnerCommandRequest;
}
@ -212,6 +245,14 @@ public class LauncherNew implements IAction<Object> {
this.addresseeId = addresseeId;
}
public Long getCorrespondentAccountId() {
return correspondentAccountId;
}
public void setCorrespondentAccountId(Long correspondentAccountId) {
this.correspondentAccountId = correspondentAccountId;
}
public Long getDebitLeg_accountId() {
return debitLeg_accountId;
}
@ -220,6 +261,14 @@ public class LauncherNew implements IAction<Object> {
this.debitLeg_accountId = debitLeg_accountId;
}
public String getSwiftCode() {
return swiftCode;
}
public void setSwiftCode(String swiftCode) {
this.swiftCode = swiftCode;
}
public BigDecimal getFullBalance() {
return fullBalance;
}
@ -227,4 +276,28 @@ public class LauncherNew implements IAction<Object> {
public void setFullBalance(BigDecimal fullBalance) {
this.fullBalance = fullBalance;
}
public LocalTime getFromTime() {
return fromTime;
}
public void setFromTime(LocalTime fromTime) {
this.fromTime = fromTime;
}
public LocalDate getFromDate() {
return fromDate;
}
public void setFromDate(LocalDate fromDate) {
this.fromDate = fromDate;
}
public LocalDate getToDate() {
return toDate;
}
public void setToDate(LocalDate toDate) {
this.toDate = toDate;
}
}

View file

@ -0,0 +1,143 @@
package ru.spcex.clearing.backendapi.controller.request.cud.securities;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecurityNewRequest;
import ru.spcex.platform.classes.base.interfaces.WithSecuritySymbol;
import java.math.BigDecimal;
public class CurrencyPairSecurityNewAction implements IAction<CurrencyPairSecurityNewRequest>, WithSecuritySymbol {
@ApiModelProperty(value = "Наименование типа инструмента", example = "CDE")
@JsonProperty
public String instrumentType;
@ApiModelProperty(value = "Код инструмента", example = "CDE")
@JsonProperty
public String securitySymbol;
@ApiModelProperty(value = "Краткое наименование инструмента", example = "NAME")
@JsonProperty
public String shortName;
@ApiModelProperty(value = "Полное наименование инструмента", example = "NAME of NAME")
@JsonProperty
public String fullName;
@ApiModelProperty(value = "Валютная пара", example = "1234")
@JsonProperty
public Long currencyPairId;
// @ApiModelProperty(value = "Размер лота", example = "12.33")
// @JsonProperty
// public BigDecimal lotSize;
// @ApiModelProperty(value = "Шаг цены", example = "12.33")
// @JsonProperty
// public BigDecimal minStep;
@ApiModelProperty(value = "Количество валюты лота", example = "12.33")
@JsonProperty
public BigDecimal baseUnitSize;
@ApiModelProperty(value = "Наименование статуса", example = "CDE")
@JsonProperty
public String settlementType;
@ApiModelProperty(value = "Наименование статуса", example = "CDE")
@JsonProperty
public String workflowStatus;
@ApiModelProperty(value = "Наименование клиринговой организации", example = "NAME")
@JsonProperty
public String clearingOrganization;
@Override
public CurrencyPairSecurityNewRequest toRequest() {
var req = new CurrencyPairSecurityNewRequest();
req.setInstrumentType(this.getInstrumentType());
req.setSecuritySymbol(this.getSecuritySymbol());
req.setShortName(this.getShortName());
req.setFullName(this.getFullName());
req.setCurrencyPairId(this.getCurrencyPairId());
// req.setLotSize(this.getLotSize());
// req.setMinStep(this.getMinStep());
req.setBaseUnitSize(this.getBaseUnitSize());
req.setSettlementType(this.getSettlementType());
req.setWorkflowStatus(this.getWorkflowStatus());
req.setClearingOrganization(this.getClearingOrganization());
return req;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.NEW;
}
public String getInstrumentType() {
return instrumentType;
}
public void setInstrumentType(String instrumentType) {
this.instrumentType = instrumentType;
}
@Override
public String getSecuritySymbol() {
return securitySymbol;
}
public void setSecuritySymbol(String securitySymbol) {
this.securitySymbol = securitySymbol;
}
public String getShortName() {
return shortName;
}
public void setShortName(String shortName) {
this.shortName = shortName;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public Long getCurrencyPairId() {
return currencyPairId;
}
public void setCurrencyPairId(Long currencyPairId) {
this.currencyPairId = currencyPairId;
}
public BigDecimal getBaseUnitSize() {
return baseUnitSize;
}
public void setBaseUnitSize(BigDecimal baseUnitSize) {
this.baseUnitSize = baseUnitSize;
}
public String getSettlementType() {
return settlementType;
}
public void setSettlementType(String settlementType) {
this.settlementType = settlementType;
}
public String getWorkflowStatus() {
return workflowStatus;
}
public void setWorkflowStatus(String workflowStatus) {
this.workflowStatus = workflowStatus;
}
public String getClearingOrganization() {
return clearingOrganization;
}
public void setClearingOrganization(String clearingOrganization) {
this.clearingOrganization = clearingOrganization;
}
}

View file

@ -0,0 +1,156 @@
package ru.spcex.clearing.backendapi.controller.request.cud.securities;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.security.CurrencyPairSecurityUpdateRequest;
import ru.spcex.platform.classes.base.interfaces.WithId;
import java.math.BigDecimal;
public class CurrencyPairSecurityUpdateAction implements IAction<CurrencyPairSecurityUpdateRequest>, WithId {
@ApiModelProperty(hidden = true)
@JsonProperty
public Long id;
@ApiModelProperty(value = "Наименование типа инструмента", example = "CDE")
@JsonProperty
public String instrumentType;
@ApiModelProperty(value = "Код инструмента", example = "CDE")
@JsonProperty
public String securitySymbol;
@ApiModelProperty(value = "Краткое наименование инструмента", example = "NAME")
@JsonProperty
public String shortName;
@ApiModelProperty(value = "Полное наименование инструмента", example = "NAME of NAME")
@JsonProperty
public String fullName;
@ApiModelProperty(value = "Валютная пара", example = "1234")
@JsonProperty
public Long currencyPairId;
// @ApiModelProperty(value = "Размер лота", example = "12.33")
// @JsonProperty
// public BigDecimal lotSize;
// @ApiModelProperty(value = "Шаг цены", example = "12.33")
// @JsonProperty
// public BigDecimal minStep;
@ApiModelProperty(value = "Количество валюты лота", example = "12.33")
@JsonProperty
public BigDecimal baseUnitSize;
@ApiModelProperty(value = "Наименование статуса", example = "CDE")
@JsonProperty
public String settlementType;
@ApiModelProperty(value = "Наименование статуса", example = "CDE")
@JsonProperty
public String workflowStatus;
@ApiModelProperty(value = "Наименование клиринговой организации", example = "NAME")
@JsonProperty
public String clearingOrganization;
@Override
public CurrencyPairSecurityUpdateRequest toRequest() {
var req = new CurrencyPairSecurityUpdateRequest();
req.setId(this.getId());
req.setInstrumentType(this.getInstrumentType());
req.setSecuritySymbol(this.getSecuritySymbol());
req.setShortName(this.getShortName());
req.setFullName(this.getFullName());
req.setCurrencyPairId(this.getCurrencyPairId());
// req.setLotSize(this.getLotSize());
// req.setMinStep(this.getMinStep());
req.setBaseUnitSize(this.getBaseUnitSize());
req.setSettlementType(this.getSettlementType());
req.setWorkflowStatus(this.getWorkflowStatus());
req.setClearingOrganization(this.getClearingOrganization());
return req;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.UPDATE;
}
@Override
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getInstrumentType() {
return instrumentType;
}
public void setInstrumentType(String instrumentType) {
this.instrumentType = instrumentType;
}
public String getSecuritySymbol() {
return securitySymbol;
}
public void setSecuritySymbol(String securitySymbol) {
this.securitySymbol = securitySymbol;
}
public String getShortName() {
return shortName;
}
public void setShortName(String shortName) {
this.shortName = shortName;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public Long getCurrencyPairId() {
return currencyPairId;
}
public void setCurrencyPairId(Long currencyPairId) {
this.currencyPairId = currencyPairId;
}
public BigDecimal getBaseUnitSize() {
return baseUnitSize;
}
public void setBaseUnitSize(BigDecimal baseUnitSize) {
this.baseUnitSize = baseUnitSize;
}
public String getSettlementType() {
return settlementType;
}
public void setSettlementType(String settlementType) {
this.settlementType = settlementType;
}
public String getWorkflowStatus() {
return workflowStatus;
}
public void setWorkflowStatus(String workflowStatus) {
this.workflowStatus = workflowStatus;
}
public String getClearingOrganization() {
return clearingOrganization;
}
public void setClearingOrganization(String clearingOrganization) {
this.clearingOrganization = clearingOrganization;
}
}

View file

@ -0,0 +1,233 @@
package ru.spcex.clearing.backendapi.controller.request.cud.securities;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
import java.time.LocalDate;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.DigitalCertificateSecurityNewRequest;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.platform.classes.base.interfaces.WithSecuritySymbol;
public class DigitalCertificateSecurityNewAction implements IAction<DigitalCertificateSecurityNewRequest>, WithSecuritySymbol {
@ApiModelProperty(value = "Наименование типа инструмента", example = "CDE")
@JsonProperty
public String instrumentType;
@ApiModelProperty(value = "Код ЦС, присвоенный депозитарием")
@JsonProperty
public String baseCode;
@ApiModelProperty(value = "Код инструмента", example = "CDE")
@JsonProperty
public String securitySymbol;
@ApiModelProperty(value = "Краткое наименование инструмента", example = "NAME")
@JsonProperty
public String shortName;
@ApiModelProperty(value = "Полное наименование инструмента", example = "NAME of NAME")
@JsonProperty
public String fullName;
@ApiModelProperty(value = "Наименование эмитента", example = "1000")
@JsonProperty
public Long issuerId;
@ApiModelProperty(value = "Краткое наименование инструмента на английском", example = "ABSDE")
@JsonProperty
public String shortNameEng;
@ApiModelProperty(value = "Полное наименование инструмента на английском", example = "ABCD")
@JsonProperty
public String fullNameEng;
@ApiModelProperty(value = "Наименование статуса", example = "ABCD")
@JsonProperty
public String workflowStatus;
@ApiModelProperty(value = "Количество валюты лота", example = "12.33")
@JsonProperty
public Long baseUnitSize;
@ApiModelProperty(value = "Пределы изменения цены")
@JsonProperty
public BigDecimal priceVarianceLimit;
@ApiModelProperty(value = "Тип индексации номинала (linked to nominalTypeCode)")
@JsonProperty
public String nominalTypeCode;
@ApiModelProperty(value = "Номинал", example = "20.5554")
@JsonProperty
public BigDecimal nominalValue;
@ApiModelProperty(value = "Индексируемый номинал")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
public LocalDate nominalIndexationDate;
@ApiModelProperty(value = "Дата индексации номинала")
@JsonProperty
public String nominalIndexationSign;
@ApiModelProperty(value = "Фактическая индексация (linked to allowed)")
@JsonProperty
public String settlementHouse;
@ApiModelProperty(value = "Наименование расчетной организации")
@JsonProperty
public String depository;
@Override
public DigitalCertificateSecurityNewRequest toRequest() {
var req = new DigitalCertificateSecurityNewRequest();
req.setInstrumentType(this.instrumentType);
req.setBaseCode(this.baseCode);
req.setSecuritySymbol(this.securitySymbol);
req.setShortName(this.shortName);
req.setFullName(this.fullName);
req.setIssuerId(this.issuerId);
req.setShortNameEng(this.shortNameEng);
req.setFullNameEng(this.fullNameEng);
req.setWorkflowStatus(this.workflowStatus);
req.setBaseUnitSize(this.baseUnitSize);
req.setPriceVarianceLimit(this.priceVarianceLimit);
req.setNominalTypeCode(this.nominalTypeCode);
req.setNominalValue(this.nominalValue);
req.setNominalIndexationDate(this.nominalIndexationDate);
req.setNominalIndexationSign(this.nominalIndexationSign);
req.setSettlementHouse(this.settlementHouse);
req.setDepository(this.depository);
return req;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.NEW;
}
public String getInstrumentType() {
return instrumentType;
}
public void setInstrumentType(String instrumentType) {
this.instrumentType = instrumentType;
}
public String getBaseCode() {
return baseCode;
}
public void setBaseCode(String baseCode) {
this.baseCode = baseCode;
}
@Override
public String getSecuritySymbol() {
return securitySymbol;
}
public void setSecuritySymbol(String securitySymbol) {
this.securitySymbol = securitySymbol;
}
public String getShortName() {
return shortName;
}
public void setShortName(String shortName) {
this.shortName = shortName;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public Long getIssuerId() {
return issuerId;
}
public void setIssuerId(Long issuerId) {
this.issuerId = issuerId;
}
public String getShortNameEng() {
return shortNameEng;
}
public void setShortNameEng(String shortNameEng) {
this.shortNameEng = shortNameEng;
}
public String getFullNameEng() {
return fullNameEng;
}
public void setFullNameEng(String fullNameEng) {
this.fullNameEng = fullNameEng;
}
public String getWorkflowStatus() {
return workflowStatus;
}
public void setWorkflowStatus(String workflowStatus) {
this.workflowStatus = workflowStatus;
}
public Long getBaseUnitSize() {
return baseUnitSize;
}
public void setBaseUnitSize(Long baseUnitSize) {
this.baseUnitSize = baseUnitSize;
}
public BigDecimal getPriceVarianceLimit() {
return priceVarianceLimit;
}
public void setPriceVarianceLimit(BigDecimal priceVarianceLimit) {
this.priceVarianceLimit = priceVarianceLimit;
}
public String getNominalTypeCode() {
return nominalTypeCode;
}
public void setNominalTypeCode(String nominalTypeCode) {
this.nominalTypeCode = nominalTypeCode;
}
public BigDecimal getNominalValue() {
return nominalValue;
}
public void setNominalValue(BigDecimal nominalValue) {
this.nominalValue = nominalValue;
}
public LocalDate getNominalIndexationDate() {
return nominalIndexationDate;
}
public void setNominalIndexationDate(LocalDate nominalIndexationDate) {
this.nominalIndexationDate = nominalIndexationDate;
}
public String getNominalIndexationSign() {
return nominalIndexationSign;
}
public void setNominalIndexationSign(String nominalIndexationSign) {
this.nominalIndexationSign = nominalIndexationSign;
}
public String getSettlementHouse() {
return settlementHouse;
}
public void setSettlementHouse(String settlementHouse) {
this.settlementHouse = settlementHouse;
}
public String getDepository() {
return depository;
}
public void setDepository(String depository) {
this.depository = depository;
}
}

View file

@ -0,0 +1,245 @@
package ru.spcex.clearing.backendapi.controller.request.cud.securities;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
import java.time.LocalDate;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.DigitalCertificateSecurityUpdateRequest;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.platform.classes.base.interfaces.WithSecuritySymbol;
public class DigitalCertificateSecurityUpdateAction implements IAction<DigitalCertificateSecurityUpdateRequest>, WithSecuritySymbol {
@ApiModelProperty(hidden = true)
@JsonProperty
public Long id;
@ApiModelProperty(value = "Наименование типа инструмента", example = "CDE")
@JsonProperty
public String instrumentType;
@ApiModelProperty(value = "Код ЦС, присвоенный депозитарием")
@JsonProperty
public String baseCode;
@ApiModelProperty(value = "Код инструмента", example = "CDE")
@JsonProperty
public String securitySymbol;
@ApiModelProperty(value = "Краткое наименование инструмента", example = "NAME")
@JsonProperty
public String shortName;
@ApiModelProperty(value = "Полное наименование инструмента", example = "NAME of NAME")
@JsonProperty
public String fullName;
@ApiModelProperty(value = "Наименование эмитента", example = "1000")
@JsonProperty
public Long issuerId;
@ApiModelProperty(value = "Краткое наименование инструмента на английском", example = "ABSDE")
@JsonProperty
public String shortNameEng;
@ApiModelProperty(value = "Полное наименование инструмента на английском", example = "ABCD")
@JsonProperty
public String fullNameEng;
@ApiModelProperty(value = "Наименование статуса", example = "ABCD")
@JsonProperty
public String workflowStatus;
@ApiModelProperty(value = "Количество валюты лота", example = "12.33")
@JsonProperty
public Long baseUnitSize;
@ApiModelProperty(value = "Пределы изменения цены")
@JsonProperty
public BigDecimal priceVarianceLimit;
@ApiModelProperty(value = "Тип индексации номинала (linked to nominalTypeCode)")
@JsonProperty
public String nominalTypeCode;
@ApiModelProperty(value = "Номинал", example = "20.5554")
@JsonProperty
public BigDecimal nominalValue;
@ApiModelProperty(value = "Индексируемый номинал")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
public LocalDate nominalIndexationDate;
@ApiModelProperty(value = "Дата индексации номинала")
@JsonProperty
public String nominalIndexationSign;
@ApiModelProperty(value = "Фактическая индексация (linked to allowed)")
@JsonProperty
public String settlementHouse;
@ApiModelProperty(value = "Наименование расчетной организации")
@JsonProperty
public String depository;
@Override
public DigitalCertificateSecurityUpdateRequest toRequest() {
var req = new DigitalCertificateSecurityUpdateRequest();
req.setId(this.id);
req.setInstrumentType(this.instrumentType);
req.setBaseCode(this.baseCode);
req.setSecuritySymbol(this.securitySymbol);
req.setShortName(this.shortName);
req.setFullName(this.fullName);
req.setIssuerId(this.issuerId);
req.setShortNameEng(this.shortNameEng);
req.setFullNameEng(this.fullNameEng);
req.setWorkflowStatus(this.workflowStatus);
req.setBaseUnitSize(this.baseUnitSize);
req.setPriceVarianceLimit(this.priceVarianceLimit);
req.setNominalTypeCode(this.nominalTypeCode);
req.setNominalValue(this.nominalValue);
req.setNominalIndexationDate(this.nominalIndexationDate);
req.setNominalIndexationSign(this.nominalIndexationSign);
req.setSettlementHouse(this.settlementHouse);
req.setDepository(this.depository);
return req;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.UPDATE;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getInstrumentType() {
return instrumentType;
}
public void setInstrumentType(String instrumentType) {
this.instrumentType = instrumentType;
}
public String getBaseCode() {
return baseCode;
}
public void setBaseCode(String baseCode) {
this.baseCode = baseCode;
}
@Override
public String getSecuritySymbol() {
return securitySymbol;
}
public void setSecuritySymbol(String securitySymbol) {
this.securitySymbol = securitySymbol;
}
public String getShortName() {
return shortName;
}
public void setShortName(String shortName) {
this.shortName = shortName;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public Long getIssuerId() {
return issuerId;
}
public void setIssuerId(Long issuerId) {
this.issuerId = issuerId;
}
public String getShortNameEng() {
return shortNameEng;
}
public void setShortNameEng(String shortNameEng) {
this.shortNameEng = shortNameEng;
}
public String getFullNameEng() {
return fullNameEng;
}
public void setFullNameEng(String fullNameEng) {
this.fullNameEng = fullNameEng;
}
public String getWorkflowStatus() {
return workflowStatus;
}
public void setWorkflowStatus(String workflowStatus) {
this.workflowStatus = workflowStatus;
}
public Long getBaseUnitSize() {
return baseUnitSize;
}
public void setBaseUnitSize(Long baseUnitSize) {
this.baseUnitSize = baseUnitSize;
}
public BigDecimal getPriceVarianceLimit() {
return priceVarianceLimit;
}
public void setPriceVarianceLimit(BigDecimal priceVarianceLimit) {
this.priceVarianceLimit = priceVarianceLimit;
}
public String getNominalTypeCode() {
return nominalTypeCode;
}
public void setNominalTypeCode(String nominalTypeCode) {
this.nominalTypeCode = nominalTypeCode;
}
public BigDecimal getNominalValue() {
return nominalValue;
}
public void setNominalValue(BigDecimal nominalValue) {
this.nominalValue = nominalValue;
}
public LocalDate getNominalIndexationDate() {
return nominalIndexationDate;
}
public void setNominalIndexationDate(LocalDate nominalIndexationDate) {
this.nominalIndexationDate = nominalIndexationDate;
}
public String getNominalIndexationSign() {
return nominalIndexationSign;
}
public void setNominalIndexationSign(String nominalIndexationSign) {
this.nominalIndexationSign = nominalIndexationSign;
}
public String getSettlementHouse() {
return settlementHouse;
}
public void setSettlementHouse(String settlementHouse) {
this.settlementHouse = settlementHouse;
}
public String getDepository() {
return depository;
}
public void setDepository(String depository) {
this.depository = depository;
}
}

View file

@ -4,21 +4,13 @@ import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
import java.time.LocalDate;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.backendapi.errors.BackEndError;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.FixedIncomeSecurityNewRequest;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.platform.classes.base.interfaces.WithSecuritySymbol;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.text.TextUtil;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class FixedIncomeSecurityNewAction implements IAction<FixedIncomeSecurityNewRequest>, WithSecuritySymbol {
@ApiModelProperty(value = "Код инструмента", example = "ABSDEFJ")

View file

@ -0,0 +1,79 @@
package ru.spcex.clearing.backendapi.controller.request.cud.securities;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
import java.time.LocalDate;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.security.RatesNewRequest;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
public class RatesNewAction implements IAction<RatesNewRequest> {
@ApiModelProperty(value = "Курс.", example = "1234")
@JsonProperty
private BigDecimal value;
@ApiModelProperty(value = "Дата.", example = "1234")
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
private LocalDate valueDate;
@ApiModelProperty(value = "Валюта.", example = "1234")
@JsonProperty
private Long currencyId;
@ApiModelProperty(value = "Статус.", example = "1234")
@JsonProperty
private String status;
@Override
public RatesNewRequest toRequest() {
RatesNewRequest request = new RatesNewRequest();
request.setValue(this.value);
request.setValueDate(this.valueDate);
request.setCurrencyId(this.currencyId);
request.setStatus(this.status);
return request;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.NEW;
}
public BigDecimal getValue() {
return value;
}
public void setValue(BigDecimal value) {
this.value = value;
}
public LocalDate getValueDate() {
return valueDate;
}
public void setValueDate(LocalDate valueDate) {
this.valueDate = valueDate;
}
public Long getCurrencyId() {
return currencyId;
}
public void setCurrencyId(Long currencyPairId) {
this.currencyId = currencyPairId;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}

View file

@ -0,0 +1,60 @@
package ru.spcex.clearing.backendapi.controller.request.cud.securities;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.security.RatesUpdateRequest;
public class RatesUpdateAction implements IAction<RatesUpdateRequest> {
@ApiModelProperty(hidden = true)
@JsonProperty
public Long id;
@ApiModelProperty(value = "Курс.", example = "1234")
@JsonProperty
private BigDecimal value;
@ApiModelProperty(value = "Статус.", example = "1234")
@JsonProperty
private String status;
@Override
public RatesUpdateRequest toRequest() {
RatesUpdateRequest request = new RatesUpdateRequest();
request.setId(this.id);
request.setValue(this.value);
request.setStatus(this.status);
return request;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.NEW;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public BigDecimal getValue() {
return value;
}
public void setValue(BigDecimal value) {
this.value = value;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}

View file

@ -0,0 +1,72 @@
package ru.spcex.clearing.backendapi.controller.request.cud.securities;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.security.RiskParameterNewRequest;
public class RiskParameterNewAction implements IAction<RiskParameterNewRequest> {
@ApiModelProperty(value = "Курс.", example = "1234")
@JsonProperty
private BigDecimal value;
@ApiModelProperty(value = "Код расчёта.", example = "1234")
@JsonProperty
private String settlementType;
@ApiModelProperty(value = "Валютная пара.", example = "1234")
@JsonProperty
private Long currencyPairId;
@ApiModelProperty(value = "Статус.", example = "1234")
@JsonProperty
private String status;
@Override
public RiskParameterNewRequest toRequest() {
RiskParameterNewRequest request = new RiskParameterNewRequest();
request.setValue(this.value);
request.setSettlementType(this.settlementType);
request.setCurrencyPairId(this.currencyPairId);
request.setStatus(this.status);
return request;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.NEW;
}
public BigDecimal getValue() {
return value;
}
public void setValue(BigDecimal value) {
this.value = value;
}
public String getSettlementType() {
return settlementType;
}
public void setSettlementType(String settlementType) {
this.settlementType = settlementType;
}
public Long getCurrencyPairId() {
return currencyPairId;
}
public void setCurrencyPairId(Long currencyPairId) {
this.currencyPairId = currencyPairId;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}

View file

@ -0,0 +1,60 @@
package ru.spcex.clearing.backendapi.controller.request.cud.securities;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.security.RiskParameterUpdateRequest;
public class RiskParameterUpdateAction implements IAction<RiskParameterUpdateRequest> {
@ApiModelProperty(hidden = true)
@JsonProperty
public Long id;
@ApiModelProperty(value = "Курс.", example = "1234")
@JsonProperty
private BigDecimal value;
@ApiModelProperty(value = "Статус.", example = "1234")
@JsonProperty
private String status;
@Override
public RiskParameterUpdateRequest toRequest() {
RiskParameterUpdateRequest request = new RiskParameterUpdateRequest();
request.setId(this.id);
request.setValue(this.value);
request.setStatus(this.status);
return request;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.NEW;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public BigDecimal getValue() {
return value;
}
public void setValue(BigDecimal value) {
this.value = value;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}

View file

@ -0,0 +1,33 @@
package ru.spcex.clearing.backendapi.controller.request.cud.session;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.session.SessionActionRequest;
public class ContinueSessionAction implements IAction<SessionActionRequest> {
@ApiModelProperty(value = "Идентификатор задачи", example = "ADBC")
@JsonProperty
public Long id;
@Override
public SessionActionRequest toRequest() {
SessionActionRequest request = new SessionActionRequest();
request.setSessionId(this.id);
return request;
}
@Override
public ActionType getActionType() {
return ActionType.SYSTEM;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}

View file

@ -0,0 +1,58 @@
package ru.spcex.clearing.backendapi.controller.request.cud.settings;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.misc.ValidationSymbolsNewRequest;
public class ValidationSymbolsNewAction implements IAction<ValidationSymbolsNewRequest> {
@ApiModelProperty(value = "Код группы символов", example = "CDE")
@JsonProperty
private String code;
@ApiModelProperty(value = "Допустимые символы", example = "CDE")
@JsonProperty
private String symbols;
@ApiModelProperty(value = "Описание группы символов", example = "CDE")
@JsonProperty
private String comment;
@Override
public ValidationSymbolsNewRequest toRequest() {
ValidationSymbolsNewRequest validationSymbolsNewRequest = new ValidationSymbolsNewRequest();
validationSymbolsNewRequest.setCode(this.code);
validationSymbolsNewRequest.setSymbols(this.symbols);
validationSymbolsNewRequest.setComment(this.comment);
return validationSymbolsNewRequest;
}
@Override
public ActionType getActionType() {
return ActionType.NEW;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getSymbols() {
return symbols;
}
public void setSymbols(String symbols) {
this.symbols = symbols;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
}

View file

@ -0,0 +1,70 @@
package ru.spcex.clearing.backendapi.controller.request.cud.settings;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.misc.ValidationSymbolsUpdateRequest;
public class ValidationSymbolsUpdateAction implements IAction<ValidationSymbolsUpdateRequest> {
@ApiModelProperty(hidden = true)
@JsonProperty
public Long id;
@ApiModelProperty(value = "Код группы символов", example = "CDE")
@JsonProperty
private String code;
@ApiModelProperty(value = "Допустимые символы", example = "CDE")
@JsonProperty
private String symbols;
@ApiModelProperty(value = "Описание группы символов", example = "CDE")
@JsonProperty
private String comment;
@Override
public ValidationSymbolsUpdateRequest toRequest() {
ValidationSymbolsUpdateRequest validationSymbolsUpdateRequest = new ValidationSymbolsUpdateRequest();
validationSymbolsUpdateRequest.setId(this.id);
validationSymbolsUpdateRequest.setCode(this.code);
validationSymbolsUpdateRequest.setSymbols(this.symbols);
validationSymbolsUpdateRequest.setComment(this.comment);
return validationSymbolsUpdateRequest;
}
@Override
public ActionType getActionType() {
return ActionType.UPDATE;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getSymbols() {
return symbols;
}
public void setSymbols(String symbols) {
this.symbols = symbols;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
}

View file

@ -1,9 +1,14 @@
package ru.spcex.clearing.backendapi.controller.response.entity.company;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModelProperty;
import java.time.LocalDate;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.profile.CompanyInfo;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
public class CompanyInfoBackendGetFields {
@JsonProperty
@ -57,6 +62,17 @@ public class CompanyInfoBackendGetFields {
@JsonProperty
@ApiModelProperty(value = "Наименование статуса")
private String workflowStatus;
@JsonProperty
@ApiModelProperty(value = "Номер")
private String taxNumber;
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonProperty
@ApiModelProperty(value = "Дата регистрации")
private LocalDate registrationDate;
@JsonProperty
@ApiModelProperty(value = "Код страны резидентства")
private String residenceCode;
public Long getId() {
return id;
@ -194,6 +210,30 @@ public class CompanyInfoBackendGetFields {
this.workflowStatus = workflowStatus;
}
public String getTaxNumber() {
return taxNumber;
}
public void setTaxNumber(String taxNumber) {
this.taxNumber = taxNumber;
}
public LocalDate getRegistrationDate() {
return registrationDate;
}
public void setRegistrationDate(LocalDate registrationDate) {
this.registrationDate = registrationDate;
}
public String getResidenceCode() {
return residenceCode;
}
public void setResidenceCode(String residenceCode) {
this.residenceCode = residenceCode;
}
public static CompanyInfoBackendGetFields fromEntity(Company company) {
if (company == null || company.getProfile() == null) {
return null;
@ -211,6 +251,9 @@ public class CompanyInfoBackendGetFields {
fields.setResidence(info.getResidence());
fields.setShortNameEng(info.getShortNameEng());
fields.setFullNameEng(info.getFullNameEng());
fields.setTaxNumber(info.getTaxNumber());
fields.setRegistrationDate(info.getRegistrationDate());
fields.setResidenceCode(info.getResidenceCode());
fields.setShortName(company.getShortName());
fields.setFullName(company.getFullName());

View file

@ -0,0 +1,60 @@
package ru.spcex.clearing.backendapi.controller.test;
import io.swagger.annotations.ApiModelProperty;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRawValue;
import com.fasterxml.jackson.databind.JsonNode;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.TradingClearingRegistryNewRequest;
public class AnyKafkaMessageAction implements IAction<TradingClearingRegistryNewRequest> {
@ApiModelProperty(value = "полное имя класса payload для BaseRequest", example = "ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest")
@JsonProperty
private String fullClassName;
@JsonProperty
private String topicName;
@JsonRawValue
public String json;
@JsonProperty("json")
private void unpackRawJson(JsonNode json) {
this.json = json.toString();
}
@Override
public TradingClearingRegistryNewRequest toRequest() {
var req = new TradingClearingRegistryNewRequest();
return req;
}
@ApiModelProperty(hidden = true)
@Override
public ActionType getActionType() {
return ActionType.SYSTEM;
}
public String getFullClassName() {
return fullClassName;
}
public void setFullClassName(String fullClassName) {
this.fullClassName = fullClassName;
}
public String getTopicName() {
return topicName;
}
public void setTopicName(String topicName) {
this.topicName = topicName;
}
public String getJson() {
return json;
}
public void setJson(String json) {
this.json = json;
}
}

View file

@ -0,0 +1,67 @@
package ru.spcex.clearing.backendapi.controller.test;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.util.ClassUtils;
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.spcex.clearing.backendapi.errors.BackEndError;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.error.ValidationException;
import ru.spcex.platform.utils.text.TextUtil;
@Profile("dev")
@Controller
@RequestMapping("/anonymous/kafka-api")
public class KafkaApiController {
private final Logger log = LoggerFactory.getLogger(getClass());
private final KafkaSender kafkaSender;
private static final ObjectMapper json = new ObjectMapper();
@Autowired
public KafkaApiController(KafkaSender kafkaSender) {
this.kafkaSender = kafkaSender;
}
@ApiOperation(value = "Test backend-api availability.")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = String.class)})
@RequestMapping(method = RequestMethod.POST, path = "/any/message", produces = MediaType.TEXT_PLAIN_VALUE)
@ResponseBody
public String processGet(@ApiParam(value = "Параметры команды в JSON формате.", required = true)
@RequestBody AnyKafkaMessageAction bankAccountNewAction) throws ClassNotFoundException, ValidationException, JsonProcessingException {
log.info("Call test method for backend-api controller");
validate(bankAccountNewAction);
Class<?> parameterType = ClassUtils.forName(bankAccountNewAction.getFullClassName(), ClassUtils.getDefaultClassLoader());
JavaType requestType = json.getTypeFactory().constructSimpleType(parameterType, null);
Object obj = json.readValue(bankAccountNewAction.getJson(), requestType);
Long idOfBaseRequestMessage = kafkaSender.sendRequestToQueue(bankAccountNewAction.getTopicName(), obj);
return "success: baseRequest.id = " + idOfBaseRequestMessage;
}
private void validate(AnyKafkaMessageAction bankAccountNewAction) throws ValidationException {
if (TextUtil.isEmpty(bankAccountNewAction.getTopicName())) {
throw new ValidationException(new EnumMessage(BackEndError.ValidationError, "topicName"));
}
if (TextUtil.isEmpty(bankAccountNewAction.getFullClassName())) {
throw new ValidationException(new EnumMessage(BackEndError.ValidationError, "fullClassName"));
}
if (TextUtil.isEmpty(bankAccountNewAction.getJson())) {
throw new ValidationException(new EnumMessage(BackEndError.ValidationError, "json"));
}
}
}

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