Compare commits
1127 commits
10_01_2024
...
spring-sta
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
34cfaa74c8 | ||
|
|
33785cfac0 | ||
|
|
453f24f9cd | ||
|
|
bc8c030714 | ||
|
|
767347dbed | ||
|
|
1ab524aacd | ||
|
|
a860d8a831 | ||
|
|
61c7fb537f | ||
|
|
2110b2089e | ||
|
|
6756a65485 | ||
|
|
c2b47920e4 | ||
|
|
a89d6194cb | ||
|
|
ec012740cb | ||
|
|
66be672adb | ||
|
|
c3315d8a62 | ||
|
|
79b1446b7a | ||
|
|
ea3ba70d14 | ||
|
|
ff060688a3 | ||
|
|
70efa31997 | ||
|
|
6ad317c701 | ||
|
|
a1b6cab301 | ||
|
|
018d573590 | ||
|
|
6bfa78c5a6 | ||
|
|
fc9be7068d | ||
|
|
1226c73821 | ||
|
|
d707d6ab6e | ||
|
|
764f3f82d9 | ||
|
|
eb3577fd06 | ||
|
|
193983bc13 | ||
|
|
b5f69e8b59 | ||
|
|
a4ed85b2e2 | ||
|
|
81525450c4 | ||
|
|
d319f562aa | ||
|
|
5462caf3f1 | ||
|
|
67939b3776 | ||
|
|
a14ca74a69 | ||
|
|
dff000b496 | ||
|
|
c88ce7f56f | ||
|
|
d600ddfb52 | ||
|
|
c341878e54 | ||
|
|
62409c3e8a | ||
|
|
824f263157 | ||
|
|
83c65a4f3f | ||
|
|
4379d2671f | ||
|
|
733fe3b383 | ||
|
|
614f027943 | ||
|
|
ef7bcd9c4f | ||
|
|
8b1eabafa8 | ||
|
|
79cbc7dfc7 | ||
|
|
06ce9742e2 | ||
|
|
0834082988 | ||
|
|
07e096cf76 | ||
|
|
564de467ad | ||
|
|
e3e8683c10 | ||
|
|
d64d15dc17 | ||
|
|
b8d55c4627 | ||
|
|
ec3aa6a617 | ||
|
|
404cd991fd | ||
|
|
cea1fc2d39 | ||
|
|
36ba83319d | ||
|
|
60fd1bcc0c | ||
|
|
2529048485 | ||
|
|
7ba559ad40 | ||
|
|
c6b644d118 | ||
|
|
4efb263362 | ||
|
|
1110278d6a | ||
|
|
1bb489e3cb | ||
|
|
aa38fa986a | ||
|
|
8b21e7aec2 | ||
|
|
485b269dcf | ||
|
|
f78d4394c3 | ||
|
|
86917e91fd | ||
|
|
bd2d8fcc58 | ||
|
|
d27b7d003d | ||
|
|
bacea62e45 | ||
|
|
f21bafb2d7 | ||
|
|
d5366ab2a1 | ||
|
|
0cded096ae | ||
|
|
15ed82e788 | ||
|
|
2f6e8fe99b | ||
|
|
4959afe9f0 | ||
|
|
594efc8ec4 | ||
|
|
e3d1478752 | ||
|
|
1defffc0a1 | ||
|
|
43fdced052 | ||
|
|
dacf7e551d | ||
|
|
80c9870282 | ||
|
|
10b1921487 | ||
|
|
a8aa508639 | ||
|
|
af0725284c | ||
|
|
5f42c6df63 | ||
|
|
2ac98d9f39 | ||
|
|
0170de8e73 | ||
|
|
169302163e | ||
|
|
eb64328bf1 | ||
|
|
a70efb051d | ||
|
|
7fc0b784d1 | ||
|
|
24fe8f7d70 | ||
|
|
88be2dbe41 | ||
|
|
06155c2fa9 | ||
|
|
ead7b1cf5d | ||
|
|
19fb640d7e | ||
|
|
c8a317c0c8 | ||
|
|
ebcdb6a2b0 | ||
|
|
eec121924d | ||
|
|
6bff686528 | ||
|
|
68bf6a78d0 | ||
|
|
9e09ca7486 | ||
|
|
ecab562499 | ||
|
|
4099d3d1c0 | ||
|
|
28b5ef8b4b | ||
|
|
134de7d9ab | ||
|
|
04a20c34db | ||
|
|
ed0fbdaaaf | ||
|
|
ed7a15410d | ||
|
|
bb70598d0a | ||
|
|
7941e3cbba | ||
|
|
02038847f2 | ||
|
|
3c986b4954 | ||
|
|
53ead3c5fe | ||
|
|
da3ac07a00 | ||
|
|
5b632db7db | ||
|
|
7d042ad07e | ||
|
|
f8fc9a2ee5 | ||
|
|
b6f6b74e39 | ||
|
|
3c480922d7 | ||
|
|
3909af085c | ||
|
|
34f376dfae | ||
|
|
bcdbde9a16 | ||
|
|
2ac9ab49ec | ||
|
|
46d2bf902c | ||
|
|
ea77a68fb6 | ||
|
|
68496730c6 | ||
|
|
05d1135ae2 | ||
|
|
4ccca75aad | ||
|
|
feb989a85b | ||
|
|
ed6daedece | ||
|
|
b56ad84ec2 | ||
|
|
bc02fa7dea | ||
|
|
ab4e520d89 | ||
|
|
c0372315b4 | ||
|
|
1903620e69 | ||
|
|
040e0e359d | ||
|
|
7f81e47fb6 | ||
|
|
edd9c7c08d | ||
|
|
01aaf031b0 | ||
|
|
eb724cb917 | ||
|
|
129ebf6acf | ||
|
|
79317a7fe7 | ||
|
|
522f91a8f9 | ||
|
|
210ca99bfc | ||
|
|
3b9af73e5e | ||
|
|
52d3653bdd | ||
|
|
6ac5dafa74 | ||
|
|
6c9c43109b | ||
|
|
369d002020 | ||
|
|
89ce38cc7a | ||
|
|
c42323eeb5 | ||
|
|
62ec78c13b | ||
|
|
b38c7c1959 | ||
|
|
fb57a4df1b | ||
|
|
0c22729906 | ||
|
|
3dae3cc633 | ||
|
|
ed4be6d227 | ||
|
|
39fed03c9e | ||
|
|
d5349a6e5e | ||
|
|
86b832d03c | ||
|
|
89fe02d557 | ||
|
|
7f46dc5b4f | ||
|
|
781c0645f2 | ||
|
|
148870d0c8 | ||
|
|
72230cc8f7 | ||
|
|
5af38ed6bb | ||
|
|
f9b7149a74 | ||
|
|
e7aefa6252 | ||
|
|
696a03928a | ||
|
|
f9d989114e | ||
|
|
46ce383b1b | ||
|
|
0d877eed76 | ||
|
|
911dfba6f8 | ||
|
|
5c4161968b | ||
|
|
cec9a0de7b | ||
|
|
318d8bba62 | ||
|
|
6d86fa44f1 | ||
|
|
6cad412cdf | ||
|
|
bcf3e3e3ff | ||
|
|
3b5da3ff8f | ||
|
|
7acc0e81da | ||
|
|
6c4e26cbe8 | ||
|
|
c557ee97ef | ||
|
|
5e2080cc29 | ||
|
|
046d78d63f | ||
|
|
99198bce9b | ||
|
|
6b6bbecea2 | ||
|
|
6bd12d064e | ||
|
|
f2f5453a4c | ||
|
|
4eb63277e0 | ||
|
|
40f248ad7c | ||
|
|
b6d6db0499 | ||
|
|
8f5ae16889 | ||
|
|
366a45d115 | ||
|
|
1629bf1eaf | ||
|
|
316871b5c7 | ||
|
|
fd9ba2b8e2 | ||
|
|
898713c2f8 | ||
|
|
345cd0059c | ||
|
|
8415d6a518 | ||
|
|
b9b57f725a | ||
|
|
3040ae3734 | ||
|
|
9ed076198b | ||
|
|
106828d83d | ||
|
|
4971890b8f | ||
|
|
d542cc6159 | ||
|
|
1eb124b209 | ||
|
|
059872518e | ||
|
|
fa696013ce | ||
|
|
03a8507922 | ||
|
|
0ddb6835f6 | ||
|
|
51b0224b7e | ||
|
|
c7bd6c17ad | ||
|
|
9f3ed39ef3 | ||
|
|
4be350ad19 | ||
|
|
81e19b36d2 | ||
|
|
1c4df656b7 | ||
|
|
b0e1cf2ef4 | ||
|
|
b3bc8f216b | ||
|
|
1835673dd4 | ||
|
|
73d3250ce0 | ||
|
|
f63c3e512e | ||
|
|
5ab6464673 | ||
|
|
f53dadf62b | ||
|
|
140b5ab68f | ||
|
|
324ba79b9f | ||
|
|
d2aac78f56 | ||
|
|
1f49b41cf3 | ||
|
|
a4c27b6f88 | ||
|
|
5d1d5a2b73 | ||
|
|
e987b4cbdb | ||
|
|
7827f4c509 | ||
|
|
3a9fb12a98 | ||
|
|
063877f3dd | ||
|
|
b3f04e678d | ||
|
|
778a049139 | ||
|
|
a669f34fcc | ||
|
|
16b51c34ed | ||
|
|
30fc9c2a03 | ||
|
|
8f30ccad7e | ||
|
|
31b35c9ffb | ||
|
|
c76acbf1a0 | ||
|
|
2ebe71b479 | ||
|
|
510fbcf29d | ||
|
|
4145388f9b | ||
|
|
24347c6489 | ||
|
|
2017d1f059 | ||
|
|
47bcf7acc8 | ||
|
|
02c7669d9f | ||
|
|
d11e45c08c | ||
|
|
6094623426 | ||
|
|
9b726a3c4f | ||
|
|
951a35baae | ||
|
|
89c11c4305 | ||
|
|
ee781393fb | ||
|
|
91f5952a58 | ||
|
|
be9521af85 | ||
|
|
25090d5499 | ||
|
|
2566140140 | ||
|
|
360c566ab2 | ||
|
|
aa3ae5f936 | ||
|
|
abefe20617 | ||
|
|
60b6004949 | ||
|
|
1d300c965b | ||
|
|
557b9333b5 | ||
|
|
37ef9ec2d6 | ||
|
|
7c57fd8676 | ||
|
|
cf24c196bc | ||
|
|
fb24977c86 | ||
|
|
f59537b0bd | ||
|
|
9a0aebfee4 | ||
|
|
f9edf0746e | ||
|
|
7b4ede233b | ||
|
|
c94bf2a57a | ||
|
|
8a62e9fcae | ||
|
|
ba354d8fca | ||
|
|
8664625c89 | ||
|
|
045a806dc7 | ||
|
|
c3b9142dc2 | ||
|
|
7efde73c9e | ||
|
|
394782a6d0 | ||
|
|
4e27aa3e25 | ||
|
|
7d672a905b | ||
|
|
5e4767c2d5 | ||
|
|
484d71051e | ||
|
|
10a3539130 | ||
|
|
a2e89e6a29 | ||
|
|
95fd3012ec | ||
|
|
88a45e7361 | ||
|
|
4a38552b3f | ||
|
|
cd0e5a7165 | ||
|
|
88c2717a8e | ||
|
|
e9858a2f47 | ||
|
|
d71fdd4359 | ||
|
|
5ad2b3eb76 | ||
|
|
8aad63da12 | ||
|
|
70d510a296 | ||
|
|
a7b3ac478e | ||
|
|
8d0985d547 | ||
|
|
a42303ec45 | ||
|
|
95d0c65b1a | ||
|
|
968616c93d | ||
|
|
1940d47344 | ||
|
|
4a31317f85 | ||
|
|
82ec3869db | ||
|
|
50a67133ef | ||
|
|
1fe25f814e | ||
|
|
e6329fa778 | ||
|
|
f951575425 | ||
|
|
0c75d61840 | ||
|
|
2b9345490d | ||
|
|
8dfb086191 | ||
|
|
edb3760b51 | ||
|
|
dd19fa74d9 | ||
|
|
75ac48c00d | ||
|
|
dc3427bdf9 | ||
|
|
133a5105d1 | ||
|
|
109d3616e1 | ||
|
|
4315b66af3 | ||
|
|
07df32cfad | ||
|
|
5ccd97f528 | ||
|
|
1f352d0eb6 | ||
|
|
50b153df79 | ||
|
|
e8c6f1cb48 | ||
|
|
35e056c990 | ||
|
|
51e226caf2 | ||
|
|
c31797e3d0 | ||
|
|
a0f4a5d8f2 | ||
|
|
aebfc35eb4 | ||
|
|
dbe967de51 | ||
|
|
a2bf45e292 | ||
|
|
9db8a6f4a8 | ||
|
|
e3099abb42 | ||
|
|
939c545365 | ||
|
|
70036d214b | ||
|
|
e9fe149587 | ||
|
|
492e2bef95 | ||
|
|
bf63c85837 | ||
|
|
cf317b252b | ||
|
|
54b0f08050 | ||
|
|
5f095e2038 | ||
|
|
301ffed9d6 | ||
|
|
7e4c8b337c | ||
|
|
09e05770af | ||
|
|
5a0ac8a373 | ||
|
|
0846e6a381 | ||
|
|
1999a10786 | ||
|
|
8abd74f42c | ||
|
|
46ac71e6e4 | ||
|
|
620370c9eb | ||
|
|
46cf5f0bf8 | ||
|
|
343e031755 | ||
|
|
e50a4eb33a | ||
|
|
833532e0fc | ||
|
|
1bf0faf8d4 | ||
|
|
b1ce26ed89 | ||
|
|
a1b1bbc1a5 | ||
|
|
f1a83d7ae4 | ||
|
|
4e66ed3889 | ||
|
|
99f96e6df0 | ||
|
|
d027b75fe9 | ||
|
|
9d06d5a758 | ||
|
|
1814f212eb | ||
|
|
8d37702e3d | ||
|
|
d9c46c3ec5 | ||
|
|
85d9fc6154 | ||
|
|
ffb3e13ba2 | ||
|
|
68a10e5f2a | ||
|
|
868540ffa3 | ||
|
|
115fcc1aac | ||
|
|
52fc4f50b1 | ||
|
|
ab98240a00 | ||
|
|
6bd925c231 | ||
|
|
94a0a3ab57 | ||
|
|
e007a42226 | ||
|
|
72674920d1 | ||
|
|
8e87025c73 | ||
|
|
5182a1ec8c | ||
|
|
bdadbe1caa | ||
|
|
398f4cbd24 | ||
|
|
15f24ad82b | ||
|
|
95e97d9ff4 | ||
|
|
7782c3bc1f | ||
|
|
08cfe0485c | ||
|
|
356dbeb7cb | ||
|
|
92243b0855 | ||
|
|
1229a2e783 | ||
|
|
0a7ba03f56 | ||
|
|
1c6f6ce36c | ||
|
|
de49489f0a | ||
|
|
57f8f32730 | ||
|
|
402af8f4a0 | ||
|
|
ef0bb6cf7d | ||
|
|
58840bdd76 | ||
|
|
592e61ae49 | ||
|
|
128b5b681b | ||
|
|
dccfc37439 | ||
|
|
7e2b80b317 | ||
|
|
fa76a3b137 | ||
|
|
27c44fa262 | ||
|
|
70a0316d19 | ||
|
|
9976273567 | ||
|
|
be90d018d1 | ||
|
|
a849d5d026 | ||
|
|
345feb19b8 | ||
|
|
c6767821aa | ||
|
|
f26826bb4e | ||
|
|
454bb99dfa | ||
|
|
2615cc79e4 | ||
|
|
78e38d0e0a | ||
|
|
fd87786d85 | ||
|
|
05ca97688a | ||
|
|
24824f55c2 | ||
|
|
2efb93702d | ||
|
|
51811cee42 | ||
|
|
62f0f3246f | ||
|
|
c4390848c5 | ||
|
|
39655fefd0 | ||
|
|
e729c698f6 | ||
|
|
2a365606fa | ||
|
|
8e0c70cfd0 | ||
|
|
c70874b179 | ||
|
|
b87f5dbb80 | ||
|
|
cc48b21066 | ||
|
|
8a82bb5f63 | ||
|
|
d9fdfba69a | ||
|
|
38ff413e84 | ||
|
|
6534ab34ce | ||
|
|
0334d8fcdf | ||
|
|
3b37d06e56 | ||
|
|
7a03fd1f62 | ||
|
|
6a8c716f3f | ||
|
|
b25c99fb94 | ||
|
|
baee68f25b | ||
|
|
33bc8ce75d | ||
|
|
bfb6cb7380 | ||
|
|
fbc0836c07 | ||
|
|
6f3c205fd3 | ||
|
|
cda217e276 | ||
|
|
992bbacce6 | ||
|
|
8e156bca82 | ||
|
|
b9ec6485c7 | ||
|
|
99c21919bb | ||
|
|
95b27f3bd4 | ||
|
|
bfde155d9f | ||
|
|
245b3481db | ||
|
|
b48c455a3e | ||
|
|
b61f3956f3 | ||
|
|
4c804d243e | ||
|
|
2e60049163 | ||
|
|
fc3fc9cef6 | ||
|
|
b3420edb46 | ||
|
|
20aef32798 | ||
|
|
0ae83b1c52 | ||
|
|
bcd1aa2b40 | ||
|
|
3fd5ca37ab | ||
|
|
3d58504649 | ||
|
|
80b18d06f0 | ||
|
|
d404d58d6c | ||
|
|
67eab3a186 | ||
|
|
4966cd552e | ||
|
|
a06300b9f3 | ||
|
|
dc23b32141 | ||
|
|
426d608a44 | ||
|
|
f95541fa79 | ||
|
|
30d1d660f1 | ||
|
|
c947aed016 | ||
|
|
515e293605 | ||
|
|
905c4a0fd5 | ||
|
|
9701877672 | ||
|
|
b408fd5375 | ||
|
|
8d3aff8a83 | ||
|
|
27d90be456 | ||
|
|
ea74d18b1a | ||
|
|
53200b4233 | ||
|
|
e99ccbfcb3 | ||
|
|
b752547d4d | ||
|
|
1ee6fba375 | ||
|
|
eca157b75b | ||
|
|
7d9a18c6f5 | ||
|
|
c99d53dd73 | ||
|
|
69620bf7b7 | ||
|
|
6bd828eb86 | ||
|
|
7c51777eb9 | ||
|
|
7fc8f95c20 | ||
|
|
3a43598223 | ||
|
|
4256c05345 | ||
|
|
e557b948fe | ||
|
|
7cf8d40896 | ||
|
|
6e9209d249 | ||
|
|
2fc0ce5029 | ||
|
|
234bc7e8b6 | ||
|
|
e88e0f8387 | ||
|
|
8400bafe4d | ||
|
|
c35ac0d44c | ||
|
|
e45d499555 | ||
|
|
54f305447f | ||
|
|
d62f6d9437 | ||
|
|
57400e0b7b | ||
|
|
c38cfaaab9 | ||
|
|
bee974f113 | ||
|
|
fe3c54aa0c | ||
|
|
54ed129de6 | ||
|
|
08243c6964 | ||
|
|
d48c8ed610 | ||
|
|
db90b9a388 | ||
|
|
c9075bacf8 | ||
|
|
e3439cacc2 | ||
|
|
cebd7c2a8c | ||
|
|
2fa33e3470 | ||
|
|
ca2de38dc0 | ||
|
|
05b19f488a | ||
|
|
43020f9631 | ||
|
|
3ed5d8eab2 | ||
|
|
7e8b3cc13e | ||
|
|
41d1c3c261 | ||
|
|
3f57080c16 | ||
|
|
048eba8b11 | ||
|
|
5a2607607e | ||
|
|
ed5b85daac | ||
|
|
1a6ed38fee | ||
|
|
fa01562a9c | ||
|
|
6dcba1dded | ||
|
|
8f9713c055 | ||
|
|
77f8e2353b | ||
|
|
2183ff953a | ||
|
|
7a49e4b727 | ||
|
|
a0f99a2dc6 | ||
|
|
eecddc03cc | ||
|
|
a30cb92e47 | ||
|
|
8ead0d74b5 | ||
|
|
98bb9a26c8 | ||
|
|
a4febcafb1 | ||
|
|
1a2b284bd9 | ||
|
|
380e496705 | ||
|
|
ebbe098ced | ||
|
|
fba08b73ea | ||
|
|
0d0c5530f2 | ||
|
|
886e9b80a1 | ||
|
|
c9fd35d1c3 | ||
|
|
238cbf4f8e | ||
|
|
20b1eef52d | ||
|
|
632bf30416 | ||
|
|
43162aa18a | ||
|
|
afe781e6df | ||
|
|
fe1279ae63 | ||
|
|
8d70db939f | ||
|
|
4994ead0d8 | ||
|
|
27c2510588 | ||
|
|
6ccd8d3a3e | ||
|
|
ed69bd7ec2 | ||
|
|
9974b5ddc2 | ||
|
|
a835a59e8d | ||
|
|
cd341bf166 | ||
|
|
4bf2c45c69 | ||
|
|
fc8d235fce | ||
|
|
21cd02b20a | ||
|
|
31aced0af6 | ||
|
|
6e7fce1fe2 | ||
|
|
a99104d8dd | ||
|
|
21d1f180be | ||
|
|
44c547d07c | ||
|
|
8076bc22da | ||
|
|
517d67fed3 | ||
|
|
e0d55568fd | ||
|
|
730f759908 | ||
|
|
bbd133093f | ||
|
|
d9e93271b0 | ||
|
|
f19e8853b0 | ||
|
|
8d797212b5 | ||
|
|
b21ae8206f | ||
|
|
07e4ecb37f | ||
|
|
2bb92decad | ||
|
|
761204b076 | ||
|
|
10d6ad51f1 | ||
|
|
2c00b9194b | ||
|
|
eb6a75a265 | ||
|
|
18a74ee7b8 | ||
|
|
6f99e219ca | ||
|
|
2826ced949 | ||
|
|
e5da447908 | ||
|
|
360414e75d | ||
|
|
d7b3189a80 | ||
|
|
b74ebc3b0e | ||
|
|
4c0dd1739b | ||
|
|
f888e27bea | ||
|
|
07c5dba41e | ||
|
|
bf66af936a | ||
|
|
a8ad3eb474 | ||
|
|
8c444e4e1c | ||
|
|
9a51aa5558 | ||
|
|
adcc2d7b3f | ||
|
|
01732fbd31 | ||
|
|
b7158efbde | ||
|
|
5013fb2c17 | ||
|
|
46da00357e | ||
|
|
4d011400b3 | ||
|
|
9e7aa54e63 | ||
|
|
8d43e29b30 | ||
|
|
7bccd74de9 | ||
|
|
5c92dbff96 | ||
|
|
2c7c5e554c | ||
|
|
e15e3aae91 | ||
|
|
80f61e36cd | ||
|
|
9fa4920509 | ||
|
|
1a60016a65 | ||
|
|
37c55f851f | ||
|
|
a4aa04741e | ||
|
|
f3ca29280a | ||
|
|
cb1cb42d5d | ||
|
|
efd16f068b | ||
|
|
3542a69cc7 | ||
|
|
dd23656703 | ||
|
|
d1f4da4d4e | ||
|
|
c67dcd732a | ||
|
|
1ac6bb4885 | ||
|
|
8dfbf09288 | ||
|
|
1ec3fcc1b8 | ||
|
|
fd54ba9be1 | ||
|
|
c06c9c5eea | ||
|
|
74bc1abd19 | ||
|
|
51c5182e47 | ||
|
|
21f5e6a680 | ||
|
|
06b59fc216 | ||
|
|
40ec9fde5f | ||
|
|
e63618367f | ||
|
|
a865b8ae45 | ||
|
|
05893af032 | ||
|
|
fb58f6d1f5 | ||
|
|
87082147c8 | ||
|
|
48b629f87e | ||
|
|
a1ebfe5f1f | ||
|
|
7d4dd0a812 | ||
|
|
d3ad08ba27 | ||
|
|
09f874204b | ||
|
|
e6e4449b7f | ||
|
|
d3d449c498 | ||
|
|
3139fce44f | ||
|
|
be13c63097 | ||
|
|
877b62118c | ||
|
|
1ccbfccdef | ||
|
|
24058a943c | ||
|
|
c27e377dbf | ||
|
|
7652e28ae9 | ||
|
|
88781ff458 | ||
|
|
7349cc67ab | ||
|
|
38db91a748 | ||
|
|
603a8e66ca | ||
|
|
cd3488c5ec | ||
|
|
d6865f8395 | ||
|
|
3bf8c690a5 | ||
|
|
18b94c71fe | ||
|
|
1b8e773f26 | ||
|
|
01685a2f85 | ||
|
|
4688f55fce | ||
|
|
89e81604a5 | ||
|
|
0c62c91888 | ||
|
|
2760ddc7d3 | ||
|
|
eceb681861 | ||
|
|
aff20d2c42 | ||
|
|
281fa4f5d6 | ||
|
|
94715bdd34 | ||
|
|
1bd41b8f50 | ||
|
|
c72405cbf1 | ||
|
|
5f022a5d9d | ||
|
|
a0e4ea7b49 | ||
|
|
e8d1dc482d | ||
|
|
a94cc8ff17 | ||
|
|
b1779dc8c4 | ||
|
|
9c828e75a1 | ||
|
|
de3eb66799 | ||
|
|
61d1be2fe1 | ||
|
|
19081b98a6 | ||
|
|
26d6c68734 | ||
|
|
e010e1d200 | ||
|
|
51517790ce | ||
|
|
c1ec29a8be | ||
|
|
54fd6ebcbc | ||
|
|
96bb60bb60 | ||
|
|
c51f473c91 | ||
|
|
51db366432 | ||
|
|
1981e48274 | ||
|
|
92f6d7ab02 | ||
|
|
1df96b7ef6 | ||
|
|
1eb7a9d485 | ||
|
|
1b72d20ee5 | ||
|
|
24fe8346d3 | ||
|
|
7c7848074a | ||
|
|
2e533855e2 | ||
|
|
54ac847b45 | ||
|
|
a212e5a7b5 | ||
|
|
544c930148 | ||
|
|
f092833de8 | ||
|
|
b011e2c716 | ||
|
|
871e6858f0 | ||
|
|
8382387ffa | ||
|
|
84f672bb62 | ||
|
|
1ec79ead27 | ||
|
|
3bed56dbe8 | ||
|
|
a373827cde | ||
|
|
47ffa77428 | ||
|
|
e43d90a314 | ||
|
|
501238f91d | ||
|
|
a0c7ee3a17 | ||
|
|
41fb033488 | ||
|
|
ae6720798b | ||
|
|
06f763c11f | ||
|
|
2b13c08a9b | ||
|
|
3bb6540fa6 | ||
|
|
a5ee992c9b | ||
|
|
7ff46aae19 | ||
|
|
1058719aac | ||
|
|
a6c1b560c4 | ||
|
|
ce3d4d89fa | ||
|
|
73bbe538cd | ||
|
|
0bf97ddb22 | ||
|
|
b566897022 | ||
|
|
dd64342061 | ||
|
|
8b411d78a0 | ||
|
|
fea441c0a7 | ||
|
|
5b038ea281 | ||
|
|
860ed422bf | ||
|
|
9df219c164 | ||
|
|
d2df5bcc1c | ||
|
|
05b9daa65c | ||
|
|
64d37bf247 | ||
|
|
87792aea38 | ||
|
|
9e6ef25ab9 | ||
|
|
a5258c0374 | ||
|
|
4a90d75cb3 | ||
|
|
f131f48dfe | ||
|
|
6ea0899433 | ||
|
|
9955162e94 | ||
|
|
cb971d6b2b | ||
|
|
4b1a834883 | ||
|
|
1ec5303b12 | ||
|
|
afd35f39e7 | ||
|
|
130a19210b | ||
|
|
ecb6382607 | ||
|
|
1145fd17f7 | ||
|
|
2e73d1ebd4 | ||
|
|
ced14c4e10 | ||
|
|
0e120a9866 | ||
|
|
7ca4b1ded0 | ||
|
|
7418311ab5 | ||
|
|
c19d881e1d | ||
|
|
cc95a67759 | ||
|
|
eb8ce07f27 | ||
|
|
bfdb3b8a6d | ||
|
|
64278d10d3 | ||
|
|
73f2ed8650 | ||
|
|
f345145135 | ||
|
|
cf8f040ebd | ||
|
|
b240af4fd1 | ||
|
|
ca3e353e86 | ||
|
|
70aa7b9748 | ||
|
|
e52b42973d | ||
|
|
3bd46a0bca | ||
|
|
9bb50750c0 | ||
|
|
06cd123666 | ||
|
|
7c655c2c18 | ||
|
|
2f0c54ca3c | ||
|
|
7886d13a24 | ||
|
|
55080005c8 | ||
|
|
d98b2ce176 | ||
|
|
1d0f669c41 | ||
|
|
41cf940f42 | ||
|
|
e39b71f9cd | ||
|
|
2ff71f7cec | ||
|
|
b901f4dcb0 | ||
|
|
ae87df9e86 | ||
|
|
f6f7c9c446 | ||
|
|
300e4c96c6 | ||
|
|
d2f7ca572d | ||
|
|
00c87829a3 | ||
|
|
f026bc95d2 | ||
|
|
edce8ee854 | ||
|
|
f1982ef5da | ||
|
|
1b0672bba3 | ||
|
|
10f1e2a7b9 | ||
|
|
d1bb78fa1e | ||
|
|
cd783ebbbe | ||
|
|
ccef5a7590 | ||
|
|
b415d22caf | ||
|
|
5b1d672712 | ||
|
|
2588000456 | ||
|
|
03f9c065c7 | ||
|
|
f020153363 | ||
|
|
39f9544cfb | ||
|
|
8833818a01 | ||
|
|
a6c3f2f2b3 | ||
|
|
0cddc6fb7a | ||
|
|
0106d58569 | ||
|
|
fafa3b455a | ||
|
|
702cfacad1 | ||
|
|
1037b27165 | ||
|
|
ed010ad64e | ||
|
|
960a19c4cc | ||
|
|
add844bd76 | ||
|
|
6feeb77b1f | ||
|
|
1f2326698c | ||
|
|
4e2e3d9547 | ||
|
|
c51d22a615 | ||
|
|
95ad4837e1 | ||
|
|
10e9ef9079 | ||
|
|
ea73e16a81 | ||
|
|
c0c6a9813a | ||
|
|
568f29a62a | ||
|
|
a52f135ee2 | ||
|
|
bebb114bea | ||
|
|
e2bcf7d117 | ||
|
|
88db266d26 | ||
|
|
ed3a6d31f0 | ||
|
|
2d9a49e990 | ||
|
|
6b2290e0cf | ||
|
|
5a19686e82 | ||
|
|
69511724c4 | ||
|
|
6f723f0cd7 | ||
|
|
0ef3aca8b0 | ||
|
|
2289d1ed6c | ||
|
|
b6f371dfc9 | ||
|
|
26ce847f37 | ||
|
|
cc87b6ec1e | ||
|
|
5edbf4cf79 | ||
|
|
7ce2445fc9 | ||
|
|
c9c5fc9297 | ||
|
|
28fd132795 | ||
|
|
f367b48004 | ||
|
|
0842a4bddb | ||
|
|
6758836c70 | ||
|
|
4814c0d362 | ||
|
|
743f721df5 | ||
|
|
3c0cc05d28 | ||
|
|
5f2dcba539 | ||
|
|
4ff7dbf586 | ||
|
|
eed71888c9 | ||
|
|
9727e02c16 | ||
|
|
08e0caabde | ||
|
|
d430d14cf1 | ||
|
|
f74ff70e51 | ||
|
|
0083712e80 | ||
|
|
7650e4b7a1 | ||
|
|
eed10a1eec | ||
|
|
87d6029649 | ||
|
|
585f7cf6e7 | ||
|
|
cdb8e280c3 | ||
|
|
9ce9fcc998 | ||
|
|
34914fa23e | ||
|
|
e3c685f4b5 | ||
|
|
24a911f6fe | ||
|
|
b30ffe62df | ||
|
|
35d9fe2d3e | ||
|
|
6f1ee644bf | ||
|
|
6d84ba760e | ||
|
|
1959e2ece9 | ||
|
|
403e262f83 | ||
|
|
55dd0cc8b6 | ||
|
|
deaf9c31b7 | ||
|
|
b2f26b14b3 | ||
|
|
1b441d1b54 | ||
|
|
caf06224cb | ||
|
|
9926a0feff | ||
|
|
e6dcbc2ede | ||
|
|
a8998d0868 | ||
|
|
42d9bfa94c | ||
|
|
8c698095a2 | ||
|
|
e327c3dbb1 | ||
|
|
9c1e3fee4f | ||
|
|
2589c3614e | ||
|
|
5fb1b0526d | ||
|
|
dcc0a3c7ce | ||
|
|
62289c351b | ||
|
|
9bf1d6cdd3 | ||
|
|
224179a9e1 | ||
|
|
bba57c2555 | ||
|
|
b82c31e26e | ||
|
|
63f05fdcd1 | ||
|
|
69e815f984 | ||
|
|
0f38c752cf | ||
|
|
27a9b5ea02 | ||
|
|
377977bb03 | ||
|
|
244aff1de9 | ||
|
|
0232edffc2 | ||
|
|
0984884fc0 | ||
|
|
b530c93e2f | ||
|
|
75b82da809 | ||
|
|
4642056f98 | ||
|
|
ba4374280d | ||
|
|
c288636bed | ||
|
|
a7d03ce60f | ||
|
|
99f5661ddf | ||
|
|
51a39663ef | ||
|
|
7ad1f56714 | ||
|
|
ad8c9e72c7 | ||
|
|
ae230bf4dd | ||
|
|
3574f830a8 | ||
|
|
08e3c3acf4 | ||
|
|
e1b88188f8 | ||
|
|
802e087f62 | ||
|
|
44492fd690 | ||
|
|
8e83d882f4 | ||
|
|
ce1c4469c9 | ||
|
|
b21fd76137 | ||
|
|
e6c3137d25 | ||
|
|
a57ba0ae6b | ||
|
|
9dac139e25 | ||
|
|
d8f0527bbd | ||
|
|
dc24683a90 | ||
|
|
852fc61e2f | ||
|
|
0c6736b9c9 | ||
|
|
eb652a105b | ||
|
|
513f51ba15 | ||
|
|
dd7ea61446 | ||
|
|
f0cd944c64 | ||
|
|
655e8a6571 | ||
|
|
2406152394 | ||
|
|
8449e13e1c | ||
|
|
6596046513 | ||
|
|
16c0693b88 | ||
|
|
e0eebea890 | ||
|
|
e2d043e322 | ||
|
|
6a4a7ec4e7 | ||
|
|
b2015a9aa4 | ||
|
|
7a157e9ae2 | ||
|
|
491577b6f8 | ||
|
|
ffa3098650 | ||
|
|
e00cc21a58 | ||
|
|
a35b19467a | ||
|
|
b29d19cfaa | ||
|
|
54722afb2c | ||
|
|
b958dd0e5c | ||
|
|
6d47a2e322 | ||
|
|
1349425e09 | ||
|
|
11684bf923 | ||
|
|
20bd9a0bb5 | ||
|
|
d141ff3224 | ||
|
|
09e47209aa | ||
|
|
c5cad4d27c | ||
|
|
fbc0cfc650 | ||
|
|
57c317aed2 | ||
|
|
42b7bca653 | ||
|
|
22c6ca754c | ||
|
|
a7c93234c8 | ||
|
|
a52265eca5 | ||
|
|
e1e96cbbce | ||
|
|
932eb6d57f | ||
|
|
1c35dc2881 | ||
|
|
5a158cec1d | ||
|
|
dc4a252400 | ||
|
|
ea5a502a0f | ||
|
|
eac594aeeb | ||
|
|
31a828038a | ||
|
|
ae36188f31 | ||
|
|
89beec5a83 | ||
|
|
07e78d6a50 | ||
|
|
23604146f8 | ||
|
|
da63e9c236 | ||
|
|
827e6b7954 | ||
|
|
c76b466834 | ||
|
|
d46bd1fc5e | ||
|
|
f2f94ca3e2 | ||
|
|
d636a6b0ce | ||
|
|
662d083b9c | ||
|
|
78b511c321 | ||
|
|
ef9f9b3ca2 | ||
|
|
67c0599284 | ||
|
|
4c9b70df5f | ||
|
|
0fb88db608 | ||
|
|
a65ac4b9b6 | ||
|
|
e3f5236aee | ||
|
|
c13f0d8270 | ||
|
|
2b85cf6f0f | ||
|
|
1ff7fb4b23 | ||
|
|
d1c9227b58 | ||
|
|
6e2364d91c | ||
|
|
10fe89dd10 | ||
|
|
5739606f8b | ||
|
|
6eb83d2a07 | ||
|
|
95eb359961 | ||
|
|
fdc238e510 | ||
|
|
8375759ea2 | ||
|
|
aef72cf13f | ||
|
|
f4425bd987 | ||
|
|
bbef81e867 | ||
|
|
53df6b6b62 | ||
|
|
0e5f2ed054 | ||
|
|
9bd0ad49ec | ||
|
|
8671f8e64c | ||
|
|
5ca2153a3b | ||
|
|
f6ffca32b4 | ||
|
|
6503baf710 | ||
|
|
249ef05173 | ||
|
|
21976322c2 | ||
|
|
d93bf629af | ||
|
|
303f026489 | ||
|
|
43a11267fc | ||
|
|
07db668092 | ||
|
|
5891ad4994 | ||
|
|
9cb645b115 | ||
|
|
7f3e1881d2 | ||
|
|
fce78c196b | ||
|
|
8315e9814b | ||
|
|
97bdf20975 | ||
|
|
8305137de5 | ||
|
|
9376f9f6b1 | ||
|
|
8a6f2abc8c | ||
|
|
4d37475cbc | ||
|
|
48c843e5c1 | ||
|
|
b004b9191a | ||
|
|
9971299c70 | ||
|
|
e8fda5a8f8 | ||
|
|
e5d0e208bd | ||
|
|
085acf8a2b | ||
|
|
e58a19a511 | ||
|
|
3d47b2b2f3 | ||
|
|
0f5ec7419e | ||
|
|
db4a084e83 | ||
|
|
b028aca544 | ||
|
|
7308f69c78 | ||
|
|
cbad15aab9 | ||
|
|
9d0e092d70 | ||
|
|
4da055edad | ||
|
|
eb79ccf8d0 | ||
|
|
89bf4fe820 | ||
|
|
0dfd89d294 | ||
|
|
4580880fe4 | ||
|
|
38c04c7150 | ||
|
|
fe84a88781 | ||
|
|
60deeca9b9 | ||
|
|
2adb585aa2 | ||
|
|
a8481d0e9e | ||
|
|
bb35521cb7 | ||
|
|
7d8def669d | ||
|
|
867d5f928a | ||
|
|
862b7f0006 | ||
|
|
4e205f0f74 | ||
|
|
576eaaee9f | ||
|
|
1a940c4322 | ||
|
|
ba4b9aa042 | ||
|
|
4f0c6a6311 | ||
|
|
110f95f74c | ||
|
|
b6ff7b091d | ||
|
|
d1cf6da58e | ||
|
|
e32733de60 | ||
|
|
634e6200f9 | ||
|
|
a804a64078 | ||
|
|
3ab04ca9e8 | ||
|
|
481a24be77 | ||
|
|
c705b4e27c | ||
|
|
42c75db19e | ||
|
|
7942939aee | ||
|
|
afc6983537 | ||
|
|
619b7d8767 | ||
|
|
686b15318d | ||
|
|
98a77dc53e | ||
|
|
499b196183 | ||
|
|
bc5377a752 | ||
|
|
50962c34b5 | ||
|
|
0815f66ee7 | ||
|
|
96a0ef78aa | ||
|
|
b722a9b90e | ||
|
|
4d7a2ebbf7 | ||
|
|
960e4ffab0 | ||
|
|
f64910154c | ||
|
|
5d40c9db34 | ||
|
|
f92941a2fc | ||
|
|
d06a0efeec | ||
|
|
9e5d54b130 | ||
|
|
8ee172b075 | ||
|
|
1f2f70d301 | ||
|
|
f033ea8244 | ||
|
|
233b301c8f | ||
|
|
5eff6962fe | ||
|
|
4a4c4f94db | ||
|
|
c2bd914e79 | ||
|
|
1e6eb8fd00 | ||
|
|
57855bd8b5 | ||
|
|
c8f65428ff | ||
|
|
159231763d | ||
|
|
43f534e02b | ||
|
|
603bec95b0 | ||
|
|
1e1840028a | ||
|
|
24c203a83f | ||
|
|
d4285494af | ||
|
|
624f0dfd29 | ||
|
|
35151a172f | ||
|
|
58f78c39b4 | ||
|
|
2c3a08232b | ||
|
|
d5da4b3c1e | ||
|
|
ad0d807b2c | ||
|
|
aefd907ec7 | ||
|
|
2572e7ea26 | ||
|
|
b19bc3b426 | ||
|
|
6a20c2faed | ||
|
|
efce62e518 | ||
|
|
11fb7509f4 | ||
|
|
960e8b2c7e | ||
|
|
460642c98c | ||
|
|
e605897cc1 | ||
|
|
4992cc4bad | ||
|
|
7e40208ce7 | ||
|
|
a7c791e61a | ||
|
|
cb49f07b10 | ||
|
|
157658962a | ||
|
|
b9b50ba957 | ||
|
|
ce85bbe8be | ||
|
|
8d8322e009 | ||
|
|
227e76a5ce | ||
|
|
ed3c08cdeb | ||
|
|
256dfafce3 | ||
|
|
256f88a5c5 | ||
|
|
9b81ee6b35 | ||
|
|
fd2ba48189 | ||
|
|
0f65c05f08 | ||
|
|
2cbb8a39ef | ||
|
|
be58666afc | ||
|
|
da8adbd052 | ||
|
|
fd900e27b6 | ||
|
|
97b8a4fd78 | ||
|
|
32c7d50444 |
1220 changed files with 147628 additions and 20272 deletions
75
.gitlab-ci.yml
Normal file
75
.gitlab-ci.yml
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
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 -b successful_set_export_fixed "http://gitlab-ci-token:$ACCESS_TOKEN@git.mfd.msk/mfd/clearing_test.git"
|
||||
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
|
||||
|
|
@ -5,7 +5,7 @@
|
|||
<parent>
|
||||
<artifactId>clearing-parent</artifactId>
|
||||
<groupId>ru.spcex.clearing</groupId>
|
||||
<version>SPCEX-1.0.0.0</version>
|
||||
<version>SPCEX-3.19.244</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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
@ -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)
|
||||
);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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 + "}";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -8,6 +8,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;
|
||||
|
|
@ -31,6 +32,7 @@ import ru.spcex.platform.utils.validation.ValidatorImpl;
|
|||
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
|
|
@ -53,6 +55,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 +129,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 +150,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) {
|
||||
|
|
@ -160,8 +165,49 @@ public class TradingClearingRegistryValidationConfig {
|
|||
Account account = accountImdg.getSingleObjectByID(validatedObject.getMoneyAccountId());
|
||||
if (account == null && validatedObject.getDepoAccountId() != null) account = accountImdg.getSingleObjectByID(validatedObject.getDepoAccountId());
|
||||
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, account.getAccount());
|
||||
// String tcrIds = existTCR.stream().map(tcr -> String.valueOf(tcr.getId())).collect(Collectors.joining(";"));
|
||||
// return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, tcrIds);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static class updateTCRDepoCheck implements IValidationRule<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, depoAccountId);
|
||||
}
|
||||
TradingClearingRegistry updateObject = tcrMap.getSingleObjectByID(validatedObject.getId());
|
||||
if (!Objects.equals(account.getCompanyId(), updateObject.getCompanyId())) {
|
||||
return of(AccountError.AccountNotFound, depoAccountId); // или UserVerifyDenial
|
||||
}
|
||||
|
||||
// Проверка использования счёта в других ТКР
|
||||
ImdgPredicateBuilder pb = tcrMap.predicateBuilder();
|
||||
ImdgPredicate query = pb.and(pb.equals("depoAccountId", validatedObject.getDepoAccountId()),
|
||||
pb.not(pb.equals("id", validatedObject.getId()))
|
||||
);
|
||||
Collection<TradingClearingRegistry> existTCR = tcrMap.getCollectionObjectsByPredicate(query);
|
||||
if (existTCR.isEmpty()) {
|
||||
return empty();
|
||||
} else {
|
||||
if (account == null && validatedObject.getDepoAccountId() != null) account = accountImdg.getSingleObjectByID(validatedObject.getDepoAccountId());
|
||||
return of(AccountError.AccountForTradingClearingRegistryAlreadyUsed, account.getAccount());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -177,6 +223,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 +238,9 @@ public class TradingClearingRegistryValidationConfig {
|
|||
ServiceStatusDictionary.class,
|
||||
AccountError.RequiredFieldEmpty,
|
||||
AccountError.DictionaryNotFound,
|
||||
false)
|
||||
false),
|
||||
|
||||
new updateTCRDepoCheck()
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -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,27 @@ public class TradingClearingRegistryService extends QueueConsumer implements Ini
|
|||
if (req.getMoneyAccountId() != null && !req.getMoneyAccountId().equals(tradingClearingRegistry.getMoneyAccountId())) {
|
||||
return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, "MoneyAccountId", req.getMoneyAccountId());
|
||||
}
|
||||
if (req.getDepoAccountId() != null && !req.getDepoAccountId().equals(tradingClearingRegistry.getDepoAccountId())) {
|
||||
if (tradingClearingRegistry.getDepoAccountId() != null && // но можно с null заменить
|
||||
req.getDepoAccountId() != null && !req.getDepoAccountId().equals(tradingClearingRegistry.getDepoAccountId())) {
|
||||
return requestHelper.makeErrorResponse(userRequest, AccountError.WrongFieldValue, "DepoAccountId", req.getDepoAccountId());
|
||||
}
|
||||
// tradingClearingRegistry.setMoneyAccountId(req.getMoneyAccountId());
|
||||
// tradingClearingRegistry.setDepoAccountId(req.getDepoAccountId());
|
||||
|
||||
|
||||
if (req.getStatus() != null && !Objects.equals(req.getStatus(), tradingClearingRegistry.getStatus())) {
|
||||
if (req.getStatus() != null && !Objects.equals(req.getStatus(), tradingClearingRegistry.getStatus())
|
||||
|| req.getDepoAccountId() != null && !req.getDepoAccountId().equals(tradingClearingRegistry.getDepoAccountId())
|
||||
) {
|
||||
Instant now = Instant.now();
|
||||
tradingClearingRegistry.setUpdated(now);
|
||||
tradingClearingRegistry.setStatus(req.getStatus());
|
||||
tradingClearingRegistry.setDepoAccountId(req.getDepoAccountId());
|
||||
tradingClearingRegistryImdg.update(tradingClearingRegistry);
|
||||
Optional<Tkr> 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 +522,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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -11,7 +11,7 @@
|
|||
<parent>
|
||||
<artifactId>clearing-parent</artifactId>
|
||||
<groupId>ru.spcex.clearing</groupId>
|
||||
<version>SPCEX-1.0.0.0</version>
|
||||
<version>SPCEX-3.19.244</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>
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ public class HistoryConfig {
|
|||
hst.add(excludeLiabilitiesRegister());
|
||||
hst.add(liabilitiesRegister());
|
||||
hst.add(executionRegister());
|
||||
hst.add(session());
|
||||
return hst;
|
||||
}
|
||||
|
||||
|
|
@ -174,4 +175,17 @@ public class HistoryConfig {
|
|||
));
|
||||
return sbscr;
|
||||
}
|
||||
|
||||
|
||||
private HistorySubscription session() {
|
||||
HistorySubscription sbscr = new HistorySubscription();
|
||||
sbscr.setDestination("session");
|
||||
sbscr.setSearchProxyMapName(IMDGDistributedNames.Map_SearchSession);
|
||||
sbscr.setFullHistoryMapName(IMDGDistributedNames.Map_Session);
|
||||
sbscr.setConditions(List.of(
|
||||
new ClearingDateFromCondition(pb),
|
||||
new ClearingDateToCondition(pb)
|
||||
));
|
||||
return sbscr;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -0,0 +1,59 @@
|
|||
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.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.*"));
|
||||
}};
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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"));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
package ru.spcex.clearing.backendapi.controller.test;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import java.util.List;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class RevalMapAction {
|
||||
@ApiModelProperty(
|
||||
value = "мапы для перезагрузки",
|
||||
example = "Map_Registry"
|
||||
)
|
||||
@JsonProperty
|
||||
private List<String> maps;
|
||||
|
||||
public List<String> getMaps() {
|
||||
return maps;
|
||||
}
|
||||
|
||||
public void setMaps(List<String> maps) {
|
||||
this.maps = maps;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
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 java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import com.hazelcast.core.IMap;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
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.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.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
|
||||
import ru.spcex.platform.utils.error.ValidationException;
|
||||
|
||||
@Profile("dev")
|
||||
@Controller
|
||||
@RequestMapping("/anonymous/reval")
|
||||
public class RevalMapController implements InitializingBean {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
private final ImdgProvider imdgProvider;
|
||||
private IMap<Long, String> revalMap;
|
||||
|
||||
@Autowired
|
||||
public RevalMapController(ImdgProvider imdgProvider) {
|
||||
this.imdgProvider = imdgProvider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
imdgProvider.waitAvailable();
|
||||
this.revalMap = ((HazelcastService) imdgProvider).getHazelcast().getMap("REVAL");
|
||||
}
|
||||
|
||||
private final AtomicLong l = new AtomicLong(
|
||||
1L
|
||||
);
|
||||
|
||||
@ApiOperation(value = "Test backend-api availability.")
|
||||
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = String.class)})
|
||||
@RequestMapping(method = RequestMethod.POST, path = "/", produces = MediaType.TEXT_PLAIN_VALUE)
|
||||
@ResponseBody
|
||||
public String processPost(
|
||||
@ApiParam(value = "Параметры команды в JSON формате.", required = true)
|
||||
@RequestBody
|
||||
RevalMapAction revalCommand) throws ClassNotFoundException, ValidationException {
|
||||
log.info("Call test method for backend-api reval maps");
|
||||
List<String> maps = revalCommand.getMaps();
|
||||
if (maps.isEmpty()) {
|
||||
throw new IllegalArgumentException("must be at least one map");
|
||||
}
|
||||
for (String map : maps) {
|
||||
revalMap.put(
|
||||
l.getAndIncrement(),
|
||||
map
|
||||
);
|
||||
}
|
||||
return "success";
|
||||
}
|
||||
}
|
||||
|
|
@ -65,6 +65,7 @@ public class WebSecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
|
|||
.antMatchers("/login").permitAll()
|
||||
.antMatchers("/error").permitAll()
|
||||
.antMatchers("/backend-api-login/**").permitAll()
|
||||
.antMatchers("/spcex.config.js").permitAll()
|
||||
.anyRequest();
|
||||
if (securityDisabled) {
|
||||
anyReq.permitAll();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,24 @@
|
|||
package ru.spcex.clearing.backendapi.security.element;
|
||||
|
||||
public class JsConfigSettings {
|
||||
public final static String SERVER_TITLE_PARAM_NAME = "serverTitle";
|
||||
public final static String IS_CENTRAL_COUNTER_PARTY_PARAM_NAME = "isCentralCounterparty";
|
||||
private String serverTitle;
|
||||
private Boolean centralCounterPartyEnable;
|
||||
|
||||
public String getServerTitle() {
|
||||
return serverTitle;
|
||||
}
|
||||
|
||||
public void setServerTitle(String serverTitle) {
|
||||
this.serverTitle = serverTitle;
|
||||
}
|
||||
|
||||
public Boolean getCentralCounterPartyEnable() {
|
||||
return centralCounterPartyEnable;
|
||||
}
|
||||
|
||||
public void setCentralCounterPartyEnable(Boolean centralCounterPartyEnable) {
|
||||
this.centralCounterPartyEnable = centralCounterPartyEnable;
|
||||
}
|
||||
}
|
||||
|
|
@ -17,9 +17,10 @@ public interface IStateLoader {
|
|||
<T extends SpcexObjectBase> Collection<Map<String, Object>> getAllMetaTransformSpecificClass(String mapName, Class<T> clazz);
|
||||
<T extends SpcexObjectBase> Collection<Map<String, Object>> getAllMetaTransform(String mapName, Class<T> clazz, Map<String, ? extends Comparable<?>> conditions);
|
||||
<T extends SpcexObjectBase> Collection<Map<String, Object>> getAllMetaTransform(String mapName, Class<T> clazz, ImdgPredicate conditions);
|
||||
<T extends SpcexObjectBase> Collection<Map<String, Object>> getAllMetaTransformWithPagination(String mapName, Class<T> clazz, ImdgPredicate conditions, Integer pageSize, Integer pageIndex);
|
||||
<T extends SpcexObjectBase> Collection<Map<String, Object>> getAllMetaTransform(
|
||||
String searchMapName,
|
||||
String mapName,
|
||||
Class<T> clazz,
|
||||
ImdgPredicate conditions);
|
||||
String searchMapName,
|
||||
String mapName,
|
||||
Class<T> clazz,
|
||||
ImdgPredicate conditions);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,11 @@
|
|||
package ru.spcex.clearing.backendapi.service.impl;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
|
@ -10,9 +16,6 @@ import ru.spcex.platform.imdg.api.Imdg;
|
|||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@Service
|
||||
public class StateLoaderImpl implements IStateLoader {
|
||||
private final Map<String, Imdg<?>> allImdgMaps;
|
||||
|
|
@ -73,6 +76,13 @@ public class StateLoaderImpl implements IStateLoader {
|
|||
return responseFactory.responseFromObjectCollection(all);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends SpcexObjectBase> Collection<Map<String, Object>> getAllMetaTransformWithPagination(String mapName, Class<T> clazz, ImdgPredicate conditions, Integer pageSize, Integer pageIndex) {
|
||||
Imdg<T> imdg = getImdg(mapName, clazz);
|
||||
Collection<T> all = imdg.getCollectionObjectsByPredicateWithPaging(conditions, pageSize, pageIndex);
|
||||
return responseFactory.responseFromObjectCollection(all);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private <T extends SpcexObjectBase> Imdg<T> getImdg(String mapName, Class<T> clazz) {
|
||||
return (Imdg<T>) allImdgMaps.computeIfAbsent(mapName, (mapName1) -> imdgProvider.getImdg(mapName, clazz));
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue